cocos2d-x 托付模式的巧妙运用——附源代码(二)
转载请注明出处: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 托付模式的巧妙运用——附源代码(二)的更多相关文章
- cocos2d-x 托付模式的巧妙运用——附源代码(一)
先来说一下托付模式是什么.以下的内容摘要自维基百科: 托付模式是软件设计模式中的一项基本技巧.在托付模式中,有两个对象參与处理同一个请求.接受请求的对象将请求托付给还有一个对象来处理.托付模式是一项基 ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- android classloader双亲托付模式
概述 ClassLoader的双亲托付模式:classloader 按级别分为三个级别:最上级 : bootstrap classLoader(根类载入器) : 中间级:extension class ...
- android深入之设计模式(一)托付模式
(一)托付模式简单介绍 托付模式是主要的设计模式之中的一个.托付.即是让还有一个对象帮你做事情. 更多的模式,如状态模式.策略模式.訪问者模式本质上是在更特殊的场合採用了托付模式. 托付模式使得我们能 ...
- 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转
效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载]) 本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较 ...
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源代码
上篇博客我们说Spring web Flow与业务结合的方式主要有三种,以下我们主要介绍一下第三种的应用方式 3,运行到<action-state> 元素 SpringWeb Flow 中 ...
- 基于事件驱动的DDD领域驱动设计框架分享(附源代码)
原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...
- 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)
wechat github 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP) 概述 公众号开发是痛苦的,痛苦在好多问题开发者文档是没有提到的,是需要你猜的. 在开发过程中 ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
随机推荐
- hdu 1556 Color the ball(线段树区间维护+单点求值)
传送门:Color the ball Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/3276 ...
- Python和xml简介
python提供越来越多的技术来支持xml,本文旨在面向初学利用Python处理xml的读者,以教程的形式介绍一些基本的xml出来概念.前提是读者必须知道一些xml常用术语. 先决条件 本文所有的例子 ...
- go chapter 3 - defer
https://www.cnblogs.com/bonelee/p/6861777.html 函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数.用法类似于面向对象编程语言 ...
- 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】
问题 C: 二进制 时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 pupil发现对于一个十进制数,无论怎么将其的数字 ...
- 对Webservice的理解
eb Service使用的是 SOAP (Simple Object Access Protocol)协议 soap协议只是用来封装消息用的.封装后的消息你可以通过各种已有的协 ...
- hdu 5961 传递 (2016ccpc 合肥站 A题)
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- 【并查集】【DFS】搭桥
[codevs1002]搭桥 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着 ...
- 【概率DP】BZOJ4318-OSU!
[题目大意] 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含( ...
- Generator函数(二)
for...of循环 1.for...of循环可以自动遍历Generator函数,不需要再调用next方法 function* helloWorldGenerator(){ yield 'hello' ...
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) F. Double Knapsack 鸽巢原理 构造
F. Double Knapsack 题目连接: http://www.codeforces.com/contest/618/problem/F Description You are given t ...