The Game Engine  1
Level.cpp
Go to the documentation of this file.
1 #include "Level.h"
2 #include "Game.h"
3 #include "Text.h"
4 #include "fns.h"
5 #include "Collision.h"
6 #include <GL/gl.h>
7 #include <algorithm>
8 
9 
10 Level::Level(string n, Condition winCond, Behavior loadBehave, Behavior updateBehave, Behavior endBehave, Behavior pBehave) : mName(n), mBackground(NULL), mWorldObjects(), mSprites(), Loaded(false), ToAdd(), ToRemove(), mMenus(), mMaxNumPlayers(2)
11 {
13  mInitialBehavior = loadBehave;
14  mMainBehavior = updateBehave;
15  mUnloadBehavior = endBehave;
16  mPauseBehavior = pBehave;
17  mWinCondition = winCond;
18 }
19 
21 {
22  for (size_t i = 0; i < mWorldObjects.size(); ++i) {
23  delete mWorldObjects[i];
24  }
25 }
26 
28 {
29  glLoadIdentity();
31  glClear(GL_COLOR_BUFFER_BIT);
32  if (!Game::game()->Paused)
33  {
35  if(mBackground!=NULL)
36  mBackground->draw();
37 
38  for(unsigned int i=0,size=mWorldObjects.size();i<size;++i){
39  mWorldObjects[i]->draw();
40  }
41  }
42 
44  DrawMenus();
45 
48 }
49 
51 {
52  //go through all our menus and try to draw them (they'll only draw if active)
53  //revert to default texture
54  glBindTexture(GL_TEXTURE_2D, 0);
55 }
56 
58 {
59  if(Game::game()->ShowCollisions) {
61  for (size_t i=0; i<mWorldObjects.size(); ++i) {
62  mWorldObjects[i]->drawCollisions();
63  }
64  }
65 }
66 
67 void Level::LoadBG(std::string name)
68 {
69  mBackground->load(name);
70 }
71 
72 void Level::postEvent(SDL_Event event)
73 {
75 }
76 
78 void Level::update() {
79  if (Loaded)
80  {
81  if(!Game::game()->Focused)
82  SDL_Delay(1000);
83  if (!Game::game()->Paused)
84  {
85  //clear collisions
87  //sort worldObjects
88  sort(mWorldObjects.begin(),mWorldObjects.end(),[](WorldObject *a, WorldObject *b) { return *a < *b; });
89 
90  if(mMainBehavior)
91  mMainBehavior();
92 
93  if (mWinCondition())
94  {
95  unload();
96  return;
97  }
98  for(unsigned int i=0, size = mWorldObjects.size(); i<size; i++) {
99  mWorldObjects[i]->update();
100  }
101 
102  for(unsigned int i=0, size = mWorldObjects.size(); i<size; i++) {
103  mWorldObjects[i]->runBehavior();
104  }
105  for(unsigned int i=0, size = ToRemove.size(); i<size; i++) {
106  // Try to remove from mWorldObjects,
107  // if failed see if it's currently pending add
108  bool removed=false;
109  foritr(ptr, mWorldObjects) {
110  if(*ptr == ToRemove[i]) {
111  delete *ptr;
112  mWorldObjects.erase(ptr);
113  removed=true;
114  break;
115  }
116  }
117  if(removed) {
118  WorldObject* w = ToRemove[i];
119  switch(w->getType())
120  {
121  case WorldObject::SPRITE:
122  foritr(ptr, mSprites) {
123  if(*ptr == w) {
124  mSprites.erase(ptr);
125  removed=true;
126  break;
127  }
128  }
129  break;
131  foritr(ptr, mParticleSystems) {
132  if(*ptr == w) {
133  mParticleSystems.erase(ptr);
134  removed=true;
135  break;
136  }
137  }
138  break;
139  case WorldObject::MENU:
141  break;
142  default:
143  break;
144  }
145  } else{
146  foritr(ptr, ToAdd) {
147  if(*ptr == ToRemove[i]) {
148  ToAdd.erase(ptr);
149  break;
150  }
151  }
152  }
153  }
154  ToRemove.clear();
155  for(unsigned int i=0, size = ToAdd.size(); i<size; i++) {
156  WorldObject* w = ToAdd[i];
157  mWorldObjects.push_back(w);
158  switch(w->getType())
159  {
160  case WorldObject::SPRITE:
161  mSprites.push_back((Sprite*)w);
162  break;
163  case WorldObject::MENU:
165  break;
167  mParticleSystems.push_back((ParticleSystem*)w);
168  break;
169  default:
170  cout<<"BAD BAD BAD "<<w->getType()<<" REMOVED"<<endl;
171  break;
172  }
173  }
174  ToAdd.clear();
178  /*CollisionObject.Update();
179  foreach (WorldObject sp in mWorldObjects)
180  {
181  sp.DoCollisions();
182  }*/
183  }
184  else {
186  //Generic pause menu update function
187  if(mPauseBehavior)
188  mPauseBehavior();
189  }
190  }
191  else {
193  }
194 }
195 
196 void Level::load() {
197  clearData();
198  if(mInitialBehavior)
200 
202 
203  //inint num of players
204  unsigned int maxNumPlayers = getMaxNumPlayers();
205  if(getNumPlayers() > maxNumPlayers){
206  removePlayers(maxNumPlayers-getNumPlayers());
207  }
208 
209  Loaded = true;
210 }
211 
213  if(mUnloadBehavior)
214  mUnloadBehavior();
215  clearData();
216  Loaded = false;
217 }
218 
221 
222  //clear WorldObjects
223  for(unsigned int i=0,size=mWorldObjects.size(); i<size; i++) {
224  delete mWorldObjects[i];
225  }
226  mWorldObjects.clear();
227  mSprites.clear();
228 
229  // clear collision data
231 }
232 
234  ToAdd.push_back(o);
235 }
236 
238  ToRemove.push_back(o);
239 }
240 
241 void Level::removeAllSprites(string s) {
242  vector<Sprite*> vec = findSprites(s);
243  foritr(sp,vec){
244  ToRemove.push_back(*sp);
245  }
246 }
247 
248 
250  vector<ParticleSystem*> vec = findParticleSystems(s);
251  foritr(ps,vec){
252  ToRemove.push_back(*ps);
253  }
254 }
255 
256 Sprite* Level::findSprite(string name) {
257  for(unsigned int i=0, count=mSprites.size(); i < count; i++) {
258  if(mSprites[i]->getName()==name) {
259  return mSprites[i];
260  }
261  }
262  return NULL;
263 }
264 
265 vector<Sprite*> Level::findSprites(string name, int count) {
266  vector<Sprite*> retvals = vector<Sprite*>();
267  for(unsigned int i=0, size = mSprites.size(); i < size; i++) {
268  if(count>0 && retvals.size()==count)
269  return retvals;
270  if(mSprites[i]->getName()==name)//find the sprite with the same name
271  retvals.push_back(mSprites[i]);
272  }
273  return retvals;//if a sprite wasn't found return empty
274 }
275 
277  for(unsigned int i=0, count=mParticleSystems.size(); i < count; i++) {
278  if(mParticleSystems[i]->getName()==name) {
279  return mParticleSystems[i];
280  }
281  }
282  return NULL;
283 }
284 
285 vector<ParticleSystem*> Level::findParticleSystems(string name, int count) {
286  vector<ParticleSystem*> retvals = vector<ParticleSystem*>();
287  for(unsigned int i=0; i < mParticleSystems.size(); i++) {
288  if(count>0 && retvals.size()==count)
289  return retvals;
290  if(mParticleSystems[i]->getName()==name)//find the ParticleSystem with the same name
291  retvals.push_back(mParticleSystems[i]);
292  }
293  return retvals;//if a ParticleSystem wasn't found return empty
294 }
295 
296 unsigned int Level::getNumPlayers(){
297  return mPlayers.size();
298 }
299 
300 
301 unsigned int Level::getMaxNumPlayers(){
302  return mMaxNumPlayers;
303 }
304 
305 void Level::setMaxNumPlayers(unsigned int i){
306  mMaxNumPlayers=i;
307 }
308 
310  return index < mPlayers.size() ? mPlayers[index] : NULL;
311 }
312 
315  {
316  mPlayers.push_back(p);
317  return true;
318  }
319  return false;
320 }
321 
323  foritr(player, mPlayers){
324  if(*player == p){
325  mPlayers.erase(player);
326  return true;
327  }
328  }
329  return false;
330 }
331 
332 int Level::removePlayers(int count){
333  unsigned int size = mPlayers.size();
334  try{
335  mPlayers.erase(mPlayers.begin()+size-count, mPlayers.end());
336  }
337  catch(exception e){
338  cout<<e.what()<<endl;
339  }
340  return size - mPlayers.size();
341 }