// Would be more efficient to check to see if the player has enough mana first // before finding the closest enemy. // Also, use the lightningTarget attribute instead of the intermediary // closestEnemey variable (unneeded). void Player::lightningAbility(double deltaTime, ObjectManager* manager) { const double manaCost = deltaTime * LIGHTNING_MANA_COST; Enemy* closestEnemy = manager->getClosestEnemy(x, y, 0, LIGHTNING_RANGE); if (closestEnemy != NULL && mana >= manaCost) { // then an enemy is in range of the lightning ability and the player has // enough mana left to perform the ability double damage = deltaTime * LIGHTNING_DPS; closestEnemy->modLife(-damage); modMana(-manaCost); resetManaRegenTime(); // Heal the player for a percentage of the damage dealt to the target. // If the damage of the lightning ability was greater than the enemy's // remaining life then heal the player for a fraction of the enemy's // remaining life, not the damage that would have been dealt. double damageDealt = Util::min(damage, closestEnemy->getLife()); modLife(damageDealt * LIGHTNING_HEAL_MODIFIER); lightningTarget = closestEnemy; //try and play zap and stop current music[technically not working but still sounds cool] //ResourceManager::getInstance()->playMainMusic(1, true); // ResourceManager::getInstance()->playZap(deltaTime, false); } else { // reset the current target of the lightning ability to null so that the // lightning effect will not be drawn lightningTarget = NULL; //try to stop play zap // ResourceManager::getInstance()->playZap(1, true); } }
void EnemyLayer::removeAllEnemy(){ CCObject* obj; CCARRAY_FOREACH(m_pAllEnemy1, obj){ Enemy* enemy = (Enemy*)obj; if (enemy->getLife()>0) { enemyBlowUp(enemy, enemy->getType()); } }
void LayerEnemy::removeAllSmallEnemy() { CCObject *obj; CCARRAY_FOREACH(m_psmallArray, obj) { Enemy *enemy = (Enemy *)obj; if (enemy->getLife() >= 1) { smallEnemyBlowUp(enemy); } }
void LayerGameMain::update(float dt) { //单发子弹与小敌机碰撞 /*思路: 两次遍历(即两个for循环),第一次遍历子弹容器(_bulletVector),取出其第一个子弹, 第二次遍历小敌机容器(_smallVec)将这个取出的子弹与当前屏幕上所有的小敌机做碰撞检测, 如果检测到碰撞,再判断当前碰撞到的小敌机的生命值_life 若等于1,则小敌机失去生命值 再分别将当前的子弹和当前的小敌机加到容器 bulletToDel 和 smallToDel 中去, 当第一个子弹与屏幕上的敌机全部碰撞检测完以后,就把 bulletToDel 和 smallToDel 里面的对象全部删除*/ Vector<Sprite *> bulletToDel_Small; for (auto bt : _bulletLayer->_bulletVector) { Sprite * bullet = bt; Vector<Enemy *> smallToDel; for (auto et : _enemyLayer->_smallVec) { Enemy * enemy = et; if (bullet->getBoundingBox().intersectsRect(enemy->Get_BoundingBox())) { if (enemy->getLife() == 1) { enemy->loseLife(); bulletToDel_Small.pushBack(bullet); smallToDel.pushBack(enemy); _score += SMALL_SCORE;//加上小敌机的分数 _controlLayer->updateScore(_score); } } } for(auto et : smallToDel)//注意for循环的位置,要与创建时的语句在同一层 { Enemy * enemy = et; _enemyLayer->smallEnemyBlowup(enemy);//敌机爆炸(删除) } } for (auto bt : bulletToDel_Small)//注意for循环的位置,要与创建时的语句在同一层 { Sprite * bullet = bt; _bulletLayer->removeBullet(bullet);//删除子弹 } //单发子弹与中敌机碰撞 Vector<Sprite *> bulletToDel_Mid; for (auto bt : _bulletLayer->_bulletVector) { Sprite * bullet = bt; Vector<Enemy *> midToDel; for (auto et : _enemyLayer->_midVec) { Enemy * enemyMid = et; if (bullet->getBoundingBox().intersectsRect(enemyMid->Get_BoundingBox())) { if (enemyMid->getLife() > 1) { enemyMid->loseLife(); bulletToDel_Mid.pushBack(bullet); } if (enemyMid->getLife() == 1) { enemyMid->loseLife(); bulletToDel_Mid.pushBack(bullet); midToDel.pushBack(enemyMid); _score += MID_SCORE; _controlLayer->updateScore(_score); } } } for(auto et : midToDel) { Enemy * enemyMid = et; _enemyLayer->midEnemyBlowup(enemyMid); } } for (auto bt : bulletToDel_Mid) { Sprite * bullet = bt; _bulletLayer->removeBullet(bullet); } //单发子弹与大敌机碰撞检测 Vector<Sprite *> bulletToDel_Big; for (auto bt : _bulletLayer->_bulletVector) { Sprite * bullet = bt; Vector<Enemy *> bigToDel; for (auto et : _enemyLayer->_bigVec) { Enemy * enemyBig = et; if (bullet->getBoundingBox().intersectsRect(enemyBig->Get_BoundingBox())) { if (enemyBig->getLife() > 1) { enemyBig->loseLife(); bulletToDel_Big.pushBack(bullet); } if (enemyBig->getLife() == 1) { enemyBig->loseLife(); bulletToDel_Big.pushBack(bullet); bigToDel.pushBack(enemyBig); _score += BIG_SCORE; _controlLayer->updateScore(_score); } } } for(auto et : bigToDel) { Enemy * enemyBig = et; _enemyLayer->bigEnemyBlowup(enemyBig); } } for (auto bt : bulletToDel_Big) { Sprite * bullet = bt; _bulletLayer->removeBullet(bullet); } //多发子弹与小敌机碰撞检测 Vector<Sprite *> M_bulletToDel_Small; for (auto bt : _multiBulletsLayer->_multiBulletsVector) { Sprite * M_bullet = bt; Vector<Enemy *> M_smallToDel; for (auto et : _enemyLayer->_smallVec) { Enemy * enemy = et; if (M_bullet->getBoundingBox().intersectsRect(enemy->Get_BoundingBox())) { if (enemy->getLife() == 1) { enemy->loseLife(); M_bulletToDel_Small.pushBack(M_bullet); M_smallToDel.pushBack(enemy); _score += SMALL_SCORE;//加上小敌机的分数 _controlLayer->updateScore(_score); } } } for(auto et : M_smallToDel)//注意for循环的位置,要与创建时的语句在同一层 { Enemy * enemy = et; _enemyLayer->smallEnemyBlowup(enemy);//敌机爆炸(删除) } } for (auto bt : M_bulletToDel_Small)//注意for循环的位置,要与创建时的语句在同一层 { Sprite * bullet = bt; _multiBulletsLayer->removeMultiBullets(bullet);//删除子弹 } //多发子弹与中敌机碰撞检测 Vector<Sprite *> M_bulletToDel_Mid; for (auto bt : _multiBulletsLayer->_multiBulletsVector) { Sprite * M_bullet = bt; Vector<Enemy *> M_midToDel; for (auto et : _enemyLayer->_midVec) { Enemy * enemy = et; if(M_bullet->getBoundingBox().intersectsRect(enemy->Get_BoundingBox())) { if (enemy->getLife() > 0) { enemy->loseLife(); M_bulletToDel_Mid.pushBack(M_bullet); } if (enemy->getLife() == 1) { enemy->loseLife(); M_bulletToDel_Mid.pushBack(M_bullet); M_midToDel.pushBack(enemy); _score += MID_SCORE; _controlLayer->updateScore(_score); } } } for (auto et : M_midToDel) { Enemy * enemy = et; _enemyLayer->midEnemyBlowup(enemy); } } for (auto bt : M_bulletToDel_Mid) { Sprite * bullet = bt; _multiBulletsLayer->removeMultiBullets(bullet); } //多发子弹与大敌机碰撞检测 Vector<Sprite *> M_bulletToDel_Big; for (auto bt : _multiBulletsLayer->_multiBulletsVector) { Sprite * M_bullet = bt; Vector<Enemy *> M_bigToDel; for (auto et : _enemyLayer->_bigVec) { Enemy * enemy = et; if(M_bullet->getBoundingBox().intersectsRect(enemy->Get_BoundingBox())) { if (enemy->getLife() > 0) { enemy->loseLife(); M_bulletToDel_Big.pushBack(M_bullet); } if (enemy->getLife() == 1) { enemy->loseLife(); M_bulletToDel_Big.pushBack(M_bullet); M_bigToDel.pushBack(enemy); _score += BIG_SCORE; _controlLayer->updateScore(_score); } } } for (auto et : M_bigToDel) { Enemy * enemy = et; _enemyLayer->bigEnemyBlowup(enemy); } } for (auto bt : M_bulletToDel_Big) { Sprite * bullet = bt; _multiBulletsLayer->removeMultiBullets(bullet); } //玩家飞机与小敌机碰撞检测 Rect myPlane = MyPlane::getInstance()->getBoundingBox(); for (auto et : _enemyLayer->_smallVec) { Enemy * enemy = et; if (enemy->getLife() > 0) { if (myPlane.intersectsRect(enemy->Get_BoundingBox())) { _bulletLayer->stopShoot(); _multiBulletsLayer->stopShoot(); this->unscheduleAllSelectors();//停止所有定时器 MyPlane::getInstance()->PlaneBlowup(_score);//飞机爆炸,传递分数 //MyPlane::getInstance()->removePlane(); _enemyLayer->smallEnemyBlowup(enemy); /*auto pScene = LayerGameOver::scene(_score); Director::getInstance()->replaceScene(pScene);*/ } } } //玩家飞机与中敌机碰撞检测 for (auto et : _enemyLayer->_midVec) { Enemy * enemy = et; if (enemy->getLife() > 0) { if (myPlane.intersectsRect(enemy->Get_BoundingBox())) { _bulletLayer->stopShoot(); _multiBulletsLayer->stopShoot(); this->unscheduleAllSelectors();//停止所有定时器 MyPlane::getInstance()->PlaneBlowup(_score);//飞机爆炸,传递分数 // MyPlane::getInstance()->removePlane(); //_enemyLayer->midEnemyBlowup(enemy); /*auto pScene = LayerGameOver::scene(_score); Director::getInstance()->replaceScene(pScene);*/ } } } //玩家飞机与大敌机碰撞检测 for (auto et : _enemyLayer->_bigVec) { Enemy * enemy = et; if (enemy->getLife() > 0) { if (myPlane.intersectsRect(enemy->Get_BoundingBox())) { _bulletLayer->stopShoot(); _multiBulletsLayer->stopShoot(); this->unscheduleAllSelectors();//停止所有定时器 MyPlane::getInstance()->PlaneBlowup(_score);//飞机爆炸,传递分数 // MyPlane::getInstance()->removePlane(); //_enemyLayer->bigEnemyBlowup(enemy); /*auto pScene = LayerGameOver::scene(_score); Director::getInstance()->replaceScene(pScene);*/ } } } //玩家飞机与炸弹道具碰撞检测(在帧循环里面检测的) Vector<Sprite *> boomToDel; for (auto food : _foodLayer->_bigBoomVec) { Sprite * bigBoom = food; if (bigBoom->getBoundingBox().intersectsRect(MyPlane::getInstance()->getBoundingBox())) { SimpleAudioEngine::getInstance()->playEffect("sound/get_bomb.wav"); //_foodLayer->removeBigBoom(bigBoom); boomToDel.pushBack(bigBoom); _bigBoomCount++; this->updateBigBoomCount(_bigBoomCount); } } for (auto bo : boomToDel) { _foodLayer->removeBigBoom(bo); } //玩家飞机与多发子弹道具碰撞检测 Vector<Sprite *> multiToDel; for (auto mb : _foodLayer->_multiBulletsVec) { Sprite * multiBullet = mb; if (multiBullet->getBoundingBox().intersectsRect(MyPlane::getInstance()->getBoundingBox())) { SimpleAudioEngine::getInstance()->playEffect("sound/get_double_laser.wav"); //_foodLayer->removeMultiBullets(multiBullet); multiToDel.pushBack(multiBullet); _bulletLayer->stopShoot(); _multiBulletsLayer->startShoot(); _score += 100; _controlLayer->updateScore(_score); } } for (auto mb : multiToDel) { _foodLayer->removeMultiBullets(mb); } }