예제 #1
0
void EnemyZone::AddEnemy(EnemySprite* enemy, MapMode* map, uint8 count) {
	if (count == 0) {
		IF_PRINT_WARNING(MAP_DEBUG) << "function called with a zero value count argument" << endl;
		return;
	}

	// Prepare the first enemy
	enemy->SetZone(this);
	// TODO: use proper layer ID instead of the default
	map->GetObjectSupervisor()->AddObject(enemy, DEFAULT_LAYER_ID);
	_enemies.push_back(enemy);

	// Create any additional copies of the enemy and add them as well
	for (uint8 i = 1; i < count; i++) {
		EnemySprite* copy = new EnemySprite(*enemy);
		copy->SetObjectID(map->GetObjectSupervisor()->GenerateObjectID());
		// Add a 10% random margin of error to make enemies look less synchronized
		copy->SetDirectionChangeTime(static_cast<uint32>(copy->GetDirectionChangeTime() * (1 + RandomFloat() * 10)));
		copy->Reset();

		// TODO: use proper layer ID instead of the default
		map->GetObjectSupervisor()->AddObject(copy, DEFAULT_LAYER_ID);
		_enemies.push_back(copy);
	}
}
예제 #2
0
bool GameLayer::enemyCollisionPlane() {
	Sprite* pPlane = (Sprite*) planeLayer->getChildByTag(AIRPLANE);
	for (auto& eEnemy : enemyLayer->vecEnemy) {
		EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;
		if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())
				&& pEnemySprite->getLife() > 0) {
//			this->unscheduleAllSelectors();
			//	this->bulletLayer->StopBulletShoot();
			//	this->planeLayer->blowUp();
			return true;
		}
	}

	return false;
}
예제 #3
0
bool GameLayer::bulletCollisionEnemy(Sprite* pBullet) {
	for (auto& eEnemy : enemyLayer->vecEnemy) {
		EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;
		if (pBullet->boundingBox().intersectsRect(
				pEnemySprite->getBoundingBox())) {
			if (1 == pEnemySprite->getLife()) {
				pEnemySprite->loseLife();
				enemyLayer->blowupEnemy(pEnemySprite);
			} else {
				pEnemySprite->loseLife();
			}
			bulletSprite->removeBullet(pBullet);
			return true;
		}
	}
	return false;
}
예제 #4
0
bool GameScene::enemyCollisionPlane() {
	Sprite* pPlane = (Sprite*) planeLayer->getChildByTag(AIRPLANE);
	for (auto& eEnemy : enemyLayer->vecEnemy) {
		EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;
		if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())
            && pEnemySprite->getLife() > 0) {
			bulletSprite->stopBulletShoot();    //  停止发射子弹
			planeLayer->blowUp();   //  飞机爆炸,停止触摸事件和碰撞检测
            enemyLayer->blowupEnemy(pEnemySprite);  //  敌机爆炸
            this->unscheduleAllSelectors();     //  停止背景滚动
            enemyLayer->stopAll();      //  停止生成敌机
			return true;
		}
	}
    
	return false;
}
예제 #5
0
bool GameScene::bulletCollisionEnemy(Sprite* pBullet) {
	for (auto& eEnemy : enemyLayer->vecEnemy) {
		EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;
		if (pBullet->boundingBox().intersectsRect(
                                                  pEnemySprite->getBoundingBox())) {
			if (1 == pEnemySprite->getLife()) {
                SimpleAudioEngine::getInstance()->playEffect("sound/get_bomb.mp3");
				pEnemySprite->loseLife();
				enemyLayer->blowupEnemy(pEnemySprite);
			} else {
				pEnemySprite->loseLife();
			}
			bulletSprite->removeBullet(pBullet);
			return true;
		}
	}
	return false;
}
void GameEngine::deleteSpawns(int laps)
{
	std::vector<EnemySpawn*> spawnsToBeRemoved;

	for (size_t i = 0; i < enemySpawnVec.size(); i++) {
		if ((laps - enemySpawnVec.at(i)->startSpawnFrame) % ticks == 0) {
			EnemySprite* enemyToSpawn = enemySpawnVec.at(i)->theEnemy;
			EnemyBehaviour* eb = new EnemyBehaviour(*enemyToSpawn->getBehaviour());
			spriteVec.push_back(EnemySprite::getInstance(this, enemyToSpawn->getDefaultX(), enemyToSpawn->getDefaultY(), enemyToSpawn->getDefaultW(), enemyToSpawn->getDefaultH(), enemyToSpawn->getTextureFilePath(), eb));
			enemySpawnVec.at(i)->amountSpawned++;
			if (enemySpawnVec.at(i)->amountSpawned >= enemySpawnVec.at(i)->numberInWave) {
				enemySpawnVec.at(i)->shouldNotExist = true;
				spawnsToBeRemoved.push_back(enemySpawnVec.at(i));
			}
		}
	}
	auto iter = std::remove_if(enemySpawnVec.begin(), enemySpawnVec.end(), spawnShouldNotExist);
	if (iter != enemySpawnVec.end()) {
		enemySpawnVec.erase(iter, enemySpawnVec.end());
		for_each(spawnsToBeRemoved.begin(), spawnsToBeRemoved.end(), killSpawn);
		spawnsToBeRemoved.clear();
	}
}
예제 #7
0
void EnemyLayer::addEnemy1(float dt) {
	EnemySprite *pEnemySprite = EnemySprite::create();
	pEnemySprite->setEnemyByType(Enemy1);
	pEnemySprite->setTag(Enemy1);
	this->addChild(pEnemySprite);
	vecEnemy.pushBack(pEnemySprite);
	auto actionMove = MoveTo::create(4.0f,Point(pEnemySprite->getPositionX(),0 - pEnemySprite->getSprite()->getContentSize().height/ 2));
	auto actionDone = CallFuncN::create(CC_CALLBACK_1(EnemyLayer::removeEnemy, this));
	auto seq1 = Sequence::create(actionMove, actionDone, NULL);
	pEnemySprite->runAction(seq1);
}
예제 #8
0
void PlayerSprite::update( float delta )
{
	b2ContactEdge* ce = m_pB2Body->GetContactList();
	list<BaseSprite*> desList;

	while (ce)
	{
		b2Body* body = ce->contact->GetFixtureA()->GetBody();
		BaseSprite* sprite = (BaseSprite*)body->GetUserData();

		if (sprite->getTag() == kEnemySprite)
		{
			desList.push_back(sprite);
		}
		ce = ce->next;
	}

	for (list<BaseSprite*>::iterator it = desList.begin(); it != desList.end(); it++)
	{
		CCPoint dir = (*it)->getPosition() - getPosition();
		dir = dir.normalize();

		float sita = CC_RADIANS_TO_DEGREES(acos(dir.dot(CCPoint(0, 1))));
		ElementColor hitColor;

		//cos值域在(0,180),修正在(180,360)的情况
		if (dir.x < 0)
		{
			sita = 360 - sita;
		}
		sita += getRotation();

		while (sita < 0) 
		{
			sita += 360;
		}
		sita = (int)sita % 360;

		if (sita >=0 && sita < 120)
		{
			hitColor = kGreen;
		}
		else if (sita >= 120 && sita < 240)
		{
			hitColor = kRed;
		}
		else
		{
			hitColor = kBlue;
		}

		EnemySprite* esp = dynamic_cast<EnemySprite*>(*it);
		if (!esp) continue;

		if (hitColor == esp->getElementColor())
		{
			HudLayer::getCurrent()->score(g_ScoreStep);
		}

		GameLayer::getCurrent()->getGameBg()->changeBgColor(esp->getElementColor());

		(*it)->destroySprite();
	}
	desList.clear();

	keyBoardHandle();
}