博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-x学习日志(10) --射击游戏(喵星战争)
阅读量:5864 次
发布时间:2019-06-19

本文共 32606 字,大约阅读时间需要 108 分钟。

转载请标明:转载自【小枫栏目】,博文链接: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\n\nprogram:shuoquan man\n\nart design:peng xu\n\ncompany:hz books\n\n    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

 

 

你可能感兴趣的文章
[转]ASP.NET Core 中间件详解及项目实战
查看>>
eclipse编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
查看>>
iOS动画篇:核心动画
查看>>
第一篇:《UNIX 环境高级编程》编译环境的搭建
查看>>
人脸关键点检测算法
查看>>
事物与数据库锁的关系(锁只是数据库事物一方面)
查看>>
《Qt数据类型》--QByteArray,QString,int,hex之间的转化
查看>>
vue知识点总结
查看>>
linux-程序发布脚本
查看>>
ps如何制作gif(窗口->动画)(导出:存储为Web和设备所用格式)
查看>>
git: windows git ssh keys生成
查看>>
如何快速搜索SQL数据库数据和对象
查看>>
[原][osg][oe]分析一块倾斜摄影瓦片的数据
查看>>
正则表达式在线生成工具
查看>>
第二章 排序 || 第18节 有序矩阵查找练习题
查看>>
虚拟机“锁定文件失败”、“打不开磁盘”或者“它所依赖的某个快照磁盘”的解决办法...
查看>>
MyBatis动态创建表
查看>>
mysql中tinyint、smallint、mediumint,int 和bigint 的区别
查看>>
机器学习面试干货精讲
查看>>
Vue-lazyload的使用
查看>>