转载请标明:转载自【小枫栏目】,博文链接: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