我方飛機的子彈和敵機子彈都在這個類中產生。將子彈專門設計成一個類,主要是為了方便擴展。之后如果想更換我方飛機子彈或者是敵機子彈,都會很方便。
類的功能很直觀,就是添加子彈、移除子彈
~~~
void bindEnemyManager(EnemyManager* enemyManager);
void BeginBulletShoot(float dt = 0.0f); // 開啟子彈射擊
void StopBulletShoot(); // 停止子彈射擊
void addBullet(float dt); // 添加子彈
void removeBullet(Node* pNode); // 移除子彈
void addEnemyBullet(float dt); // 添加敵機子彈
void removeEnemyBullet(Node* pNode); // 移除敵機子彈
~~~
添加的子彈像敵機一樣,存儲在容器中
~~~
Vector<Sprite*> vecBullet;
Vector<Sprite*> vecEnemyBullet;
EnemyManager* m_enemyManager;
~~~
想給敵機添加子彈,要將子彈類和敵機管理類綁定,通過敵機管理類中的容器,來獲取敵機對象。
我們通過對比敵機類和我方飛機類,可以發現,我方飛機精靈直接嵌入在飛機層中,并通過setTag()設置標識,可以通過標識來調用,也可以通過調用飛機層的實例instancePlane來間接調用。而敵機雖然也設置了標識,但是可以通過getSprite()函數來獲取精靈實體。
接下來實現添加子彈的功能
~~~
bool Bullet::init()
{
if (!Layer::init())
{
return false;
}
BeginBulletShoot();
return true;
}
void Bullet::bindEnemyManager(EnemyManager* enemyManager)
{
this->m_enemyManager = enemyManager;
m_enemyManager->retain();
}
void Bullet::BeginBulletShoot(float dt)
{
this->schedule(schedule_selector(Bullet::addBullet), 0.2f, kRepeatForever, dt);
this->schedule(schedule_selector(Bullet::addEnemyBullet), 1.0f, kRepeatForever, dt);
}
void Bullet::StopBulletShoot()
{
this->unschedule(schedule_selector(Bullet::addBullet));
this->unschedule(schedule_selector(Bullet::addEnemyBullet));
}
void Bullet::addBullet(float dt)
{
// 子彈
auto bullet = Sprite::createWithSpriteFrameName("bullet1.png");
if (NULL == bullet)
{
return;
}
this->addChild(bullet); // 加到Layer中去
vecBullet.pushBack(bullet); // 加到容器中去,用于以后的碰撞檢測等
// 獲得飛機的位置
Point planePos = MyPlane::instancePlane->getChildByTag(AIRPLANE)->getPosition();
Point bulletPos = Point(planePos.x, planePos.y + MyPlane::instancePlane->getChildByTag(AIRPLANE)->getContentSize().height / 2);
bullet->setPosition(bulletPos);
// 飛行長度 飛行就是超出窗體
float flyLen = Director::getInstance()->getWinSize().height + bullet->getContentSize().height / 2 - bulletPos.y;
float flyVelocity = 320 / 1; //飛行速度
float realFlyDuration = flyLen / flyVelocity; // 飛行時間
auto actionMove = MoveTo::create(realFlyDuration, Point(bulletPos.x, Director::getInstance()->getWinSize().height + bullet->getContentSize().height / 2));
auto actionDone = CallFuncN::create(CC_CALLBACK_1(Bullet::removeBullet, this));
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
bullet->runAction(sequence);
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/bullet.wav");
}
}
void Bullet::removeBullet(Node* pNode)
{
if (NULL == pNode)
{
return;
}
Sprite* bullet = (Sprite*)pNode;
this->removeChild(bullet, true);
vecBullet.eraseObject(bullet);
}
// 添加敵機子彈
void Bullet::addEnemyBullet(float dt)
{
for (auto& eEnemy : m_enemyManager->vecEnemy)
{
Enemy* pEnemySprite = (Enemy*)eEnemy;
// 子彈
auto bullet = Sprite::createWithSpriteFrameName("enemyBullet.png");
if (NULL == bullet)
{
return;
}
this->addChild(bullet); // 加到Layer中去
vecEnemyBullet.pushBack(bullet); // 加到容器中去,用于以后的碰撞檢測等
// 獲得敵方飛機的位置
Point enemyPos = pEnemySprite->getPosition();
Point bulletPos = Point(enemyPos.x, enemyPos.y - pEnemySprite->getContentSize().height / 2);
bullet->setPosition(bulletPos);
// 飛行長度 飛行就是超出窗體
float flyLen = bulletPos.y - bullet->getContentSize().height / 2;
float flyVelocity = 320 / 1; //飛行速度
float realFlyDuration = flyLen / flyVelocity; // 飛行時間
auto actionMove = MoveTo::create(realFlyDuration, Point(bulletPos.x, Director::getInstance()->getVisibleOrigin().y - bullet->getContentSize().height / 2));
auto actionDone = CallFuncN::create(CC_CALLBACK_1(Bullet::removeEnemyBullet, this));
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
bullet->runAction(sequence);
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemyBullet.wav");
}
}
}
// 移除敵機子彈
void Bullet::removeEnemyBullet(Node* pNode)
{
if (NULL == pNode)
{
return;
}
Sprite* bullet = (Sprite*)pNode;
this->removeChild(bullet, true);
vecEnemyBullet.eraseObject(bullet);
}
~~~
注意不要將添加我方飛機子彈和添加敵機子彈放在一個函數中,那樣不僅使代碼混亂,而且不利于擴展。