转载请注明出处:http://blog.csdn.net/hust_superman/article/details/38292265,谢谢。

继上一篇将了托付类的详细实现后。这篇来将一下怎样在游戏中使用实现的托付类。也就是怎样在游戏中来调用托付类来完毕一些功能。详细的应用场景和应用层会在以下介绍。

先来看一看游戏demo实现的详细图片,demo比較简单。可是资源齐全,拿到源代码后能够在源代码的基础上继续完好demo做出一款真正的游戏。好了,老规矩。先上图再说:



游戏中点击播放button后会进入游戏主界面,看到一个红色的小方块慢慢的移动到以下,最后游戏结束,结束后会有结束界面。

这个demo主要是来阐释怎样运用托付类来在游戏中使主游戏逻辑更清晰。

好了,以下来看一下详细的场景和游戏的主要层。

游戏中一个GameScene 场景,在场景中加入了托付类StatusLayer层和游戏主逻辑GameLayer层,GameLayer层中调用托付类来完毕游戏開始与游戏结束的逻辑。

以下来看一下GameScene.cpp的实现,在当中会将托付类注冊到GameLayer层中。

#include "GameScene.h"
#include "GameLayer.h"
#include "StatusLayer.h" USING_NS_CC; GameScene::GameScene(){
} GameScene::~GameScene(){
} bool GameScene::init() {
if(Scene::init()) {
<span style="white-space:pre">	</span>//载入图片资源到缓存,方便后面使用图片资源
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("flappyrec.plist","flappyrec.png");
auto statusLayer = StatusLayer::create();
this->addChild(statusLayer);
//Add the main game layer
auto gameLayer = GameLayer::create();
//注冊托付类到GameLayer层中
gameLayer->setDelegator(statusLayer);
this->addChild(gameLayer);
return true;
} else {
return false;
}
}

GameScene中比較简单。就是加入了StatusLayer层和GameLayer层,并把StatusLayer作为托付类注冊到GameLayer中。

游戏中的基本的东西都在GameLayer中,以下来看下GameLayer.h的内容

#include "cocos2d.h"

USING_NS_CC;
//游戏进行的状态枚举类
typedef enum _game_status {
GAME_STATUS_READY = 1,
GAME_STATUS_START,
GAME_STATUS_OVER
} GameStatus; /**
* 抽象的托付类,有三个虚函数,继承这个托付类的子类须要实现
* 这三个虚函数。以便控制游戏開始,执行,结束的推断
*/
class StatusDelegate {
public:
/**
* When the game start, this method will be called
*/
virtual void onGameStart() = 0;
/**
* During paying, after the score changed, this method will be called
*/
virtual void onGamePlaying() = 0;
/**
* When game is over, this method will be called
*/
virtual void onGameEnd() = 0;
}; const int MENU_START = 10001; class GameLayer : public Layer {
public:
GameLayer();
~GameLayer();
virtual bool init();
CREATE_FUNC(GameLayer); //实现注冊托付类的宏,delegator作为成员变量。能够调用托付类中的各个函数 //覆写父类的onEnter函数,记得带override
virtual void onEnter() //实现注冊托付类的宏。delegator作为成员变量。能够调用托付类中的各个函数override;
//实现注冊托付类的宏,delegator作为成员变量,能够调用托付类中的各个函数
CC_SYNTHESIZE(StatusDelegate*,delegator,Delegator);
private:
void showStartButton();//显示開始button
void menuStartCallback(Ref* pSender);//開始button回调函数
void createSquares();//创建红色方块
void moveFinished(Ref* pSender);//方块移动结束函数
private:
Sprite* square;
Size visibleSize;
Point origin; GameStatus gameStatus;
};

上面代码中最重要的就是托付类宏的使用,这个GameScene中的以下的相应

//注冊托付类到GameLayer层中
gameLayer->setDelegator(statusLayer);

宏的作用也就是注冊到GameLayer中的详细的托付类StatusDelegate的子类StatusLayer。

以下看GameLayer.cpp的详细实现

#include "GameLayer.h"

USING_NS_CC;

GameLayer::GameLayer(){
}
GameLayer::~GameLayer() {
} bool GameLayer::init() {
if(!Layer::init()) {
return false;
}
this->gameStatus = GAME_STATUS_READY;
visibleSize = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
//调用显示開始button
this->showStartButton(); return true;
} void GameLayer::onEnter() {
Layer::onEnter();
//TODO
}
/**
* 显示開始button,并为button注冊回调函数
*/
void GameLayer::showStartButton() {
Sprite* startBtn = Sprite::createWithSpriteFrameName("play.png");
Sprite* startBtnActive = Sprite::createWithSpriteFrameName("play.png");
startBtn->setScale(0.6f);//缩放
startBtnActive->setScale(0.6f);//缩放
startBtnActive->setPositionY(4);//使button向上移动4个单位
//将上述精灵作为菜单进行加入
auto menuStartItem = MenuItemSprite::create(startBtn,startBtnActive,NULL,
CC_CALLBACK_1(GameLayer::menuStartCallback,this));
auto menuStart = Menu::create(menuStartItem,NULL);
menuStart->setPosition(Vec2(this->visibleSize.width/2, this->visibleSize.height/2));
menuStart->setTag(MENU_START);
this->addChild(menuStart,10); }
/**
* 按下開始菜单后的回调函数。主要是调用托付类中的onGameStart函数来实现游戏的開始
* 同一时候移除開始button并创建游戏主界面中的红色小方块
*/
void GameLayer::menuStartCallback(Ref* pSender) {
if(this->gameStatus == GAME_STATUS_OVER) {
return ;
}
if(this->gameStatus == GAME_STATUS_READY) {
log("start");
//托付StatusLayer中的onGameStart函数来运行游戏開始逻辑
this->delegator->onGameStart();
this->getChildByTag(MENU_START)->runAction(FadeOut::create(0.4f));
this->removeChildByTag(MENU_START,true);
this->gameStatus = GAME_STATUS_START;
this->createSquares();//创建红色小方块
} else if(this->gameStatus == GAME_STATUS_START) {
//TODO
}
}
/**
* 创建红色小方块。并在移动5s后游戏结束
*/
void GameLayer::createSquares(){
//加入方块精灵
square = Sprite::createWithSpriteFrameName("whitebird.png");
square->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));
square->setColor(Color3B::RED);
this->addChild(square);
//游戏開始。5秒后游戏结束
auto move = MoveTo::create(5.0f,Vec2(square->getPositionX(),origin.y));
//移动结束后回调函数
auto moveDone = CallFuncN::create(CC_CALLBACK_1(GameLayer::moveFinished,this));
auto sequence = Sequence::createWithTwoActions(move,moveDone);
square->runAction(sequence);
}
/**
* 移动结束后的回调函数。也就是游戏结束,
* 当中能够开到delegator->onGameEnd的运用
* 这个是直接使用托付类的onGameEnd来控制游戏结束
* 是不是瞬间感觉这个类清晰了很多,
*/
void GameLayer::moveFinished(Ref* pSender) {
//托付StatusLayer中的onGameEnd函数运行游戏结束的逻辑
this->delegator->onGameEnd();
this->removeChild(square,true);
}

上面代码中须要特别注意的就是托付类调用onGameStart()函数和onGameEnd()函数,都是使用的前面介绍的那个托付类的宏

CC_SYNTHESIZE(StatusDelegate*,delegator,Delegator);

直接使用delegator来调用托付类中的函数。相当于实现了层与层之间的通信。

//托付StatusLayer中的onGameEnd函数运行游戏结束的逻辑
this->delegator->onGameEnd();

上面这段代码是这篇博客最主要想表达的,当你把详细的托付类都实现好了,那么在游戏主逻辑中你会发现原来能够这么轻松清晰高效的来调用这些东西,代码看着就清晰,并且看到的代码逻辑都是如此的简单。由于你都在托付类中详细的实现了。

好了。这篇文章和上一篇文章表达的就是托付类的详细实现。拥有好托付类,能够是游戏主逻辑更清晰。并且也能够在游戏的层与层之间进行传递參数。避免了静态变量的运用,也简化了主游戏层的代码量,不显得那么臃肿。

以下附上demo的源代码,源代码中有详细的资源文件。下载好源代码后能够自己建立个新project来把游戏完好,实现这个小游戏。

下载地址:点击下载

好了,这篇主要讲了托付类的详细应用,下一篇写一下游戏中的物理碰撞规则的应用。

cocos2d-x 托付模式的巧妙运用——附源代码(二)的更多相关文章

  1. cocos2d-x 托付模式的巧妙运用——附源代码(一)

    先来说一下托付模式是什么.以下的内容摘要自维基百科: 托付模式是软件设计模式中的一项基本技巧.在托付模式中,有两个对象參与处理同一个请求.接受请求的对象将请求托付给还有一个对象来处理.托付模式是一项基 ...

  2. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  3. android classloader双亲托付模式

    概述 ClassLoader的双亲托付模式:classloader 按级别分为三个级别:最上级 : bootstrap classLoader(根类载入器) : 中间级:extension class ...

  4. android深入之设计模式(一)托付模式

    (一)托付模式简单介绍 托付模式是主要的设计模式之中的一个.托付.即是让还有一个对象帮你做事情. 更多的模式,如状态模式.策略模式.訪问者模式本质上是在更特殊的场合採用了托付模式. 托付模式使得我们能 ...

  5. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

    效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])    本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   ...

  6. Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源代码

    上篇博客我们说Spring web Flow与业务结合的方式主要有三种,以下我们主要介绍一下第三种的应用方式 3,运行到<action-state> 元素 SpringWeb Flow 中 ...

  7. 基于事件驱动的DDD领域驱动设计框架分享(附源代码)

    原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...

  8. 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)

    wechat github 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP) 概述 公众号开发是痛苦的,痛苦在好多问题开发者文档是没有提到的,是需要你猜的. 在开发过程中 ...

  9. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

随机推荐

  1. 六十五 async/await

    用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异 ...

  2. zabbix通过jvm监控tomcat

    说明:zabbix是通过jvm工具监控tomcat,zabbix server通过连接jvm代理服务器获取tomcat的各种参数 zabbix server:192.168.1.31 tomcat服务 ...

  3. 【剑指offer】面试题 5. 替换空格

    面试题 5. 替换空格 题目:请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy. 则经过替换之后的字符串为We%20Are%20Hap ...

  4. 问题记载——keil中写for循环嵌套

    还是上次的工程,LED灯闪烁.我今天回想一下感觉上次调试的时候还是有点问题,LED0 1和0的翻转时间很奇怪. 所以今天又打开看了看,单步调试,发现for循环嵌套只执行前一个循环,后一个循环根本不执行 ...

  5. 洛谷——P2952 [USACO09OPEN]牛线Cow Line

    P2952 [USACO09OPEN]牛线Cow Line 题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a l ...

  6. Codeforces Round #426 (Div. 2) D The Bakery(线段树 DP)

     The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input ...

  7. 单能X射线产生方法

    主要是荧光 利用布拉格准则, 关键词如下.. 国内有些专利 monochromating crystal spectrometer 物理实验设备名称翻译 ... 单色光检糖计 monochromati ...

  8. 分解质因数法求最大公约数(javascrip实现)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. [BZOJ 3326] 数数

    Link: BZOJ 3326 传送门 Solution: 明显是一道数位$dp$的题目,就是递推式复杂了点 先要求出一个数$\bar{n}$向添加一位后的$\bar{np}$的转化关系 令$res[ ...

  10. 【概率dp】【数学期望】Gym - 101190F - Foreign Postcards

    http://blog.csdn.net/DorMOUSENone/article/details/73699630