《塔防类手游开发教程》 第八节 炮塔子弹与怪物碰撞添加爆炸动画

在塔防游戏中,炮塔发射子弹攻击怪物,要保证攻击有效,需要加入子弹与怪物的碰撞,否则子弹就穿过怪物不能造成掉血。当怪物的血量为零,怪物会消失,但是仅仅是消失,在视觉感官上会觉得无聊,玩家可能认为出现什么bug,那么我们应该加入一个爆炸动画,这样怪物死亡的时候爆炸,玩家就知道那代表怪物死亡了。

具体代码:

在Boom.cpp中实现爆炸动画

Boom* Boom::newBoom(int x,int y){

    Boom * boom=Boom::create();

    Vectorallf;

    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

        Bullet * b=GameScene::allBullet.at(i);

        

        for (int j=0; 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;

            }

        }

你可能感兴趣的:(《塔防类手游开发教程》 第八节 炮塔子弹与怪物碰撞添加爆炸动画)