在塔防游戏中,炮塔发射子弹攻击怪物,要保证攻击有效,需要加入子弹与怪物的碰撞,否则子弹就穿过怪物不能造成掉血。当怪物的血量为零,怪物会消失,但是仅仅是消失,在视觉感官上会觉得无聊,玩家可能认为出现什么bug,那么我们应该加入一个爆炸动画,这样怪物死亡的时候爆炸,玩家就知道那代表怪物死亡了。
具体代码:
在Boom.cpp中实现爆炸动画
Boom* Boom::newBoom(int x,int y){
Boom * boom=Boom::create();
Vector<SpriteFrame* >allf;
for (int i=1;i<=6; i++) {
SpriteFrame * sf=SpriteFrameCache::getInstance()->getSpriteFrameByName(
StringUtils::format("explode1_%d.png",i));
allf.pushBack(sf);
}
auto animation=Animation::createWithSpriteFrames(allf);
animation->setDelayPerUnit(0.3);
auto animate=Animate::create(animation);
//auto act1=DelayTime::create(2);
auto act2=CallFunc::create(CC_CALLBACK_0(Boom::killMe, boom));
Sprite * sp=Sprite::create();
sp->setPosition(x,y);
boom->addChild(sp);
sp->runAction(Sequence::create(animate,act2, NULL));
return boom;
}
在Gamescene.cpp中调用爆炸动画并检测碰撞
void GameScene::update(float t){
//检测碰撞
for (int i=0;i<GameScene::allBullet.size();i++) {
Bullet * b=GameScene::allBullet.at(i);
for (int j=0; j<GameScene::allEnemy.size(); j++) {
Enemy * e=GameScene::allEnemy.at(j);
Rect rb(b->getPosition().x,b->getPosition().y,35,8);
Rect re(e->getPosition().x,e->getPosition().y,127,151);
if (rb.intersectsRect(re)) {
e->hp--;//掉血
e->changeHp();
if(e->hp<=0)
{
moneyLabel->setString(StringUtils::format("%d",money));
//爆炸效果
Boom * boom=Boom::newBoom(e->getPosition().x, e->getPosition().y);
this->addChild(boom);
//移除敌人
e->removeFromParent();
GameScene::allEnemy.eraseObject(e);
}
b->removeFromParent();
GameScene::allBullet.eraseObject(b);
i--;
break;
}
}