Пример #1
0
void Game::CheckCollision() {

	// TODO all X and Y coords to absolute (level) values as opposed to screen values refactor this
	std::map<std::pair<int, int>, Entity*>* entities = level->getEntities();
	for (std::map<std::pair<int, int>, Entity*>::iterator i = entities->begin(); i != entities->end(); i++) {
		Entity* entity = i->second;
		Platform* p = dynamic_cast<Platform*>(entity);

		int levelBlockX = i->first.second;
		int levelBlockY = i->first.first;
		
		if (p != NULL && p->getState() == dislodged) {
			p->setYOffset(p->getYOffset() + 5); //TODO needs to be a variable

			int currentLevelBlockX = levelBlockX;
			int currentLevelBlockY = levelBlockY + (p->getYOffset() + 50) / Level::BLOCK_HEIGHT_PX;

			if (level->getLevelCodeByBlock(currentLevelBlockX, currentLevelBlockY) == '_') {
				p->setState(broken);
				level->setLevelCodeByBlock(currentLevelBlockX,currentLevelBlockY, '$');
				level->setLevelCodeByBlock(levelBlockX, levelBlockY, ' ');
			}
			else {
				p->setY(int(p->getY() + 5) % (Level::BLOCK_HEIGHT_PX * Level::SCENE_HEIGHT_BLK));
				//p->setY((levelBlockY - level->getSceneY()) * Level::BLOCK_HEIGHT_PX + p->getYOffset() - p->getAnim()->getSheet()->getFrameHeight());

				if (!level->inScene(levelBlockX, levelBlockY) && level->inScene(currentLevelBlockX, currentLevelBlockY)) {
					p->Animate(&graphics);
				}
			}
		}	
	}


	collision->CheckPrinceCollision(prince);
	CheckCombatCollision();
}