国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Cocos2d-x 自定義敵機(jī)精靈

2018-10-02 09:51 更新

自定義敵機(jī)精靈

發(fā)現(xiàn)CSDN上傳的gif圖不能動(dòng)。。。有招沒(méi)?

飛機(jī)可以控制飛行,并且發(fā)射子彈,那沒(méi)有敵機(jī)怎么行?

敵機(jī)共有3種類(lèi)型,分別為Enemy1,Enemy2和Enemy3,按大小排列,從程序角度看來(lái),它們的本質(zhì)都是一樣的。因此可以從同一個(gè)實(shí)體中繼承出來(lái),不同點(diǎn)在于:

A.圖像不一樣

B.生命值不一樣

C.移動(dòng)速度和出現(xiàn)頻率不一樣

D.第三種敵機(jī)也就是最大的敵機(jī),在飛行的過(guò)程中帶有動(dòng)畫(huà)效果。

這里以最小的敵機(jī)(Enemy1)為例。

1.有生命的敵機(jī)

自定義的敵機(jī)類(lèi)是少不了的,但是要從CCNode繼承還是CCSprite繼承,那就要看實(shí)際需要了,從CCNode繼承靈活度會(huì)高一點(diǎn),但是也麻煩一點(diǎn),從CCSprite繼承就會(huì)相對(duì)簡(jiǎn)單一點(diǎn),但是靈活度就低了。建議還是從CCNode繼承,這里選擇從CCNode繼承。Enemy相當(dāng)于一個(gè)容器,可以綁定一個(gè)精靈。

    #include "Enemy.h"
    Enemy::Enemy(void)
    {
        m_sprite=NULL;//m_sprite是CCSprite指針,用來(lái)綁定敵機(jī)
        m_life=0;//生命值
    }

    Enemy::~Enemy(void)
    {
    }

    Enemy* Enemy::create()
    {
        Enemy* pRet=new Enemy;
        pRet->autorelease();
        return pRet;
    }

    void Enemy::bindSprite(CCSprite* sprite,int life)//綁定敵機(jī),并傳入生命值
    {
        m_sprite=sprite;
        m_life=life;
        this->addChild(m_sprite);
    }

    CCSprite* Enemy::getSprite()
    {
        return m_sprite;
    }

    int Enemy::getLife()//獲取生命
    {
        return m_life;
    }

    void Enemy::loseLife()//生命值-1
    {
        m_life--;
    }

    CCRect Enemy::getBoundingBox()//獲取敵機(jī)大小
    {
        CCRect rect=m_sprite->boundingBox();
        CCPoint pos=this->convertToWorldSpace(rect.origin);
        CCRect enemyRect(pos.x,pos.y,rect.size.width,rect.size.height);
        return enemyRect;
    }

2.敵機(jī)的隨機(jī)初始位置和速度

在EnemyLayer中添加3種敵機(jī),敵機(jī)出現(xiàn)的位置和飛行速度是隨機(jī)值,從我們?cè)O(shè)定的范圍中得出,敵機(jī)的回收機(jī)制同子彈層的處理是一樣的,采用CCArray管理,這里不再贅訴。

    void EnemyLayer::addEnemy1(float dt)
    {
        //調(diào)用綁定敵機(jī)1
        Enemy* enemy1=Enemy::create();
        enemy1->bindSprite(CCSprite::create(enemy1SpriteFrame),ENEMY1_MAXLIFE);

        //隨機(jī)初始位置
        CCSize enemy1Size=enemy1->getSprite()->getContentSize();
        CCSize winSize=CCDirector::sharedDirector()->getWinSize();
        int minX=enemy1Size.width/2;
        int maxX=winSize.width-enemy1Size.width/2;
        int rangeX=maxX-minX;
        int actualX=(rand()%rangeX)+minX;

        enemy1->setPosition(ccp(actualX,winSize.height+enemy1Size.height/2));
        this->addChild(enemy1);
        this->m_pAllEnemy1->addObject(enemy1);

        //隨機(jī)飛行速度
        float minDuration,maxDuration;

        //根據(jù)游戲難度給minDuration,maxDuration賦值

        int rangeDuration=maxDuration-minDuration;
        int actualDuration=(rand()%rangeDuration)+minDuration;

        CCFiniteTimeAction* actionMove=CCMoveTo::create(actualDuration,ccp(actualX,0-enemy1->getSprite()->getContentSize().height/2));
        CCFiniteTimeAction* actionDone=CCCallFuncN::create(this,callfuncN_selector(EnemyLayer::enemy1MoveFinished));

        CCSequence* sequence=CCSequence::create(actionMove,actionDone);
        enemy1->runAction(sequence);
    }

3.敵機(jī)爆炸

敵機(jī)在與子彈碰撞后,會(huì)產(chǎn)生爆炸效果,也就是一串幀動(dòng)畫(huà),動(dòng)畫(huà)結(jié)束后,敵機(jī)消失,同時(shí)進(jìn)行回收處理。這里的animate如果能加入動(dòng)畫(huà)緩沖池,效率會(huì)更高。

    //敵機(jī)爆炸
    void EnemyLayer::enemy1Blowup(Enemy* enemy1)
    {
        CCAnimation* animation=CCAnimationCache::sharedAnimationCache()->animationByName("Enemy1Blowup");//動(dòng)畫(huà)事先加入動(dòng)畫(huà)池
        CCAnimate* animate=CCAnimate::create(animation);
        CCCallFuncND* removeEnemy1=CCCallFuncND::create(this,callfuncND_selector(EnemyLayer::removeEnemy1),(void*)enemy1);
        CCSequence* sequence=CCSequence::create(animate,removeEnemy1);
        enemy1->getSprite()->runAction(sequence);//運(yùn)行爆炸動(dòng)畫(huà)并回收
    }

4.EnemyLayer敵機(jī)層的其他接口

    //移除單架敵機(jī)1
    void EnemyLayer::removeEnemy1(CCNode* pTarget, void* data)
    {
        Enemy* enemy1=(Enemy*)data;
        if (enemy1!=NULL)
        {
            m_pAllEnemy1->removeObject(enemy1);
            this->removeChild(enemy1,true);
        }
    }

    //移除所有敵機(jī),干嘛用?還記得有個(gè)ufo炸彈全屏秒么。。。
    void EnemyLayer::removeAllEnemy1()
    {
        CCObject* obj;
        CCARRAY_FOREACH(m_pAllEnemy1,obj)
        {
            Enemy* enemy1=(Enemy*)obj;
            if (enemy1->getLife()>0)
                {
                    enemy1Blowup(enemy1);
                }
        }
    }
    void EnemyLayer::removeAllEnemy()
    {
        removeAllEnemy1();
        removeAllEnemy2();
        removeAllEnemy3();
    }

5.超大型敵機(jī)的飛行動(dòng)畫(huà)

這里簡(jiǎn)單采用幀動(dòng)畫(huà),單獨(dú)執(zhí)行,也可以使用CCSpawn類(lèi)來(lái)實(shí)現(xiàn)同時(shí)動(dòng)畫(huà)效果

enemy3SpriteFrame_1=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy3_n1.png");
    enemy3SpriteFrame_2=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy3_n2.png");
    CCAnimation* animation=CCAnimation::create();//創(chuàng)建幀動(dòng)畫(huà)
    animation->setDelayPerUnit(0.2f);
    animation->addSpriteFrame(enemy3SpriteFrame_1);
    animation->addSpriteFrame(enemy3SpriteFrame_2);
    CCAnimate* animate=CCAnimate::create(animation);
    enemy3->getSprite()->runAction(CCRepeatForever::create(animate));//采用CCRepeaterForever不斷重復(fù)動(dòng)畫(huà)

好了,把EnemyLayer也添加進(jìn)GameLayer,運(yùn)行一下,敵機(jī)滿天飛了,控制你的手指頭移動(dòng)主角飛機(jī)進(jìn)行射擊,我了個(gè)去,死不了是鬧哪樣。。。。

這不廢話!最最重要的碰撞檢測(cè)還沒(méi)加入呢!

效果圖


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)