zoukankan      html  css  js  c++  java
  • 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
    

    运行结果

    开始界面123

    游戏主界面
    游戏结束界面

  • 相关阅读:
    在R语言中轻松创建关联网络
    在R语言中显示美丽的数据摘要summary统计信息
    R语言中不同类型的聚类方法比较
    R语言中的划分聚类模型
    R语言解释生存分析中危险率和风险率的变化
    Stata估算观测数据的风险比
    Stata 中Mata的st_view函数
    R语言多臂试验
    R语言使用倾向评分提高RCT(随机对照试验)的效率
    R语言在RCT中调整基线时对错误指定的稳健性
  • 原文地址:https://www.cnblogs.com/jjx2013/p/6223765.html
Copyright © 2011-2022 走看看