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

cocos2d-x学习日志(10) --射击游戏(喵星战争)的更多相关文章

  1. Unity3D--学习太空射击游戏制作(一)

    近期买了本书在学习一些Unity3D的东西,在了解了Unity3D工具的基本面板后开始学习一个太空射击游戏的开发过程. 首先下载一个关于本游戏的资源文件,(百度云下载地址:http://pan.bai ...

  2. 我的游戏学习日志3——三国志GBA

    我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...

  3. 一款简单射击游戏IOS源码

    源码描述: 一款基于cocos2d的简单设计游戏,并且也是一款基于cocos2d的简单射击游戏(含苹果IAD广告), 游戏操作很简单,哪个数字大就点击射击哪个.里面有苹果iad广告,功能简单完整,适合 ...

  4. Android开发人员必须掌握的10 个开发工具+应该深入学习的10个开源应用项目

    一.Android开发人员必须掌握的10 个开发工具 Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. ...

  5. 使用Cocos2dx-JS开发一个飞行射击游戏

    一.前言 笔者闲来无事,某天github闲逛,看到了游戏引擎的专题,引起了自己的兴趣,于是就自己捣腾了一下Cocos2dx-JS.由于是学习,所谓纸上得来终觉浅,只是看文档看sample看demo,并 ...

  6. 简单的射击游戏HTML+JS实现

    一直想自己写一个游戏玩,时间和精力都不太允许,最近几天刚好有空闲时间,就琢磨了这个小游戏. 刚开始想着计算图片重叠事件,然后让炮弹和飞机消失,傻乎乎写了一天,越整越乱.今天一大早晕过来了,改用数组以后 ...

  7. Skytte:一款令人印象深刻的 HTML5 射击游戏

    Skytte 是一款浏览器里的 2D 射击游戏.使用 Canvas 元素和大量的 JavaScript 代码实现.Skytte 是用我们的开源和现代的前端技术创造的.经典,快节奏的横向滚动射击游戏,探 ...

  8. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇08:弹幕系统》本系列完结

    8.弹幕系统 弹幕系统概述: 弹幕系统的设计体现了射击游戏的基本要素,玩家要在敌人放出的大量子弹(弹幕)的细小空隙间闪避,能在玩家闪躲弹幕的时候给玩家带来快感,接近满屏的子弹,增加了对玩家的视觉冲击力 ...

  9. Unity3D--学习太空射击游戏制作(二)

    步骤三:创建主角 游戏的主角是一艘太空飞船,我们将使用一个飞船模型作为游戏的主角,并赋予他一个脚本,控制他的运动,游戏体的组件必须依赖于脚本才能运行. 01:在Project窗口找到Player.fb ...

随机推荐

  1. 带OpenSSL和MySQL的静态编译版本~

    http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ http://www.npcglib.org/~stathis/blog/preco ...

  2. ASP.NET MVC 5 学习教程:添加视图

    原文 ASP.NET MVC 5 学习教程:添加视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...

  3. 17.1.1 How to Set Up Replication

    17.1.1 How to Set Up Replication 17.1.1.1 Setting the Replication Master Configuration 17.1.1.2 Sett ...

  4. stm32内部的CAN总线

    功能概述: bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B:它的设计目标是以最小的CPU负载来高效处理大量的报文.它也支持报文发送的优先级 ...

  5. 将一个int转成二进制c

    /* 由于是2位 十进制整数,所以转化后可以存 一个int 型中: reverse函数 提供了这种转化 如果需要转化的数字比较大int存不下,则需要数组来存 */ #include<stdio. ...

  6. mysql的基础操作

    查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. mysql> show databases; 创建数据库 mysql> create d ...

  7. e-mail Web端管理

    邮件是和上海的一家微软的代理商合作的,管理很方便,但是目前感觉他家的邮件过滤机制有问题.

  8. stm32中断优先级

    VIC_IRQChannelPreemptionPriority:先占优先级  NVIC_IRQChannelSubPriority:从优先级 高先占优先级中断可以打断低先占优先级的中断,即可中断嵌套 ...

  9. 关于Dropdownlist使用的心得体会

    2013-07-23关于Dropdownlist使用的心得体会: Dropdownlist使用最多的几个属性: 一.Dropdownlist.Items,负责包含所有选项的容器 DropDownLis ...

  10. 64位CentOS6.2安装erlang及rabbitmqServer

    CentOS 6.2 64bit 安装erlang及RabbitMQ Server 1.操作系统环境(CentOS 6.2 64bit) [root@HAproxy ~]# cat /etc/issu ...