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); } }
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; }
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; }
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; }
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(); } }
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); }
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(); }