예제 #1
0
// 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);
    }
}
예제 #2
0
void EnemyLayer::removeAllEnemy(){
    CCObject* obj;
    CCARRAY_FOREACH(m_pAllEnemy1, obj){
        Enemy* enemy = (Enemy*)obj;
        if (enemy->getLife()>0) {
            enemyBlowUp(enemy, enemy->getType());
        }
    }
예제 #3
0
void LayerEnemy::removeAllSmallEnemy()
{
	CCObject *obj;
	CCARRAY_FOREACH(m_psmallArray, obj)
	{
		Enemy *enemy = (Enemy *)obj;
		if (enemy->getLife() >= 1)
		{
			smallEnemyBlowUp(enemy);
		}
	}
예제 #4
0
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);
	}
}