cocos2dx实现经典飞机大战

游戏开始层

#ifndef __LayerGameStart_H__
#define __LayerGameStart_H__
#include "cocos2d.h"
USING_NS_CC;


class LayerGameStart :public cclayer
{
public:
    static CCScene * scene();
    CREATE_FUNC(LayerGameStart);
    bool init();

    void addStartGamePicture();
    void addPreLoadMusic();
    void toMainGameCallback();


};


#endif

游戏主场景

#include "cocos2d.h"
#include "Plane.h"
#include "LayerGameStart.h"
#include "LayerBullet.h"
#include "LayerEnemy.h"
#include "LayerControl.h"
#include "LayerFood.h"
#include "LayerGameOver.h"
USING_NS_CC;

const int  SMALL_score = 1000;
const int  MID_score = 6000;
const int  BIG_score = 30000;

const int MAX_BIGBOOM_COUNT = 100000;
const int TAG_BIGBOOM = 1000;
const int TAG_BIGBOOMCOUNT = 2000;
class LayerGameMain :public cclayer
{
public:
    static CCScene * scene();
    CREATE_FUNC(LayerGameMain);
    bool init();
    //加载主场景背景
    void addBackGround();
    //背景动起来
    void movingBackGround(float dt);
    void addHero();
    void addBulletLayer();
    void addEnemyLayer();
    void addCtrlLayer();
    void addFoodLayer();

    void updateBigBoomCount(int bigBoomCount);

    void boomMenuCallBack(CCObject * obj);
    enum BACKGROUND
    {
        BACK1,BACK2
    };
    void update(float dt);
    virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent);
    LayerBullet  * _bulletLayer;
    LayerEnemy   * _enemyLayer;
    LayerControl * _ctrlLayer;
    LayerFood    * _foodLayer;
    static int score;
    static void setscore(int num);
    int bigBoomCount;

};

碰撞检测

其中分为子弹与飞机的碰撞检测,飞机与飞机的碰撞检测,其中敌机分为大飞机,中飞机与小飞机,原理大致相同,这里只展示小飞机的原理与方法

CCARRAY_FOREACH(_bulletLayer->_bulletArray,bt)
    {
        CCSprite * bullet = (CCSprite*)bt;
        CCArray  * smallEnemyToDel = CCArray::create();



“`

CCARRAY_FOREACH(_enemyLayer->smallArray,et) { Enemy * smallEnemy = (Enemy *)et; if (bullet->boundingBox().intersectsRect(smallEnemy->getBoundingBox())) { cclog("%d",smallEnemy->getLife()); if (smallEnemy->getLife() == 1) { smallEnemy->loseLife(); bulletsToDel->addobject(bullet); smallEnemyToDel->addobject(smallEnemy); score += SMALL_score; _ctrlLayer->updatascore(score); } } } CCARRAY_FOREACH(smallEnemyToDel,et) { Enemy * smallEnemy = (Enemy*)et; _enemyLayer->smallEnemyBlowUp(smallEnemy); } smallEnemyToDel->release(); }

飞机与飞机的碰撞检测

//hero vs enemySmall
CCRect planeRect = Plane::getInstance()->boundingBox();
planeRect.origin.x += 30;
planeRect.origin.y += 20;
planeRect.size.width -= 60;
planeRect.size.height -= 40;

CCARRAY_FOREACH(_enemyLayer->smallArray,et)
{
    Enemy  * smallEnemy = (Enemy  *)et;
    if (planeRect.intersectsRect(smallEnemy->getBoundingBox()))
    {
        _bulletLayer->stopShoot();
        unscheduleAllSelectors();
        Plane::getInstance()->blowUp();
        Plane::getInstance()->removePlane();
        _enemyLayer->smallEnemyBlowUp(smallEnemy);

    }
}

飞机大战的分层

由于游戏的复杂性,需要将精灵分为好几个层次加入到游戏中,可以分为控制层,敌机层,食物层,子弹层等

控制层代码

#ifndef __LayerControl_H__
    #define __LayerControl_H__

    #include "cocos2d.h"
    USING_NS_CC;

    class LayerControl : public cclayer
    {
    public:
        CREATE_FUNC(LayerControl);
        bool init();

        void menuCallBack(CCObject *obj);
        void updatascore(int score);

    private:
        CcmenuItemSprite * pauseMenuItem;
        cclabelBMFont * scoreItem;
    };


    #endif

食物层代码

#ifndef __LayerFood_H__
#define __LayerFood_H__

#include "cocos2d.h"
USING_NS_CC;
class LayerFood :public cclayer
{
public:
    CREATE_FUNC(LayerFood);
    bool init();

    //void addMultiBullets(float dt);
    //void multiBulletsMoveFinished(CCNode * pSender);
    //void removeMultiBullets(CCSprite *mb);

    void addBigBoom(float dt);
    void bigBoomMoveFinished(CCNode *pSender);
    void removeBigBoom(CCSprite *bb);

public:
    CCArray * multiBulletArray;
    CCArray * bigBoomArray;

};

#endif

敌机层代码

#ifndef __LayerEnemy_H__
#define __LayerEnemy_H__

#include "cocos2d.h"
#include "Enemy.h"

USING_NS_CC;

const int SMALL_MAXLIFE = 1;
const int MID_MAXLIFE = 3;
const int BIG_MAXLIFE = 5;

class LayerEnemy: public cclayer
{
public:
    CREATE_FUNC(LayerEnemy);
    bool init();


    void addSmallEnemy(float dt);
    void smallEnemyMovefinished(CCNode *node);
    void smallEnemyBlowUp(Enemy * smallEnemy);
    void removeSmallEnemy(CCNode * target,void * data);
    void removeAllSmallEnemy();

    void addMidEnemy(float dt);
    void midHitAnimate(Enemy *midEnemy);
    void midEnemyMovefinished(CCNode *node);
    void midEnemyBlowUp(Enemy * midEnemy);
    void removeMidEnemy(CCNode * target,void * data);
    void removeAllMidEnemy();

    void addBigEnemy(float dt);
    void bigHitAnimate(Enemy *midEnemy);
    void bigEnemyMovefinished(CCNode *node);
    void bigEnemyBlowUp(Enemy * bigEnemy);
    void removeBigEnemy(CCNode * target,void * data);
    void removeAllBigEnemy();

    void removeAllEnemy();


    CCArray * smallArray;
    CCArray *midArray;
    CCArray *bigArray;
};


#endif

子弹层代码

#ifndef __LayerBullet_H__
#define __LayerBullet_H__

#include "cocos2d.h"
USING_NS_CC;

class LayerBullet: public cclayer
{
public:
    CREATE_FUNC(LayerBullet);
    bool init();

    void startShoot();
    void stopShoot();
    void addBulletCallback(float dt);
    void bulletMoveFinished(CCNode* node);
    void removeBullet(CCSprite* bullet);

    CCArray *_bulletArray;
    CCSpriteBatchNode * _bulletBatchNode;
};

#endif

运行结果


相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...