10.炮塔攻击。每座塔进行检查是否有敌人出现在攻击范围之内,如果有的话,对敌人进行开火,直到以下两种情况之一发生:敌人移动出范围;敌人被消灭。那么炮塔就会寻找下一个敌人。打开Tower.h文件,添加以下代码:
1
|
class Enemy;
|
添加以下变量和函数:
//控制炮塔是否攻击的开关
bool attacking;
//选择攻击敌人的对象
Enemy *chosenEnemy;
//攻击敌人的方法
void attackEnemy();
//选择攻击哪个敌人的方法
void chosenEnemyForAttack(Enemy *enemy);
//炮塔射击的方法
void shootWeapon(float dt);
//移除子弹的方法
void removeBullet(cocos2d::CCSprite *bullet);
//敌人受伤的方法
void damageEnemy();
//目标敌人死亡的方法
void targetKilled();
//敌人走出攻击范围的方法
void lostSightOfEnemy();
打开Enemy.h文件,添加以下代码:
//在攻击范围内的炮塔数组
cocos2d::CCArray *attackedBy;
//将炮塔添加的攻击的数组中
void getAttacked(Tower* attacker);
//当敌人走出炮塔的攻击范围外中,将炮塔从数组中移除
void gotLostSight(Tower* attacker);
//敌人收到打击
void getDamaged(int damage);
打开Tower.cpp文件,添加头文件声明:
1
|
#include
"Enemy.h"
|
在initWithTheGame函数do-while开头,添加如下代码:
1
|
chosenEnemy =
NULL;
|
添加以下方法:
void Tower::attackEnemy()
{
//炮塔 每隔fireRate代表的时间,发起一次攻击
this->schedule(schedule_selector(Tower::shootWeapon), fireRate);
}
void Tower::chosenEnemyForAttack(Enemy *enemy)
{
//首先,将之前的敌人接收容器置空
chosenEnemy = NULL;
//接收新的敌人
chosenEnemy = enemy;
//让炮塔攻击敌人
this->attackEnemy();
//调用敌人对象的方法,将当前炮塔传入
enemy->getAttacked(this);
}
void Tower::shootWeapon(float dt)
{
//创建子弹对象
CCSprite *bullet = CCSprite::create("bullet.png");
//将子弹显示在层上
_theGame->addChild(bullet);
//设置子弹显示的位置
bullet->setPosition(_mySprite->getPosition());
//子弹调用moveto的动作方法
CCMoveTo* moveTo = CCMoveTo::create(0.1, chosenEnemy->getMySprite()->getPositi