• cocos2d-x学习日志(10) --射击游戏(喵星战争)


    转载请标明:转载自【小枫栏目】,博文链接:http://blog.csdn.net/rexuefengye/article/details/10553487

    一、纵版射击游戏的特点

            纵版射击游戏是一种比较传统的游戏,在各种游戏平台都有非常经典的游戏作品。对于游戏开发者来说,这种游戏题材非常适合加入特效和创新的玩法。但是无论怎样改变,该类游戏都具备以下特点:

            滚动背景、主角、敌人、子弹、特效


    二、喵星战争简介

            喵星战争在传统纵版设计游戏的基础上进行创新。主角不是传统飞机造型,而是一只小猫,敌人也不是敌机与怪兽,而是狗博士,同时子弹也做了相应变化,如图


                   

     


    1) 游戏规则:

    喵星战争的游戏规则:用手指控制主角小猫的移动,当小猫处于被控制状态时,会放出子弹,狗博士不断地从屏幕上部出现,玩家要做就是移动小猫主角,使小猫的子弹打中狗博士,打中狗博士可以增加积分。

    该游戏采用移动游戏中流行的生存模式,即没有关卡的限制,主角有三次失败(撞上狗博士或管子弹)的机会,游戏结束。


    2)游戏框架和界面

    喵星战争界面和流程较简单,包括主菜单、关于、游戏过程等界面。

    主菜单和关于界面,如图


        


    主游戏界面和游戏结束界面


        


    3)实现代码

    3.1 主角小猫类:

    GameObjHero.h

     

    #ifndef example15_1_GameObjHero_h
    #define example15_1_GameObjHero_h
    #include "cocos2d.h"
    using namespace cocos2d;
    
    class GameObjHero : public CCNode, public CCTargetedTouchDelegate
    {
    public:
        CCSprite*lefthand; //左手
        CCSprite*righthand;  //右手
        CCPoint offset;   //触摸偏移位置
        bool iscontrol;   //是否在控制主角
        GameObjHero(void);
        virtual ~GameObjHero(void);
        void releasebullet();  //释放子弹
        CCRect rect();
        virtual void onEnter();
        virtual void onExit();
        bool containsTouchLocation(CCTouch* touch);
        virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
        virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
        virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
        
        virtual void touchDelegateRetain();
        virtual void touchDelegateRelease();
        
    };
    
    #endif

    GameObjHero.cpp

     

    #include "GameObjHero.h"
    #include "GameScene.h"
    #include "GameHeroBullet.h"
    GameObjHero::GameObjHero(void)
    {
    }
    
    GameObjHero::~GameObjHero(void)
    {
    }
    CCRect GameObjHero::rect()
    {
        CCSize s = CCSizeMake(85,90);
        return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
    }
    void GameObjHero::touchDelegateRetain()
    {
        this->retain();
    }
    
    void GameObjHero::touchDelegateRelease()
    {
        this->release();
    }
    void GameObjHero::onEnter()
    {
        CCNode::onEnter();
        this->setContentSize(CCSizeMake(85,90));
        CCDirector* pDirector = CCDirector::sharedDirector();
        pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
        CCSprite *mainsprite = CCSprite::create("catBody1.png");
        //主体动画
        CCAnimation* animation = CCAnimation::create();
        animation->addSpriteFrameWithFileName("catBody1.png");
        animation->addSpriteFrameWithFileName("catBody2-4.png");
        animation->addSpriteFrameWithFileName("catBody3.png");
        animation->addSpriteFrameWithFileName("catBody2-4.png");
        animation->setDelayPerUnit(0.1f);
        animation->setRestoreOriginalFrame(true);
        mainsprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));
        addChild(mainsprite);
        //尾巴
        CCSprite *tail = CCSprite::create("catTail.png");
        tail->setAnchorPoint(ccp(0.5,1));
        tail->setPosition(ccp(-5,-29));
        tail->setScale(0.5);
        tail->setRotation(20);
        tail->runAction(CCRepeatForever::create((CCActionInterval*)CCSequence::create(CCRotateBy::create(0.5,-40),CCRotateBy::create(0.5,40),NULL)));
        addChild(tail);
        //手
        lefthand = CCSprite::create("catHand1.png");
        lefthand->setAnchorPoint(ccp(1,0.5));
        lefthand->setPosition(ccp(-18,-20));
        addChild(lefthand);
        righthand = CCSprite::create("catHand2.png");
        righthand->setPosition(ccp(18,-20));
        righthand->setAnchorPoint(ccp(0,0.5));
        addChild(righthand);
        offset = ccp(0,0);
        iscontrol = false;
        schedule(schedule_selector(GameObjHero::releasebullet), 1.0f);
    }
    void GameObjHero::releasebullet(){
        //释放子弹
        if(iscontrol){
           CCPoint pos = this->getPosition(); 
           GameMain *p = (GameMain *) this->getParent();
            p->releaseheroBullet(pos.x,pos.y + 30);
        }
    }
    void GameObjHero::onExit()
    {
        CCDirector* pDirector = CCDirector::sharedDirector();
        pDirector->getTouchDispatcher()->removeDelegate(this);
        CCNode::onExit();
    }    
    bool GameObjHero::containsTouchLocation(CCTouch* touch)
    {
        return CCRect::CCRectContainsPoint(rect(), convertTouchToNodeSpaceAR(touch));
    }
    bool GameObjHero::ccTouchBegan(CCTouch* touch, CCEvent* event)
    {
        if(((GameMain *)this->getParent())->isover)
            return false;
        if(! containsTouchLocation(touch)){
            return false; 
        }else{
            //获得触摸偏移位置
            iscontrol = true;
            CCPoint touchPoint = touch->locationInView();
            touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
            offset.x = touchPoint.x - this->getPosition().x;
            offset.y = touchPoint.y - this->getPosition().y;
        }
        return true;   
    }
    void GameObjHero::ccTouchMoved(CCTouch* touch, CCEvent* event)
    {
        if(iscontrol){
          CCPoint touchPoint = touch->locationInView();
          touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
          //设置左右手上下
          float x = touchPoint.x - offset.x; 
          float y = touchPoint.y - offset.y;
          if(x < this->getPosition().x){
              lefthand->setFlipY(true);
              righthand->setFlipY(false);
          }else{
              lefthand->setFlipY(false);
              righthand->setFlipY(true); 
          }
          this->setPosition(x,y);
        }
    }
    void GameObjHero::ccTouchEnded(CCTouch* touch, CCEvent* event)
    {
        if(iscontrol){
           iscontrol = false;
           lefthand->setFlipY(false);
           righthand->setFlipY(false);
        }
    }

    3.2 敌人狗博士

    GameObjEnemy.h

     

    #ifndef example15_1_GameObjEnemy_h
    #define example15_1_GameObjEnemy_h
    #include "cocos2d.h"
    using namespace cocos2d;
    
    class GameObjEnemy : public CCNode
    {
    public:
        CCSprite *boom;
        CCSprite *mainbody;
        GameObjEnemy(void);
        virtual ~GameObjEnemy(void);
        void releasebullet();
        virtual void onEnter();
        virtual void onExit();
        void movestart();
        void restart();
        void setdie();
        short type;
        bool islife;
        void setType(short var);
    };
    
    #endif

    GameObjEnemy.cpp

     

    #include "GameObjEnemy.h"
    #include "GameScene.h"
    GameObjEnemy::GameObjEnemy(void)
    {
    }
    
    GameObjEnemy::~GameObjEnemy(void)
    {
    }
    void GameObjEnemy::onEnter()
    {
        CCNode::onEnter();
        this->setContentSize(CCSizeMake(99,111));
        mainbody = CCSprite::create("DrDog1.png");
        //初始化动画
        CCAnimation* animation = CCAnimation::create();
        animation->addSpriteFrameWithFileName("DrDog1.png");
        animation->addSpriteFrameWithFileName("DrDog2.png");
        animation->setDelayPerUnit(0.1f);
        animation->setRestoreOriginalFrame(true);
        mainbody->runAction(CCRepeatForever::create(CCAnimate::create(animation)));
        addChild(mainbody);
        boom = CCSprite::create("boom1.png");
        addChild(boom);
        boom->setVisible(false);
        islife = true;
    }
    void GameObjEnemy::setdie(){
        islife = false;
        mainbody->setVisible(false);
        boom->setVisible(true);
        this->stopAllActions();
        //爆炸动画
        CCAnimation* boomAnimation = CCAnimation::create();
        boomAnimation->addSpriteFrameWithFileName("boom1.png");
        boomAnimation->addSpriteFrameWithFileName("boom2.png");
        boomAnimation->addSpriteFrameWithFileName("boom3.png");
        boomAnimation->addSpriteFrameWithFileName("boom4.png");
        boomAnimation->addSpriteFrameWithFileName("boom5.png");
        boomAnimation->setDelayPerUnit(0.1f);
        boomAnimation->setRestoreOriginalFrame(true);
        boom->runAction(CCSequence::create(CCAnimate::create(boomAnimation),CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
    }
    void GameObjEnemy::releasebullet(){
        CCSize size = CCDirector::sharedDirector()->getWinSize();
        CCPoint pos = this->getPosition();
        if(pos.y > 20 && pos.y < size.height && islife){
           GameMain *p = (GameMain *) this->getParent();
           p->releaseenemyBullet(pos.x,pos.y - 30);
        }
    }
    void GameObjEnemy::onExit()
    {
        CCNode::onExit();
    }
    void GameObjEnemy::setType(short var){
        type = var;
    }
    void GameObjEnemy::restart(){
        mainbody->setVisible(true);
        boom->setVisible(false);
        CCSize size = CCDirector::sharedDirector()->getWinSize();
        this->setPosition(ccp(size.width/4 * type,size.height + 50));
        islife = true;
        mainbody->setVisible(true);
        boom->setVisible(false);
        this->movestart();
    }
    void GameObjEnemy::movestart(){
        islife = true;
        int type = CCRANDOM_0_1() * 4;
        //贝塞尔曲线移动
        ccBezierConfig bezier2;
        bezier2.controlPoint_1 = CCPointMake(this->getPosition().x - 400,330);
        bezier2.controlPoint_2 = CCPointMake(this->getPosition().x + 400,280);
        bezier2.endPosition = CCPointMake(this->getPosition().x,-70);
        CCBezierTo * bezierBy2 = CCBezierTo::create(6, bezier2);
        ccBezierConfig bezier1;
        bezier1.controlPoint_1 = CCPointMake(this->getPosition().x + 400,330);
        bezier1.controlPoint_2 = CCPointMake(this->getPosition().x - 400,280);
        bezier1.endPosition = CCPointMake(this->getPosition().x,-70);
        CCBezierTo * bezierBy1 = CCBezierTo::create(6, bezier1);
        switch(type){
            case 0:
            case 1:
               this->runAction(CCSequence::create(CCMoveBy::create(6,ccp(0,-600)),CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
                break;
            case 2:
                this->runAction(CCSequence::create(bezierBy2,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
                break;
            case 3:
                this->runAction(CCSequence::create(bezierBy1,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::restart)),NULL));
                break;
            
        }
        schedule(schedule_selector(GameObjEnemy::releasebullet), 1.2f);
    }

    3.3 鱼骨子弹

    GameHeroBullet.h

     

    #ifndef example15_1_GameHeroBullet_h
    #define example15_1_GameHeroBullet_h
    #include "cocos2d.h"
    using namespace cocos2d;
    
    class GameHeroBullet : public CCNode
    {
    public:
        bool isvisable;
        GameHeroBullet(void);
        virtual ~GameHeroBullet(void);
        void setIsVisable();
        void setIsNotVisable();
        bool getIsvisble();
        virtual void onEnter();
        virtual void onExit();    
    };
    
    #endif

    GameHeroBullet.cpp

     

    #include "GameHeroBullet.h"
    
    GameHeroBullet::GameHeroBullet(void)
    {
        isvisable = false;
    }
    
    GameHeroBullet::~GameHeroBullet(void)
    {
    }
    void GameHeroBullet::setIsVisable(){
        //子弹移动,运行动作
        this->setVisible(true);
        isvisable = true;
        this->runAction(CCSequence::create(CCMoveTo::create((-this->getPosition().y + 550)/150,ccp(this->getPosition().x,550)),CCCallFuncN::create(this, callfuncN_selector(GameHeroBullet::setIsNotVisable)),NULL));;
    }
    void GameHeroBullet::setIsNotVisable(){
        this->setVisible(false);
        isvisable = false;
        this->stopAllActions();
    }
    bool GameHeroBullet::getIsvisble(){
        return isvisable;
    }
    void GameHeroBullet::onEnter()
    {
        CCNode::onEnter();
        //初始化主体
        this->setContentSize(CCSizeMake(21,52));
        CCSprite *mainbody = CCSprite::create("YuGuZD.png");
        addChild(mainbody);
    }
    void GameHeroBullet::onExit()
    {
        CCNode::onExit();
    }

    3.4  试管子弹

    GameEnemyBullet.h

     

    #ifndef example15_1_GameEnemyBullet_h
    #define example15_1_GameEnemyBullet_h
    #include "cocos2d.h"
    using namespace cocos2d;
    
    class GameEnemyBullet : public CCNode
    {
    public:
        bool isvisable;
        GameEnemyBullet(void);
        virtual ~GameEnemyBullet(void);
        void setIsVisable();
        void setIsNotVisable();
        bool getIsvisble();
        virtual void onEnter();
        virtual void onExit();    
    };
    
    #endif


    GameEnemyBullet.cpp

     

    #include "GameEnemyBullet.h"
    
    GameEnemyBullet::GameEnemyBullet(void)
    {
        isvisable = false;
    }
    
    GameEnemyBullet::~GameEnemyBullet(void)
    {
    }
    void GameEnemyBullet::onEnter()
    {
        CCNode::onEnter();
        //初始化主体
        this->setContentSize(CCSizeMake(21,52));
        CCSprite *mainbody = CCSprite::create("DrDogZD.png");
        mainbody->runAction(CCRepeatForever::create(CCRotateBy::create(1,360)));
        addChild(mainbody);
    }
    bool GameEnemyBullet::getIsvisble(){
        return isvisable;
    }
    void GameEnemyBullet::onExit()
    {
        CCNode::onExit();
    }
    void GameEnemyBullet::setIsVisable(){
        //运行动作
        this->setVisible(true);
        isvisable = true;
        this->runAction(CCRepeatForever::create(CCRotateBy::create(1,360)));
        this->runAction(CCSequence::create(CCMoveTo::create((this->getPosition().y + 50)/150,ccp(this->getPosition().x,-50)),CCCallFuncN::create(this, callfuncN_selector(GameEnemyBullet::setIsNotVisable)),NULL));;
    }
    void GameEnemyBullet::setIsNotVisable(){
        this->setVisible(false);
        isvisable = false;
        this->stopAllActions();
    }

    3.5 游戏分数实现

    GameMark.h

     

    #ifndef example15_1_GameMark_h
    #define example15_1_GameMark_h
    
    #include "cocos2d.h"
    using namespace cocos2d;
    
    class GameMark : public CCNode
    {
    public:
        GameMark(void);
        virtual ~GameMark(void);
        virtual void onEnter();
        virtual void onExit();
        CCArray *bits;
        int mark;
        void addnumber(int var);
        CCTexture2D* ui;
    };
    
    #endif

    GameMark.cpp

     

    #include "GameMark.h"
    GameMark::GameMark(void)
    {
    }
    
    GameMark::~GameMark(void)
    {
    }
    void GameMark::onExit()
    {
        CCNode::onExit();
    }
    void GameMark::onEnter()
    {
        CCNode::onEnter();
        CCSize size = CCDirector::sharedDirector()->getWinSize(); 
        this->setContentSize(size);
        bits = CCArray::create();
        //分数标题
        CCSprite *title = CCSprite::create("score.png");
        title->setPosition(ccp(size.width/2 + 40,size.height - 15));
        title->setScale(0.5);
        addChild(title);
        //数字按位设置
        for(int i = 0;i < 5;i ++){
            CCSprite * shu = CCSprite::create("shu.png");
            ui = shu->getTexture();
            shu->setScale(0.5);
            shu->setTextureRect(CCRectMake(234,0,26,31));
            shu->setPosition(ccp(size.width - 15 - i * 15,size.height - 15));
            bits->addObject(shu);
            addChild(shu);
        }
        bits->retain();
        mark = 0;
    }
    void GameMark::addnumber(int var){
        //分数,按位设置数字
        mark += var;
        int temp = mark % 10;
        if(temp > 0){
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(0))->setTextureRect(CCRectMake((temp - 1) * 26,0,26,31)); 
        }else{
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(0))->setTextureRect(CCRectMake(234,0,26,31)); 
        }
        temp = (mark % 100) / 10;
        if(temp > 0){
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(1))->setTextureRect(CCRectMake((temp - 1) * 26,0,26,31));  
     
        }else{
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(1))->setTextureRect(CCRectMake(234,0,26,31)); 
        }
        temp = (mark % 1000) / 100;
        if(temp > 0){
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(2))->setTextureRect(CCRectMake((temp - 1) * 26,0,26,31)); 
     
        }else{
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(2))->setTextureRect(CCRectMake(234,0,26,31));
        }
        temp = (mark % 10000) / 1000;
        if(temp > 0){
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(3))->setTextureRect(CCRectMake((temp - 1) * 26,0,26,31)); 
     
        }else{
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(3))->setTextureRect(CCRectMake(234,0,26,31)); 
        }
        temp = mark / 10000;
        if(temp > 0){
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(4))->setTextureRect(CCRectMake((temp - 1) * 26,0,26,31));  
     
        }else{
            ((CCSprite *)bits->objectAtIndex(0))->setTexture(ui);
            ((CCSprite *)bits->objectAtIndex(4))->setTextureRect(CCRectMake(234,0,26,31));
        }
    }

    3.6 游戏主模块的实现

    GameScene.h

     

    #ifndef example15_1_GameScene_h
    #define example15_1_GameScene_h
    #include "cocos2d.h"
    #include "GameObjHero.h"
    #include "GameObjEnemy.h"
    #include "GameMark.h"
    using namespace cocos2d;
    class GameMain : public cocos2d::CCLayer
    {
    public:
        static GameMain sGameMain;
        CCSprite *blood1;
        CCSprite *blood2;
        CCSprite *blood3;
        CCSprite *bg1;
        CCSprite *bg2;
        short blood;
        CCArray *bullets;
        CCArray *enemybullets;
        void menuBackCallback();
        bool isreduce;
        bool isover;
        GameObjHero *hero;
        void setover();
        CCSprite* gameover;
        CCArray *enemys;
        virtual bool init();
        virtual void update(float time);
        static cocos2d::CCScene* scene();
        void releaseenemyBullet(int x,int y);
        void releaseheroBullet(int x,int y);
        bool isCollion(CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2);
        void setherohurt();
        void resetreduce();
        GameMark* gamemark;
        CREATE_FUNC(GameMain);
    };
    
    #endif

    GameScene.cpp

     

    #include "GameAboutScene.h"
    #include "GameMenuScene.h"
    #include "GameScene.h"
    #include "GameObjHero.h"
    #include "GameHeroBullet.h"
    #include "GameEnemyBullet.h"
    
    using namespace cocos2d;
    
    CCScene* GameMain::scene()
    {
        CCScene *scene = CCScene::create();
        
        GameMain *layer = GameMain::create();
        
        scene->addChild(layer);
        
        return scene;
    }
    void GameMain::releaseenemyBullet(int x,int y){
        //遍历子弹数组,不在使用的子弹释放
        for(int i = 0;i < enemybullets->capacity();i ++){
            if(!((GameEnemyBullet *)enemybullets->objectAtIndex(i))->getIsvisble()){
               //设置位置,并设置为显示
               ((GameEnemyBullet *)enemybullets->objectAtIndex(i))->setPosition(ccp(x,y));
               ((GameEnemyBullet *)enemybullets->objectAtIndex(i))->setIsVisable();
               break; 
            }
        }
    }
    void GameMain::releaseheroBullet(int x,int y){
        //遍历子弹数组,不在使用的子弹释放
        for(int i = 0;i < bullets->capacity();i ++){
            if(!((GameHeroBullet *)bullets->objectAtIndex(i))->getIsvisble()){
                //设置位置,并设置为显示
                ((GameHeroBullet *)bullets->objectAtIndex(i))->setPosition(ccp(x,y));
                ((GameHeroBullet *)bullets->objectAtIndex(i))->setIsVisable();
                break; 
            }
        }
    }
    bool GameMain::init()
    {
        if ( !CCLayer::init() )
        {
            return false;
        }
        
        CCSize size = CCDirector::sharedDirector()->getWinSize();    
        //创建背景
        bg1 = CCSprite::create("bg.png");
        bg1->setScale(0.5);
        bg2 = CCSprite::create("bg.png");
        bg2->setScale(0.5);
        bg1->setAnchorPoint(ccp(0,0));
    	bg2->setAnchorPoint(ccp(0,0));
    	bg1->setPosition( ccp(0,0) );
    	bg2->setPosition( ccp(0,size.height) );
    	this->addChild(bg1, 0);
    	this->addChild(bg2, 0);
        //创建主角
        hero = new GameObjHero();
        hero->setPosition(ccp(size.width/2,-50));
        hero->setScale(0.5);
        addChild(hero,2,1);
        hero->runAction(CCMoveBy::create(0.5,ccp(0,150)));
        
        //创建敌人
        enemys = CCArray::create();
        for(int i = 0;i < 3;i ++){
            int type = i + 1;
            GameObjEnemy* enemy = new GameObjEnemy();
            enemy->setPosition(ccp(size.width/4 * type,size.height + 50));
            enemy->setScale(0.5);
            enemy->setType(type);
            enemys->addObject(enemy);
            addChild(enemy,1);
            enemy->movestart();
        }
        enemys->retain();
        //创建血量ui
        blood = 3;
        CCSpriteBatchNode* ui = CCSpriteBatchNode::create("cat.png");
        //CCNode *ui = CCNode::create();
    //    blood1 = CCSprite::create(ui->getTexture());
        blood1 = CCSprite::createWithTexture(ui->getTexture());
        
        blood1->setPosition(ccp(20,size.height - 20));
        blood1->setScale(0.2);
        ui->addChild(blood1);
        blood2 = CCSprite::createWithTexture(ui->getTexture());
        blood2->setPosition(ccp(50,size.height - 20));
        blood2->setScale(0.2);
        ui->addChild(blood2);
        blood3 = CCSprite::createWithTexture(ui->getTexture());
        blood3->setPosition(ccp(80,size.height - 20));
        blood3->setScale(0.2);
        ui->addChild(blood3);
        addChild(ui,4);
        //初始化主角子弹
        bullets = CCArray::create();
    	for(int i = 0;i < bullets->capacity();i ++){
            GameHeroBullet * mybullet = new GameHeroBullet();
            mybullet->setIsNotVisable();
            mybullet->setScale(0.5);
            bullets->addObject(mybullet);
            this->addChild(mybullet,3);
    	}
        //初始化敌人子弹
    	bullets->retain();
    	enemybullets = CCArray::create();
    	for(int i = 0;i < enemybullets->capacity();i ++){
            GameEnemyBullet * mybullet = new GameEnemyBullet();
            mybullet->setIsNotVisable();
            mybullet->setScale(0.5);
            enemybullets->addObject(mybullet);
            this->addChild(mybullet,3);
    	}
        gamemark = new GameMark();
        addChild(gamemark,4);
    	enemybullets->retain();
        //初始化游戏结束弹板及按钮
        gameover = CCSprite::create("gameover.png");
        gameover->setAnchorPoint(ccp(0.5,0.5));
        gameover->setPosition(ccp(0,0));
        gameover->setPosition(ccp(size.width/2,size.height/2 + 70));
        gameover->setVisible(false);
        gameover->setScale(0.5);
        addChild(gameover,5);
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create("back.png","back.png",
                                                              this,menu_selector(GameMain::menuBackCallback) );
        pCloseItem->setPosition( ccp(size.width/2,size.height/2 - 50) );
        pCloseItem->setScale(0.5);
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition( CCPointZero );
        this->addChild(pMenu,5,25);
        pMenu->setVisible(false);
        pMenu->setEnabled(false);
    	isreduce = false;
        isover = false;
        scheduleUpdate();
        return true;
    }
    void GameMain::menuBackCallback(){
        CCDirector::sharedDirector()->replaceScene(GameMenu::scene());
    }
    bool GameMain::isCollion(CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2){
        //判断两个矩形是否碰撞
        if(abs(p1.x - p2.x) < w1 + w2 && abs(p1.y - p2.y) < h1 + h2){
            return true;
        }
        return false;
    }
    void GameMain::setover(){
        //设置游戏结束
        CCMenu* pMenu = (CCMenu *)this->getChildByTag(25);
        pMenu->setVisible(true);
        pMenu->setEnabled(true);
        gameover->setVisible(true);
        gameover->setScale(0);
        pMenu->setScale(0);
        pMenu->runAction(CCScaleTo::create(0.5,1));
        gameover->runAction(CCScaleTo::create(0.5,0.5));
    }
    void GameMain::setherohurt(){
        //主角受伤,减血
        hero->stopAllActions();
    	switch(blood){
            case 3:
                blood1->setVisible(false);
                blood --;
                break;
            case 2:
                blood2->setVisible(false);
                blood --;
                break;
            case 1:
                blood3->setVisible(false);
                blood --;
                break;
            case 0:
                if(! isover){
                   isover = true;
                   setover();
                }
                break;
    	}
    	CCActionInterval*  action = CCBlink::create(5, 10);
    	hero->runAction(action);
    	schedule(schedule_selector(GameMain::resetreduce), 5.0f);
    	isreduce = true;
    }
    void GameMain::resetreduce(){
        isreduce = false;
    }
    void GameMain::update(float time){
        //背景移动逻辑
        bg1->setPosition(ccp(bg1->getPosition().x,bg1->getPosition().y - 2));
    	bg2->setPosition(ccp(bg2->getPosition().x,bg2->getPosition().y - 2));
    	if(bg2->getPosition().y < 0){
            float temp = bg2->getPosition().y + 480;
            bg1->setPosition(ccp(bg2->getPosition().x,temp));
    	}
    	if(bg1->getPosition().y < 0){
            float temp = bg1->getPosition().y + 480;
            bg2->setPosition(ccp(bg1->getPosition().x,temp));
    	}
        CCPoint hpos = hero->getPosition();
        //敌人和子弹碰撞检测
        for(int i = 0;i < 3;i ++){
            GameObjEnemy * enemy = ((GameObjEnemy *) enemys->objectAtIndex(i));
            CCPoint epos = enemy->getPosition();
            if(enemy->islife){
               for(int i = 0;i < bullets->capacity();i ++){
                   if(((GameHeroBullet *)bullets->objectAtIndex(i))->getIsvisble()){
                       if(isCollion(((GameHeroBullet *)bullets->objectAtIndex(i))->getPosition(),epos,5,13,21,28)){
                           enemy->setdie();
                           gamemark->addnumber(200);
                           break;
                       }
                   }
               }
            }
            if(!isreduce && enemy->islife && isCollion(hpos,epos,21,22.5,21,28)){
                enemy->setdie();
                setherohurt();
            }
        }
        //主角和敌人子弹碰撞
        if(!isreduce){
           for(int i = 0;i < enemybullets->capacity();i ++){
               if(isCollion(hpos,((GameEnemyBullet *)enemybullets->objectAtIndex(i))->getPosition(),21,22.5,5,13)){
                   setherohurt();
               }
           }
        }
    }

    3.7  主菜单

    GameMenuScene.h

    #ifndef example15_1_GameMenuScene_h
    #define example15_1_GameMenuScene_h
    
    #include "cocos2d.h"
    using namespace cocos2d;
    class GameMenu : public cocos2d::CCLayer
    {
    public:
        bool issound;
        
        CCMenuItemImage *soundItem;
        
        virtual bool init();
        
        virtual void onEnter();
        
        virtual void onExit();
        
        static cocos2d::CCScene* scene();
        
        void menuEnter();
        
        void menuNewGameCallback(CCObject* pSender);
        
        void menuContinueCallback(CCObject* pSender);
        
        void menuAboutCallback(CCObject* pSender);
        
        void menuSoundCallback(CCObject* pSender);
        
        CREATE_FUNC(GameMenu);
    };
    
    #endif

    GameMenuScene.cpp

    #include "GameMenuScene.h"
    #include "GameAboutScene.h"
    #include "GameScene.h"
    #include "SimpleAudioEngine.h"
    
    using namespace cocos2d;
    using namespace CocosDenshion;
    
    CCScene* GameMenu::scene()
    {
        CCScene *scene = CCScene::create();
        
        GameMenu *layer = GameMenu::create();
        
        scene->addChild(layer);
        
        return scene;
    }
    bool GameMenu::init()
    {
        if ( !CCLayer::init() )
        {
            return false;
        }
        
        CCSize size = CCDirector::sharedDirector()->getWinSize();    
    
        //初始化背景
        CCSprite* bg = CCSprite::create("bg.png");
        bg->setScale(0.5);
        bg->setPosition( ccp(size.width/2, size.height/2) );
        this->addChild(bg, 0,0);
        //初始化背景星球
        CCSprite*bgstar = CCSprite::create("moon.png");
        bgstar->setAnchorPoint(ccp(0.5,0));
        bgstar->setScale(0.5);
        bgstar->setPosition(ccp(size.width/3 * 2, 0));
        this->addChild(bgstar,1,1);
        //初始化标题
        CCNode *title = CCNode::create();
        title->setContentSize(CCSizeMake(size.width - 40,50));
        CCSprite *ptmLabel = CCSprite::create("meowstar.png");
        ptmLabel->setScale(0.5);
        ptmLabel->setPosition( ccp(0,30) );
        title->addChild(ptmLabel);
        CCSprite *ptbLabel = CCSprite::create("battle.png");
        ptbLabel->setScale(0.5);
        ptbLabel->setPosition( ccp(0,-30) );
        title->addChild(ptbLabel);
        title->setPosition(ccp(size.width / 2, size.height - 80));
        this->addChild(title,2,2);
        //初始化按钮
        CCMenuItemImage *newGameItem = CCMenuItemImage::create("newgameA.png", "newgameB.png",this,menu_selector(GameMenu::menuNewGameCallback));
        newGameItem->setScale(0.5);
        newGameItem->setPosition(ccp(size.width / 2,size.height / 2 - 20));
        newGameItem->setEnabled(false);
        CCMenuItemImage *continueItem = CCMenuItemImage::create("continueA.png", "continueB.png",this,menu_selector(GameMenu::menuContinueCallback));
        continueItem->setScale(0.5);
        continueItem->setPosition(ccp(size.width / 2,size.height / 2 - 80));
        continueItem->setEnabled(false);
        CCMenuItemImage *aboutItem = CCMenuItemImage::create("aboutA.png", "aboutB.png",this,menu_selector(GameMenu::menuAboutCallback));
        aboutItem->setScale(0.5);
        aboutItem->setPosition(ccp(size.width / 2,size.height / 2 - 140));
        aboutItem->setEnabled(false);
        soundItem = CCMenuItemImage::create("sound-on-A.png", "sound-on-B.png",this,menu_selector(GameMenu::menuSoundCallback));
        soundItem->setScale(0.5);
        soundItem->setEnabled(false);
        soundItem->setPosition(ccp(40,40));
        //使用按钮创建菜单
        CCMenu* mainmenu = CCMenu::create(newGameItem,continueItem,aboutItem,soundItem,NULL);
        mainmenu->setPosition(ccp(0,0));
        this->addChild(mainmenu,1,3);
        //初始化声音部分
        issound = true;//是否开启声音参数
        SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("background.mp3") );
        SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
        SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("background.mp3")).c_str(), true);
        return true;
    }
    void GameMenu::onEnter(){
        CCLayer::onEnter();
        CCSize size = CCDirector::sharedDirector()->getWinSize();
        //界面进入时,运行菜单项进入动作
        CCNode* mainmenu = this->getChildByTag(3);
        mainmenu->setPositionX(-200);
        mainmenu->runAction(CCSequence::create(CCEaseElasticIn::create(CCMoveTo::create(0.5,ccp(0,0))),CCCallFuncN::create(this, callfuncN_selector(GameMenu::menuEnter)),NULL));
        
        CCNode*title = this->getChildByTag(2);
        title->setPositionY(size.height + 20);
        title->runAction(CCEaseElasticIn::create(CCMoveBy::create(0.5,ccp(0,-100))));
        
        CCNode*bgstar = this->getChildByTag(1);
        bgstar->setPositionX(size.width/3);
        bgstar->runAction(CCMoveBy::create(0.5,ccp(size.width/3,0)));
        
    }
    void GameMenu::menuEnter(){
        //菜单进入后,菜单项点击有效
        CCNode* mainmenu = this->getChildByTag(3);
        CCArray* temp = mainmenu->getChildren();
        for(int i = 0;i < temp->count();i ++)
            ((CCMenuItemImage *)temp->objectAtIndex(i))->setEnabled(true);
    }
    void GameMenu::onExit(){
        CCLayer::onExit();
    }
    void GameMenu::menuNewGameCallback(CCObject* pSender)
    {
        CCDirector::sharedDirector()->replaceScene(GameMain::scene());
    }
    void GameMenu::menuContinueCallback(CCObject* pSender)
    {
        CCDirector::sharedDirector()->replaceScene(GameMain::scene());
    }
    void GameMenu::menuAboutCallback(CCObject* pSender)
    {
        CCDirector::sharedDirector()->replaceScene(GameAbout::scene());
    }
    void GameMenu::menuSoundCallback(CCObject* pSender)
    {
        if(! issound){
            soundItem->setNormalImage(CCSprite::create("sound-on-A.png"));
            soundItem->setDisabledImage(CCSprite::create("sound-on-B.png"));
            SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("background.mp3")).c_str(), true);
           issound = true;
        }else{
            soundItem->setNormalImage(CCSprite::create("sound-off-A.png"));
            soundItem->setDisabledImage(CCSprite::create("sound-off-B.png"));
             SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
           issound = false;
        }
    }

    3.8  关于界面的实现

    GameAboutScene.h

     

    #ifndef example15_1_GameAboutScene_h
    #define example15_1_GameAboutScene_h
    #include "cocos2d.h"
    using namespace cocos2d;
    class GameAbout : public cocos2d::CCLayer
    {
    public:
        
        virtual bool init();
        
        virtual void onEnter();
        
        virtual void onExit();
        
        static cocos2d::CCScene* scene();
        
        void menuBackCallback(CCObject* pSender);
        
        void menuEnter();
        
        CREATE_FUNC(GameAbout);
    };
    
    #endif

    GameAboutScene.cpp

     

    #include "GameAboutScene.h"
    #include "GameMenuScene.h"
    
    using namespace cocos2d;
    
    CCScene* GameAbout::scene()
    {
        CCScene *scene = CCScene::create();
        
        GameAbout *layer = GameAbout::create();
        
        scene->addChild(layer);
        
        return scene;
    }
    bool GameAbout::init()
    {
        if ( !CCLayer::init() )
        {
            return false;
        }
        
        CCSize size = CCDirector::sharedDirector()->getWinSize();    
        //初始化背景
        CCSprite* bg = CCSprite::create("bg.png");
        bg->setScale(0.5);
        bg->setPosition( ccp(size.width/2, size.height/2) );
        this->addChild(bg, 0,0);
        //初始化星球
        CCSprite*bgstar = CCSprite::create("moon.png");
        bgstar->setAnchorPoint(ccp(0.5,0));
        bgstar->setScale(0.5);
        bgstar->setPosition(ccp(size.width/3 * 1, 0));
        this->addChild(bgstar,1,1);
        //初始化关于框
        CCSprite*kuang = CCSprite::create("tb.png");
        kuang->setScale(0.5);
        kuang->setPosition(ccp(size.width/2, size.height/2));
        this->addChild(kuang,2,2);
        char inf[256];
        sprintf(inf,"name:meow war
    
    program:shuoquan man
    
    art design:peng xu
    
    company:hz books
    
        powered by cocos2D-x");
    //    CCLabelTTF * myjineng = CCLabelTTF::create(inf,CCSizeMake(400,400),kCCTextAlignmentLeft, "Marker Felt", 40);
        
        CCLabelTTF * myjineng = CCLabelTTF::create(inf, "Marker Felt", 40, CCSizeMake(400,400), kCCTextAlignmentLeft);
                                                   
        myjineng->setAnchorPoint(ccp(0,1));
        myjineng->setColor(ccc3(200,200,200));
        myjineng->setPosition(ccp(50,600));
        kuang->addChild(myjineng);
        //初始化关于标题
        CCSprite*abouttitle = CCSprite::create("about.png");
        abouttitle->setScale(0.5);
        abouttitle->setPosition(ccp(size.width/2, size.height - 20));
        this->addChild(abouttitle,3,3);
        //初始化返回按钮
        CCMenuItemImage *back = CCMenuItemImage::create("backA.png", "backB.png",this,menu_selector(GameAbout::menuBackCallback));
        back->setScale(0.5);
        back->setPosition(ccp(size.width - 20,size.height - 20));
        back->setEnabled(false);
        CCMenu* mainmenu = CCMenu::create(back,NULL);
        mainmenu->setPosition(ccp(0,0));
        this->addChild(mainmenu,3,4);
        return true;
    }
    void GameAbout::menuBackCallback(CCObject* pSender){
        CCDirector::sharedDirector()->replaceScene(GameMenu::scene());
    }
    void GameAbout::menuEnter(){
        //菜单进入后,菜单项点击有效
        CCNode* mainmenu = this->getChildByTag(4);
        CCArray* temp = mainmenu->getChildren();
        ((CCMenuItemImage *)temp->objectAtIndex(0))->setEnabled(true);
    }
    void GameAbout::onExit(){
        CCLayer::onExit();
    }
    void GameAbout::onEnter(){
        CCLayer::onEnter();
        //界面进入时,运行菜单项进入动作
        CCSize size = CCDirector::sharedDirector()->getWinSize();
        CCNode* mainmenu = this->getChildByTag(4);
        mainmenu->setPositionX(-100);
        mainmenu->runAction(CCSequence::create(CCEaseElasticIn::create(CCMoveBy::create(0.5,ccp(100,0))),CCCallFuncN::create(this, callfuncN_selector(GameAbout::menuEnter)),NULL));
        //加速度动作
        CCNode*title = this->getChildByTag(3);
        title->setPositionY(size.height + 20);
        title->runAction(CCEaseElasticIn::create(CCMoveBy::create(0.5,ccp(0,-40))));
        
        CCNode*bgstar = this->getChildByTag(1);
        bgstar->setPositionX(size.width/3 * 2);
        bgstar->runAction(CCMoveBy::create(0.5,ccp(-size.width/3,0)));
        
        CCNode*kuang = this->getChildByTag(2);
        kuang->setPositionX(-200);
        kuang->runAction(CCEaseElasticIn::create(CCMoveTo::create(0.5,ccp(size.width/2,size.height/2))));
        
    }

    到此结束了!

    参考书籍《Cocos2d-x 权威指南》


    Demo下载地址:http://download.csdn.net/detail/my183100521/6036929

  • 相关阅读:
    一张图带你了解数据分析的完整流程,建议收藏
    【Unnatural × Lemon × 武汉】如果病毒结束了,你最想干什么事
    两万字深度介绍分布式系统原理!【收藏版】
    ETL的基础知识,看完你就全明白了!
    Java最大不重复子串
    一文速懂利用python字典的引用传递实现循环套娃(嵌套)
    ETSI GS MEC 015,MEP 带宽管理 API
    laravel 5.5 ajax返回错误信息
    laravel 5.5 ajax返回错误信息
    从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择
  • 原文地址:https://www.cnblogs.com/pangblog/p/3292167.html
Copyright © 2020-2023  润新知