Cocos2d-x 3.0final 终结者系列教程13-贪食蛇游戏案例(全)

快过节了。谢谢了屈原,我们爱你。

应该多几个向屈大人一样跳江的,这样我们就能够放假纪念啦。

---------------------------------快过节了。弄个案例,大家最好还是假期做做,

执行效果展示:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Roam9i/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

所有代码和资源:

http://download.csdn.net/detail/sdhjob/7424329

1.准备资源

背景图片menuback.png:

节点图片

greenstar.png  

redstar.png     

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Roam9i/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

yellowstar.png 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Roam9i/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

2.创建一个新项目(怎样配置环境和创建新项目,參考前面教程):

cocos new -p com.xdl.game -l cpp -d ~/Desktop/test0515 snamegame

3.加入文件

首先将HelloWoldScene.h HelloWorld.cpp移走。然后加入GameScene.h GameScene.cpp HelpScene.h HelpScene.cpp MainMenu.h MainMenu.cpp

加上原来自己主动生成的AppDelegate.h 和AppDelegate.cpp共8个文件

4.编码

AppDelegate.h (这个文件基本没修改)

#ifndef  _APP_DELEGATE_H_

#define  _APP_DELEGATE_H_

#include "cocos2d.h"

class  AppDelegate : private cocos2d::Application

{

public:

AppDelegate();

virtual ~AppDelegate();

virtual bool applicationDidFinishLaunching();

virtual void applicationDidEnterBackground();

virtual void applicationWillEnterForeground();

};

#endif // _APP_DELEGATE_H_

AppDelegate.cpp

#include "AppDelegate.h"

#include "MainMenu.h"

#include "SimpleAudioEngine.h"

USING_NS_CC;

using namespace CocosDenshion;

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate()

{

}

bool AppDelegate::applicationDidFinishLaunching() {

// initialize director

auto director = Director::getInstance();

auto glview = director->getOpenGLView();

if(!glview) {

glview = GLView::create("My Game");

director->setOpenGLView(glview);

}

// turn on display FPS

director->setDisplayStats(false);

// set FPS. the default value is 1.0/60 if you don‘t call this

director->setAnimationInterval(1.0 /
60);

// create a scene. it‘s an autorelease object

    auto scene = MainMenu::createScene();

// run

director->runWithScene(scene);

    //開始播放背景音乐

    SimpleAudioEngine::getInstance()->playBackgroundMusic("background.mp3");

return true;

}

// This function will be called when the app is inactive. When comes a phone call,it‘s be invoked too

void AppDelegate::applicationDidEnterBackground() {

Director::getInstance()->stopAnimation();

// if you use SimpleAudioEngine, it must be pause

    SimpleAudioEngine::getInstance()->pauseBackgroundMusic();

}

// this function will be called when the app is active again

void AppDelegate::applicationWillEnterForeground() {

Director::getInstance()->startAnimation();

// if you use SimpleAudioEngine, it must resume here

    SimpleAudioEngine::getInstance()->resumeBackgroundMusic();

}

说明: 在入口类中增加了背景音乐的播放,而且入口场景设计为MainMenu,往下看

MainMenu.h

#ifndef __snakegame__MainMenu__

#define __snakegame__MainMenu__

#include "cocos2d.h"

USING_NS_CC;

class MainMenu:public
Layer{

public:

static Scene * createScene();

CREATE_FUNC(MainMenu);

virtual bool init();

void menuCallBack(Ref * object);

};

#endif

MainMenu.cpp

#include "MainMenu.h"

#include "GameScene.h"

#include "HelpScene.h"

Scene * MainMenu::createScene()

{   auto scene=Scene::create();

auto layer=MainMenu::create();

scene->addChild(layer);

return scene;

}

bool MainMenu::init(){

if(!Layer::init())

{

return false;

}

auto size=Director::getInstance()->getWinSize();

//加入背景

auto spriteBK=Sprite::create("menuback.png");

spriteBK->setPosition(Point(size.width/2,size.height/2));

this->addChild(spriteBK);

//加入2个菜单栏目

auto menuItemStart=MenuItemFont::create("Start",
CC_CALLBACK_1(MainMenu::menuCallBack,this));

menuItemStart->setTag(1);

auto menuItemHelp=MenuItemFont::create("Help",
CC_CALLBACK_1(MainMenu::menuCallBack,this));

menuItemHelp->setTag(2);

auto menu=Menu::create(menuItemStart,menuItemHelp,NULL);

menu->setPosition(Point::ZERO);

menuItemStart->setPosition(Point(size.width-menuItemStart->getContentSize().width-100,menuItemStart->getContentSize().height+10));

menuItemHelp->setPosition(Point(size.width-menuItemHelp->getContentSize().width-10,menuItemHelp->getContentSize().height+10));

this->addChild(menu);

return true;

}

void MainMenu::menuCallBack(Ref * object){

auto target=(Node *)object;

Scene * scene;

switch (target->getTag()) {

case
1://startgame

scene=Game::createScene();

break;

case 2://Helpgame

scene=Help::createScene();

break;

default:

break;

}

Director::getInstance()->replaceScene(scene);

}

说明:在菜单场景中实现了跳转到帮助场景和游戏场景,往下看:

HelpScene.h

#ifndef __snakegame__HelpScene__

#define __snakegame__HelpScene__

#include "cocos2d.h"

USING_NS_CC;

class Help:public Layer{

public:

static Scene * createScene();

CREATE_FUNC(Help);

virtual bool init();

void menuCallBack(Ref * object);

};

#endif

HelpScene.cpp

#include "HelpScene.h"

#include "MainMenu.h"

Scene * Help::createScene(){

auto scene=Scene::create();

auto layer=Help::create();

scene->addChild(layer);

return scene;

}

bool  Help::init(){

if(!Layer::init())

{

return  false;

}

auto size=Director::getInstance()->getWinSize();

//加入背景

auto spriteBK=Sprite::create("menuback.png");

spriteBK->setPosition(Point(size.width/2,size.height/2));

spriteBK->setOpacity(75);

this->addChild(spriteBK);

//帮助信息

auto labelScore=Label::create("帮助信息",
"宋体",
25);

labelScore->setPosition(Point(size.width-80,size.height-50));

this->addChild(labelScore);

//返回button

auto menuItemBack=MenuItemFont::create("Back",
CC_CALLBACK_1(Help::menuCallBack,this));

auto menu=Menu::create(menuItemBack,NULL);

menu->setPosition(Point::ZERO);

menuItemBack->setPosition(Point(size.width-menuItemBack->getContentSize().width-100,menuItemBack->getContentSize().height+10));

this->addChild(menu);

return true;

}

void  Help::menuCallBack(Ref * object){

auto scene=MainMenu::createScene();

Director::getInstance()->replaceScene(scene);

}

说明:这里仅仅是实现了一个帮助信息显示。能够返回到菜单。以下看游戏场景

GameScene.h

#ifndef __snakegame__GameScene__

#define __snakegame__GameScene__

#include "cocos2d.h"

USING_NS_CC;

enum class ENUM_DIR{

DIR_UP,

DIR_DOWN,

DIR_LEFT,

DIR_RIGHT,

DIR_STOP

};

class SnakeNode:public
Sprite

{

public :

enum ENUM_DIR m_dir;//移动方向

int nodeType;       //节点类型1蛇头 2
身体 3 食物

int m_row,m_col;    //当前节点的行列坐标

static SnakeNode* create(int type);

virtual bool init(int type);

void setPositionRC(int row,int col);//设置节点的坐标

};

class Game:public Layer{

public:

SnakeNode * spFood;//食物

SnakeNode * spHead;//蛇头

int m_score;

Vector<SnakeNode *> allBody;//身体

static Scene * createScene();

CREATE_FUNC(Game);

virtual bool init();

void menuCallBack(Ref * object);

void gameLogic(float t);

void newBody();//加入一个新的身体节点

void moveBody();//移动全部的身体节点

};

#endif

GameScene.cpp

//

//  GameScene.cpp

//  Created by 沈 shen on 14-5-27.

//

#include "GameScene.h"

#include "MainMenu.h"

#include "SimpleAudioEngine.h"

using namespace CocosDenshion;

Scene * Game::createScene(){

auto scene=Scene::create();

auto layer=Game::create();

scene->addChild(layer);

return scene;

}

SnakeNode* SnakeNode::create(int type)

{

SnakeNode *pRet = new SnakeNode();

if (pRet && pRet->init(type))

{

pRet->autorelease();

return pRet;

}

else

{

delete pRet;

pRet = NULL;

return NULL;

}

}

bool SnakeNode::init(int type){

if(!Sprite::init())

{

return false;

}

///依据类型不同初始化不同的纹理

switch (type) {

case 1://蛇头

{auto sprite=Sprite::create("redstar.png");

sprite->setAnchorPoint(Point::ZERO);

this->addChild(sprite);

m_dir=ENUM_DIR::DIR_RIGHT;//向右移动

}

break;

case 2://身体

{auto sprite=Sprite::create("greenstar.png");

sprite->setAnchorPoint(Point::ZERO);

this->addChild(sprite);

}

m_dir=ENUM_DIR::DIR_STOP;//

break;

case 3://食物

{auto sprite=Sprite::create("yellowstar.png");

sprite->setAnchorPoint(Point::ZERO);

this->addChild(sprite);

}

m_dir=ENUM_DIR::DIR_STOP;//

break;

default:

break;

}

return true;

}

void SnakeNode::setPositionRC(int row,int col)//设置节点的坐标

{    this->m_row=row;

this->m_col=col;

setPosition(Point(col*32,row*32));

}

bool  Game::init(){

if(!Layer::init())

{

return  false;

}

//加入地图

auto draw=DrawNode::create();

draw->setAnchorPoint(Point::ZERO);

draw->setPosition(Point::ZERO);

this->addChild(draw);

for(int i=0;i<11;i++)

{

draw->drawSegment(Point(0,32*i), Point(320,32*i),
1, Color4F(1,1,1,1));

draw->drawSegment(Point(32*i,0), Point(32*i,320),
1, Color4F(1,1,1,1));

}

//加入蛇头

spHead=SnakeNode::create(1);

this->addChild(spHead);

//加入身体

//加入食物

spFood=SnakeNode::create(3);

int row=rand()%10;

int col=rand()%10;

spFood->setPositionRC(row,col);

this->addChild(spFood);

auto size=Director::getInstance()->getWinSize();

//加入背景

auto spriteBK=Sprite::create("menuback.png");

spriteBK->setPosition(Point(size.width/2,size.height/2));

spriteBK->setOpacity(75);

this->addChild(spriteBK);

//分数显示

m_score=0;

auto labelScore=Label::create("分数:0",
"宋体",
25);

labelScore->setTag(110);

labelScore->setPosition(Point(size.width-80,size.height-50));

this->addChild(labelScore);

//返回button

auto menuItemBack=MenuItemFont::create("Back", CC_CALLBACK_1(Game::menuCallBack,this));

auto menu=Menu::create(menuItemBack,NULL);

menu->setPosition(Point::ZERO);

menuItemBack->setPosition(Point(size.width-menuItemBack->getContentSize().width-50,menuItemBack->getContentSize().height+10));

this->addChild(menu);

//计划任务

this->schedule(schedule_selector(Game::gameLogic),0.5);

//增加用户触摸事件侦听

auto listener=EventListenerTouchOneByOne::create();

listener->setSwallowTouches(true);

listener->onTouchBegan=[&](Touch * t,Event * e){

//改变贪食蛇移动的方向

int col=t->getLocation().x/32;

int row=t->getLocation().y/32;

int spHeadCol=spHead->getPositionX()/32;

int spHeadRow=spHead->getPositionY()/32;

if(abs(spHeadCol-col)>abs(spHeadRow-row))

{

if(spHeadCol<col)

{

spHead->m_dir=ENUM_DIR::DIR_RIGHT;

}else

{

spHead->m_dir=ENUM_DIR::DIR_LEFT;

}

}

else

{if(spHeadRow<row)

{

spHead->m_dir=ENUM_DIR::DIR_UP;

}else

{

spHead->m_dir=ENUM_DIR::DIR_DOWN;

}

}

return true;

};

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);

return true;

}

void  Game::menuCallBack(Ref * object){

auto scene=MainMenu::createScene();

Director::getInstance()->replaceScene(scene);

}

void Game::gameLogic(float t)

{   moveBody();//移动全部身体节点

//蛇头移动

switch (spHead->m_dir) {

case ENUM_DIR::DIR_RIGHT:

spHead->runAction(MoveBy::create(0.3, Point(32,0)));

spHead->m_col++;

break;

case ENUM_DIR::DIR_LEFT:

spHead->runAction(MoveBy::create(0.3, Point(-32,0)));

spHead->m_col--;

break;

case ENUM_DIR::DIR_DOWN:

spHead->runAction(MoveBy::create(0.3, Point(0,-32)));

spHead->m_row--;

break;

case ENUM_DIR::DIR_UP:

spHead->runAction(MoveBy::create(0.3, Point(0,32)));

spHead->m_row++;

break;

default:

break;

}

//碰撞检測

if(spHead->m_row==spFood->m_row&&

spHead->m_col==spFood->m_col)

{  //音效的播放

SimpleAudioEngine::getInstance()->playEffect("eat.wav");

//分数添加

this->m_score+=100;

Label * label=(Label *)this->getChildByTag(110);

char strscore[20];

sprintf(strscore, "分数:%d",m_score);

label->setString(strscore);

//食物产生新的位置

int row=rand()%10;

int col=rand()%10;

spFood->setPositionRC(row,col);

//加入节点

newBody();

}

}

void Game::newBody()//加入一个新的身体节点

{

auto bodynode=SnakeNode::create(2);

//设置这个节点的方向和坐标

if(allBody.size()>0)//有身体节点

{ //最后一个身体的节点

auto lastbody=allBody.at(allBody.size()-1);

bodynode->m_dir=lastbody->m_dir;

switch (bodynode->m_dir) {

case ENUM_DIR::DIR_UP:

bodynode->setPositionRC(lastbody->m_row-1, lastbody->m_col);

break;

case ENUM_DIR::DIR_DOWN:

bodynode->setPositionRC(lastbody->m_row+1, lastbody->m_col);

break;

case ENUM_DIR::DIR_LEFT:

bodynode->setPositionRC(lastbody->m_row, lastbody->m_col+1);

break;

case ENUM_DIR::DIR_RIGHT:

bodynode->setPositionRC(lastbody->m_row, lastbody->m_col-1);

break;

default:

break;

}

}else

{ //新节点的方向等于蛇头的方向

bodynode->m_dir=spHead->m_dir;

switch (bodynode->m_dir) {

case ENUM_DIR::DIR_UP:

bodynode->setPositionRC(spHead->m_row-1, spHead->m_col);

break;

case ENUM_DIR::DIR_DOWN:

bodynode->setPositionRC(spHead->m_row+1, spHead->m_col);

break;

case ENUM_DIR::DIR_LEFT:

bodynode->setPositionRC(spHead->m_row, spHead->m_col+1);

break;

case ENUM_DIR::DIR_RIGHT:

bodynode->setPositionRC(spHead->m_row, spHead->m_col-1);

break;

default:

break;

}

}

//加入节点到当前图层

this->addChild(bodynode);

//加入节点到集合中

allBody.pushBack(bodynode);

}

void Game::moveBody()//移动全部的身体节点

{

if(allBody.size()==0){return;}

for(auto bodynode:allBody)

{

switch (bodynode->m_dir) {

case ENUM_DIR::DIR_RIGHT:

bodynode->runAction(MoveBy::create(0.3, Point(32,0)));

bodynode->m_col++;

break;

case ENUM_DIR::DIR_LEFT:

bodynode->runAction(MoveBy::create(0.3, Point(-32,0)));

bodynode->m_col--;

break;

case ENUM_DIR::DIR_DOWN:

bodynode->runAction(MoveBy::create(0.3, Point(0,-32)));

bodynode->m_row--;

break;

case ENUM_DIR::DIR_UP:

bodynode->runAction(MoveBy::create(0.3, Point(0,32)));

bodynode->m_row++;

break;

default:

break;

}

}

//移动完毕之后,改变每一个body的方向

for(int i=allBody.size()-1;i>0;i--)

{ //每一个节点的
方向调整为它前一个节点的方向

allBody.at(i)->m_dir=allBody.at(i-1)->m_dir;

}

allBody.at(0)->m_dir=spHead->m_dir;

}

--------------------------------------------祝你成功-----------------------

原文地址:https://www.cnblogs.com/llguanli/p/8453504.html

时间: 2024-11-09 00:40:18

Cocos2d-x 3.0final 终结者系列教程13-贪食蛇游戏案例(全)的相关文章

Cocos2d-x 3.0final 终结者系列教程23CocosStudio UI组件使用大全Cocos2d-x3.2使用

最近忙死了,得空发表一篇关于所有的Cocostudio中的UI组件使用的教程,其实是对所有UI组件的Api介绍,作为手册收藏下吧!! CocosStudio UI组件 按钮UIButton 复选框UICheckBox 滑块UISlider 图片UIImageView 进度条UILoadingBar 纹理文本 UITextAtlas 字体文本 UIText 图片字体文本 UITextBMFont 文本区域 UITextField 布局组件 UILayout 滚动组件 UIScrollView 页面

Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

看到cocos2d-x推出了3.1版本,真是每月一次新版本,速度, 还有一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!!! 本文介绍一款纵版射击游戏的实现,开发环境: win7 vs2012 cocos2d-x3.0final android adt android ndk r9 首先看下最后的效果: (图1,微信飞机大战运行效果) 源码下载地址:http://download.csdn.net/detail/sdhjob/7513

Cocos2d-x 3.0final 终结者系列教程04-引擎架构分析

从前有个跟我学Android的学生,老是问我: 沈老师,为什么Android中的窗口叫Activity,为什么要在onCreate方法中写setContentView(R.layout.main)? 我说: 你能不能按照我教你的实现一个窗口 第一步在AndroidManifest.xml中添加一个Activity标签 第二步写一个类继承Activity并覆盖onCreate方法 他说: 我想知道为什么要实现Activity和onCreate方法,之后我才能完成这个练习. 我说: 你实现了Acti

Cocos2d-x 3.0final 终结者系列教程09-绘图节点Node中的Schedule

如何让HelloWorld项目中的HelloWorld文字实现自动运动呢? 有的童鞋会想到使用线程,不断修改Label的Position, 这样不行,因为在Cocos2d-x中只能在主线程中来修改Node中的信息,这是由于所有的node都是非线程安全的,如果我们的场景移除了node 在子线程种可能引用错误,所以,要让Node执行特定的变化,需要在当前的Node中使用Schedule 使用方法很简单 1.在当前的HelloWorldScne.h中添加一个方法在HelloWorldScene 如:

Cocos2d-x 3.0final 终结者系列教程10-绘图节点Node中的Action

Action是作用在Node上的逻辑处理,比如让Node移动.旋转.缩放.变色.跳跃.翻转.透明等等,都有相对应的Action Action如何在Node上使用 1.定义Action对象 如 auto act=MoveTo::create(Point(30,0),1); 2.在Node上执行runAction auto sp=Sprite::create("npc.png"); sp->runAction(act); 这样就实现了在sp这个Node上执行移动到30,0这个坐标的动

Cocos2d-x 3.0final 终结者系列教程08-绘图节点Node中的锚点和坐标系

图片问答,(只要回答正确,锚点和坐标系就学会了) 1.下图一共有几个填充为淡黄色的实心矩形? 选择:A,2个  B, 4个 C,1个 D,16个 答案,B,4个 2.下图的4个实心矩形排列在几行几列? 选择:A,1行1列 B,2行2列 答案,B 3.在每个实心矩形外侧都代表了屏幕,并标记了屏幕坐标系,和OpengGL坐标系,请问以下回答哪个正确? A,下图第一列是屏幕坐标系,左上角为0,0点,第二列是OpenGL坐标系,左下角为(0,0)点 B,    文章喜欢马伊琍 C,   黄海波是被陷害的

Cocos2d-x 3.0final 终结者系列教程06-Director和场景跳转

这些天互联网大事不少呀 1.逻辑思维分家(所谓合久必分,分久必合,实属正常,切行切珍惜吧) 2.锤子手机开卖  (不管你买没买,反正我没买,作为多年Android开发的我深知说的亮点其实在我看来都是没用的) 3.京东上市        (一直亏损的企业,在国内上市真的不可能,不过公司亏损不表示公司没有价值,这就是潜力股,奉劝各位找对象的多关注些潜力股) 4.聚美优品上市  (话说欧哥虽是官二代,但互联网电商公司上市跟这确实没啥关系,有本事你是官二代也做个上市公司试试呀, 徐小平老师这次算牛了,投

Cocos2d-x 3.0final 终结者系列教程07-绘图节点Node

在Cocos2d-x中所有能看到的都是引擎调用底层图形库函数绘制完成的, Cocos2d-x将屏幕所有要绘制的所有内容逻辑上保存到一个场景Scene中(尺寸一般会和屏幕大小一致) 而在Scene中又包含了多个图层Layer,每个图层都是一个绘图节点Node. 所以可以理解为所有能在屏幕上显示的对象都是Node类的实例,或Node的子类对象 继承关系是这样的 Node------Scene -------Layer -------Sprite ....... Scene,Layer,Sprite,

Cocos2d-x 3.0final 终结者系列教程12-Vector&amp;map&amp;value

昨天中午北京温度为40度,在中午12:16分我来到篮球场,思考了1分钟决定开站 转球: 我和另外3名队友开始半场, 球传到我手的刹那顿时烫的我持球不稳,顿时问道了淡淡的胶皮味道和烤肉味道的混搭. 这时我来了一个腾空跳投, 球---------爆炸了........ 听新闻说昨天在路上都是 "熟人" 一位老大爷不慎被车刮倒了,大爷二话没说立马爬了起来,围观众人议论纷纷: "大爷人不错","大爷素质真高","大爷身体可真好" 大爷

Cocos2d-x 3.0final 终结者系列教程15-win7+vs2012+adt+ndk环境搭建(无Cygwin)

终于不用Cygwin 了,很高兴 为什么要用Win7? 因为VS2012要求Win7以上系统才能安装! 为什么要用vs2012? 因为VS2012才支持C++11! 为什么要支持C++11? 因为Cocos2d-x 3.0final版需要C++11的支持. ----------------------------------------------------------- 准备软件都有哪些? Win7,VS2012,Java SDK , ADT(包含了Eclipse,sdk), Android