void CApp::OnLoop()
{
	CFPS::FPSControl.OnLoop();
	
	for(int i=0; i<CEntity::EntityList.size(); i++)
	{
		if(!CEntity::EntityList[i]) continue;

		CEntity::EntityList[i]->OnLoop();
	}

	// handle collision events
	for(int i=0; i<CEntityCol::entityColList.size(); i++)
	{
		CEntity* entityA = CEntityCol::entityColList[i].entityA;
		CEntity* entityB = CEntityCol::entityColList[i].entityB;

		if(entityA == NULL || entityB == NULL) continue;

		// call 2nd only if desired (timesaving)
		if(entityA->OnCollision(entityB))
			entityB->OnCollision(entityA);
	}
	CEntityCol::entityColList.clear();
}
void CAppStateGame::OnLoop() {
    for(int i = 0;i < CEntity::EntityList.size();i++) {
        if(!CEntity::EntityList[i]) continue;

        CEntity::EntityList[i]->OnLoop();

        if (CEntity::EntityList[i]->Type == ENTITY_TYPE_ENEMY) {
            if(!Player.Dead) {
                CEntity::EntityList[i]->Shoot(Player.X + (Player.Width / 2),Player.Y + (Player.Height / 2));
            }
        }
    }

    //Collision Events
    for(int i = 0;i < CEntityCol::EntityColList.size();i++) {
        CEntity* EntityA = CEntityCol::EntityColList[i].EntityA;
        CEntity* EntityB = CEntityCol::EntityColList[i].EntityB;

        if(EntityA == NULL || EntityB == NULL) continue;

        if(EntityA->Dead == true || EntityB->Dead == true) continue;

        if(EntityA->OnCollision(EntityB)) {
            EntityB->OnCollision(EntityA);
        }
    }

    CEntityCol::EntityColList.clear();

    if (Player.Dead) {
        WinMessage.boolMessage = false;
        CAppStateManager::SendMessage(APPSTATE_END, &WinMessage);
        CAppStateManager::SetActiveAppState(APPSTATE_END);
    }
 //   if (Archer.Dead) {
 //      WinMessage.boolMessage = true;
 //       CAppStateManager::SendMessage(APPSTATE_END,&WinMessage);
 //       CAppStateManager::SetActiveAppState(APPSTATE_END);
 //   }
    if(Player.Money > 0) {
        WinMessage.boolMessage = true;
        CAppStateManager::SendMessage(APPSTATE_END,&WinMessage);
        CAppStateManager::SetActiveAppState(APPSTATE_END);
    }
        for(std::vector<CEntity*>::iterator it = CEntity::EntityList.begin(); it != CEntity::EntityList.end();) {
        if(!(*it)) continue;
        if((*it)->Dead == true) {
                (*it)->OnCleanup();
                delete (*it);
                it = CEntity::EntityList.erase(it);
        }
        else {
                it++;
        }
    }

    char Buffer[255];
    sprintf(Buffer,"Player Health: %d  |||  Enemy Health: %d ||| Money: %d", Player.Health, Archer.Health, Player.Money);
    SDL_WM_SetCaption(Buffer,Buffer);
}
void CGame::Loop() 
{    
    // Run any Managed Events
    CEventsManager::EventsManager.Loop();
    
    // Run each item in entity list
    int size = CEntity::EntityList.size();
  
    for (int i = 0; i < size; i++) 
    {        
        if(!CEntity::EntityList[i]) continue;        
        CEntity::EntityList[i]->Loop();              
    }
  
    //Collision Events
    for(std::vector<CEntityCollision>::iterator it = CEntityCollision::EntityCollisionList.begin();it != CEntityCollision::EntityCollisionList.end(); ++it) 
    {
        if (it->Complete == false)
        {
            CEntity* EntityA = it->EntityA;
            CEntity* EntityB = it->EntityB;

            if(EntityA == NULL || EntityB == NULL) continue;

            if(EntityA->OnCollision(EntityB))
                EntityB->OnCollision(EntityA);

            // Remove this and it's pair from the list by marking them as Complete
            it->RemoveCollision(EntityA, EntityB);
        }
    }

    CEntityCollision::EntityCollisionList.clear();

    // Handle scoring & Timing
    CAreaScoring::AreaScoring.Loop();
    
    CLevel::Level.GetCurrentArea()->Loop();
   
    // Give some CPU back
    SDL_Delay(1);
}
//-----------------------------------------------------------------------------
void CAppStateGame::OnLoop() {

	if( GameOver ) {
		if( !Input.HasFocus() ) {
			if( Input.State == UI_NORMAL ) {
				CHighScores HighScore;
				HighScore.OnInit();
				HighScore.Add(Input.GetValue(),Player->Points);
			}
			GameOver = false;
			CAppStateManager::SetActiveAppState(NextState);

			CSoundBank::SoundControl.Play(CSoundBank::MUSIC, "MenuMusic");

		}
		return;
	}

	//If the level should change
	//if( CCamera::CameraControl.GetX() >= LevelEndingPoint ) {
	//	OnLevelChange();
	//}

	// Spawn new entities
	//else if( LevelInfoIndex < Level.size() && 
	if( LevelInfoIndex < Level.size() &&
		(unsigned int)CCamera::CameraControl.GetX() >= Level.at(LevelInfoIndex).ActiveXPosition) {

		CAppStateGame::LevelInfo TmpInfo = Level.at(LevelInfoIndex);

		switch(TmpInfo.Type) { 
			case ENTITY_TYPE_ENEMY:
				debug("creating enemy of type: " + IntToString(TmpInfo.SubType));
				CFactory::Factory.CreateEnemy(TmpInfo.SubType, CCamera::CameraControl.GetX()+1000, TmpInfo.YPosition);
				break;
			case ENTITY_TYPE_ITEM:
				CFactory::Factory.CreateItem(TmpInfo.SubType, CCamera::CameraControl.GetX()+1000, TmpInfo.YPosition);
				break;
			case ENTITY_TYPE_SPECIAL_EFFECT:
				// NOTE: y-position is now indicating the ms duration for the slowmo effect

				if (TmpInfo.SubType == ENTITY_SUBTYPE_SPECIAL_EFFECT_SLOWMO_2X) {
					CFactory::Factory.CreateSlowMotion(LEVEL_SLOWMO_2X, TmpInfo.YPosition);
				}
				else if (TmpInfo.SubType == ENTITY_SUBTYPE_SPECIAL_EFFECT_SLOWMO_4X) {
					CFactory::Factory.CreateSlowMotion(LEVEL_SLOWMO_4X, TmpInfo.YPosition);
				}
				else if (TmpInfo.SubType == ENTITY_SUBTYPE_SPECIAL_EFFECT_SLOWMO_8X) {
					CFactory::Factory.CreateSlowMotion(LEVEL_SLOWMO_8X, TmpInfo.YPosition);
				}
				break;
			default:
				break;
		}

		LevelInfoIndex++;
	}

    //--------------------------------------------------------------------------
    // Entities
    //--------------------------------------------------------------------------
    for(unsigned int i = 0;i < CEntity::EntityList.size();i++) {
        if(!CEntity::EntityList[i]) continue;

        CEntity::EntityList[i]->OnLoop();
    }

    //Collision Events
    for(unsigned int i = 0;i < CEntityCol::EntityColList.size();i++) {
        CEntity* EntityA = CEntityCol::EntityColList[i].EntityA;
        CEntity* EntityB = CEntityCol::EntityColList[i].EntityB;

        if(EntityA == NULL || EntityB == NULL) continue;

		/* Pixel precise collision detection */

		// Create rectangle of the possible collision area
		SDL_Rect collisionRect = CEntity::Intersection(EntityA->GetBounds(), EntityB->GetBounds());
		
		// Check if there is even a possible collision
		if(collisionRect.w != 0 && collisionRect.h != 0 ) {
			// Check if there is/are actual pixel overlapping between
			// both entities. If there is...
			if(CEntity::CheckCollision(EntityA, EntityB)) {
				// Let both entities know of the collision
				EntityA->OnCollision(EntityB);
				EntityB->OnCollision(EntityA);
			}
		}
    }

    CEntityCol::EntityColList.clear();

	// Camera movement:
	// Make camera move wanted amount of pixels per second to right
	float moveX = CCamera::CameraControl.speed * CFPS::FPSControl.GetSpeedFactor();

	// If we are not in the boss area
	if ( (CCamera::CameraControl.GetX() + (int)moveX) < LEVEL_LENGTH) {
		CCamera::CameraControl.OnMove(moveX, static_cast<float>(CCamera::CameraControl.GetY()));
	
		// Update BG offset
		BG_offset = BG_offset - BG_SPEED * CFPS::FPSControl.GetSpeedFactor();
		if( BG_offset <= 0 ) {
			BG_offset = BG_WIDTH;
		}
	}
	// When we come to the boss map of the level area
	else {
		CCamera::CameraControl.SetPos(LEVEL_LENGTH, CCamera::CameraControl.GetY());
		CCamera::CameraControl.speed = 0;
		BossFightOn = true;
	}
	

	if (ResetCurrentLevel) {
		ResetLevel();
	}
	else if (BossFightOn && BossDead) {
		OnLevelChange();
	}
}
Exemple #5
0
//==============================================================================
void CApp::OnLoop() {
	count++;
	if (count == 5) {
		Samus.X = 50;
		Samus.Y = 50;
		Simon.X = 50;
		Simon.Y = 50;
		OnPosReset();	
	}	
	
    //--------------------------------------------------------------------------
    // Entities
    //--------------------------------------------------------------------------
    for(int i = 0;i < CEntity::EntityList.size();i++) {
        if(!CEntity::EntityList[i]) continue;

        CEntity::EntityList[i]->OnLoop();//call the loop function of each entity
    }

	//loop through all collision incidents
    for(int i = 0;i < CEntityCol::EntityColList.size();i++) {
       CEntity* EntityA = CEntityCol::EntityColList[i].EntityA;//load first entity
       CEntity* EntityB = CEntityCol::EntityColList[i].EntityB;//load second entity
 
       if(EntityA == NULL || EntityB == NULL) continue;//if there were no entitys colided with then keep going
 
       if(EntityA->OnCollision(EntityB)) {//load oncollision for entity A with b
           EntityB->OnCollision(EntityA);//load onCollision for entity b with a
       }
    }
 
    CEntityCol::EntityColList.clear();//clear the collision list

    CFPS::FPSControl.OnLoop();//loop to check the frames per second

    char Buffer[255];
    sprintf(Buffer, "%d", CFPS::FPSControl.GetFPS());
    SDL_WM_SetCaption(Buffer, Buffer);// set the caption of game


	if(metroid) {//if we are playing samus update the appropriate enemys on her current position
		//skeleton player tracking
		Alpha.playerPos = Samus.X;
		Alpha.yPlayerPos= Samus.Y;
		Bravo.playerPos = Samus.X;
		Bravo.yPlayerPos = Samus.Y;
		Charlie.playerPos = Samus.X;
		Charlie.yPlayerPos= Samus.Y;
		Delta.playerPos = Samus.X;
		Delta.yPlayerPos= Samus.Y;
		Echo.playerPos = Samus.X;
		Echo.yPlayerPos= Samus.Y;
		Foxtrot.playerPos = Samus.X;
		Foxtrot.yPlayerPos= Samus.Y;
		Golf.playerPos = Samus.X;
		Golf.yPlayerPos= Samus.Y;
		Hotel.playerPos = Samus.X;
		Hotel.yPlayerPos= Samus.Y;
		India.playerPos = Samus.X;
		India.yPlayerPos= Samus.Y;
		//dog player tracking
		Ramza.playerPos = Samus.X;
		Ramza.yPlayerPos= Samus.Y;
		Firion.playerPos = Samus.X;
		Firion.yPlayerPos = Samus.Y;
		Luneth.playerPos = Samus.X;
		Luneth.yPlayerPos= Samus.Y;
		Cecil.playerPos = Samus.X;
		Cecil.yPlayerPos= Samus.Y;
		Bartz.playerPos = Samus.X;
		Bartz.yPlayerPos= Samus.Y;
		Terra.playerPos = Samus.X;
		Terra.yPlayerPos= Samus.Y;
		Cloud.playerPos = Samus.X;
		Cloud.yPlayerPos= Samus.Y;
		Squall.playerPos = Samus.X;
		Squall.yPlayerPos= Samus.Y;
		Zidane.playerPos = Samus.X;
		Zidane.yPlayerPos= Samus.Y;
		Tidus.playerPos = Samus.X;
		Tidus.yPlayerPos= Samus.Y;
		Mog.playerPos = Samus.X;
		Mog.yPlayerPos = Samus.Y;
		Vaan.playerPos = Samus.X;
		Vaan.yPlayerPos = Samus.Y;
		Lightning.playerPos = Samus.X;
		Lightning.yPlayerPos= Samus.Y;

		if(Samus.Dead==true) {//if she is dead
			OnGameOver();//run onGameOver
		}
	}	
		
	if(castlevania) {//if we are playing simon update the appropriate enemys on his current position
		//skeleton player tracking
		Alpha.playerPos = Simon.X;
		Alpha.yPlayerPos= Simon.Y;
		Bravo.playerPos = Simon.X;
		Bravo.yPlayerPos = Simon.Y;
		Charlie.playerPos = Simon.X;
		Charlie.yPlayerPos= Simon.Y;
		Delta.playerPos = Simon.X;
		Delta.yPlayerPos= Simon.Y;
		Echo.playerPos = Simon.X;
		Echo.yPlayerPos= Simon.Y;
		Foxtrot.playerPos = Simon.X;
		Foxtrot.yPlayerPos= Simon.Y;
		Golf.playerPos = Simon.X;
		Golf.yPlayerPos= Simon.Y;
		Hotel.playerPos = Simon.X;
		Hotel.yPlayerPos= Simon.Y;
		India.playerPos = Simon.X;
		India.yPlayerPos= Simon.Y;
		//dog player tracking
		Ramza.playerPos = Simon.X;
		Ramza.yPlayerPos= Simon.Y;
		Firion.playerPos = Simon.X;
		Firion.yPlayerPos = Simon.Y;
		Luneth.playerPos = Simon.X;
		Luneth.yPlayerPos= Simon.Y;
		Cecil.playerPos = Simon.X;
		Cecil.yPlayerPos= Simon.Y;
		Bartz.playerPos = Simon.X;
		Bartz.yPlayerPos= Simon.Y;
		Terra.playerPos = Simon.X;
		Terra.yPlayerPos= Simon.Y;
		Cloud.playerPos = Simon.X;
		Cloud.yPlayerPos= Simon.Y;
		Squall.playerPos = Simon.X;
		Squall.yPlayerPos= Simon.Y;
		Zidane.playerPos = Simon.X;
		Zidane.yPlayerPos= Simon.Y;
		Tidus.playerPos = Simon.X;
		Tidus.yPlayerPos= Simon.Y;
		Mog.playerPos = Simon.X;
		Mog.yPlayerPos = Simon.Y;
		Vaan.playerPos = Simon.X;
		Vaan.yPlayerPos = Simon.Y;
		Lightning.playerPos = Simon.X;
		Lightning.yPlayerPos= Simon.Y;
		
		if(Simon.Dead==true) {//if he is dead
			OnGameOver();//run onGameOver
		}
		if(Simon.Attack && Simon.AttackTimer > 30 && Simon.AttackTimer <= 90 && Simon.PointUp) {//if simon has been attacking for 30 cycles already and is pointing up
			CWhip* VerticalWhip = new CWhip;//declare a new verticalwhip entity
			VerticalWhip->OnLoad("./images/VerticalWhip.png", 6, 52, 2);//load its image
			if(Simon.faceRight) {//if hes facing to the right make the whip appear in the appropriate spot in relation to simon
				VerticalWhip->X = Simon.X + 19;
				VerticalWhip->Y = Simon.Y - 52;
				VerticalWhip->CurrentFrameCol = 0;
			}
			if(Simon.faceLeft) {//if hes facing left find the right spot
				VerticalWhip->X = Simon.X + 6;
				VerticalWhip->Y = Simon.Y - 52;
				VerticalWhip->CurrentFrameCol = 1;
			}
			CEntity::EntityList.push_back(VerticalWhip);//push the whip into the entity list
		}
		else if(Simon.Attack && Simon.AttackTimer > 60 && Simon.AttackTimer <= 90 && !Simon.PointUp) {//if simon has been attacking for 60 cycles already and is not pointin up
			CWhip* HorizontalWhip = new CWhip;//declare a new horizontalwhip entity
			HorizontalWhip->OnLoad("./images/HorizontalWhip.png", 50, 5, 2);//load the image
			if(Simon.faceRight) {//if simon is facing to the right make it appear in the correct spot
				HorizontalWhip->X = Simon.X + 30;
				HorizontalWhip->Y = Simon.Y + 15;
				HorizontalWhip->CurrentFrameCol = 0;
			}
			if(Simon.faceLeft) {//if simon is facing to the left make it appear in the correct spot
				HorizontalWhip->X = Simon.X - 50;
				HorizontalWhip->Y = Simon.Y + 15;
				HorizontalWhip->CurrentFrameCol = 1;
			}
			CEntity::EntityList.push_back(HorizontalWhip);//push the entity into the list
		}
			
	}

	std::vector<CEntity*>::iterator i;//declare an iterator of type centity pointer
	enemyCounter = 0;//reset the counter so that we can count the number of enemys again
	for(i = CEntity::EntityList.begin(); i != CEntity::EntityList.end(); i++){
		if(((*i)->Type == ENTITY_TYPE_DOG) || ((*i)->Type == ENTITY_TYPE_INSECT) || ((*i)->Type == ENTITY_TYPE_SKELETON)){//if the entity is a killable enemy, increment the counter
			enemyCounter++;
		}
		if(((*i)->Type == ENTITY_TYPE_BULLET) && ((*i)->Dead == true)){//if the entity is of type bullet and its "dead"
			CExplode* expl = new CExplode;//declare a new entity of type explode
			expl->OnLoad("images/ShotDeath.png",34,34,0);//load the image of a shot "dieing"
			expl->X = (*i)->X-12;//find the proper coordinants of the explosion
			expl->Y = (*i)->Y-12;
			expl->fm = 7;
			expl->cyclelimit = 160;
			delete(*i);//delete the bullet
			if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//remove it from the list
			if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back();
			CEntity::EntityList.push_back(expl); //pushes back the explosion after deleting the bullet
		}

		if(((*i)->Type == ENTITY_TYPE_INSECT) && ((*i)->Dead == true)){//if the entity is of type insect and its dead
			(*i)->OnCleanup();//clean it up
			CExplode* bug = new CExplode;//declare a new entity of type explode (its our death class)
			bug->OnLoad("images/InsectDeath.png",60,50,0);//load the image of insect death
			bug->X = (*i)->X;//find the proper coordinants of the insect
			bug->Y = (*i)->Y;
			bug->fm = 4;
			bug->cyclelimit = 160;
			if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop the insect out
			if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back();
			CEntity::EntityList.push_back(bug); //push back the bug
		}
		if(((*i)->Type == ENTITY_TYPE_SKELETON) && ((*i)->Dead == true)){//if the entity is of type skeleton and its dead
			CExplode* bones = new CExplode;//declare its death entity
			bones->OnLoad("images/SkeletonDeath.png",30,52,0);//load its death image
			bones->X = (*i)->X;//update location
			bones->Y = (*i)->Y;
			bones->fm = 7;
			bones->cyclelimit = 200;
			(*i)->OnCleanup();//clean up skeleton
			if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop skeleton out of list
			if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back();
			CEntity::EntityList.push_back(bones); //push back the skeleton death
		}
		
		if (((*i)->Type == ENTITY_TYPE_DOG) && ((*i)->Dead == true)) {//if entity is of type dog and its dead
			CExplode* mutt = new CExplode;//declare its death entity
			mutt->OnLoad("images/DogDeath.png",35,25,0);//load its death image
			mutt->X = (*i)->X;//update its position
			mutt->Y = (*i)->Y;
			mutt->fm = 7;
			mutt->cyclelimit = 200;
			(*i)->OnCleanup();//clean it up
			if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop the dog out
			if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back();
			CEntity::EntityList.push_back(mutt);//push back dog death
		}
		if(((*i)->Type == ENTITY_TYPE_WHIP) && ((Simon.AttackTimer <= 60 && !Simon.PointUp) || (Simon.AttackTimer <= 30 && Simon.PointUp))){//if simon is not facing up and has been attacking less then 60 cycles or if he is facing up and has been attacking for less then 30 cycles
			delete(*i);//delete it
			if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop it out
			if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back();
		}
		
		
		if(((*i)->Type == ENTITY_TYPE_BOMB) && ((*i)->Dead == true)){ //delete the bomb pointers
			delete(*i);//delete it
			if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--); //pop it out of list
			if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back();
		}
	}
	if (enemyCounter == 0) {//if all enemys are death go to the victory screen after a short delay
		waitingCounter++;
		if (waitingCounter > 500) OnVictory();
	}	
}