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

时间:2021-05-20 13:16:27

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

一、纵版射击游戏的特点

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

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

二、喵星战争简介

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

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

1) 游戏规则:

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

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

2)游戏框架和界面

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

主菜单和关于界面,如图

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

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

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

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