Cocos2d-x 3.x控制器模式
2016-02-22 13:12
423 查看
该模式不是23种设计模式中的一种,是游戏开发中经常采用的一种设计模式,在此,顺便拿来讨论。
玩家对象 继承精灵和被控类,以便玩家具备两种特性(精灵特性 和 能够被控制)
具体的控制器:一直向x方向移动
在update方法中,通过调用被控对象的方法,控制被控对象的位置。
测试代码:
模式定义
该模式描述了“控制器”和“被控对象”之间的关系,被控对象同一时刻可能被多个控制器控制。实例
在游戏中,精灵的移动可以表现为多种方式(平移,贝塞尔曲线等等)。为了方便控制精灵,我们可以设计多种控制器用于控制精灵。被控对象
首先定义一个被控对象基类,并提供接口以便控制器调用(用于控制)。#include "cocos2d.h" USING_NS_CC; class ControllerListener { public: /* 控制器希望控制 被控对象 的位置 */ virtual void setTagPosition(float x, float y) = 0; virtual Point getTagPosition() = 0; };
玩家对象 继承精灵和被控类,以便玩家具备两种特性(精灵特性 和 能够被控制)
class Player: public Sprite, public ControllerListener { public: CREATE_FUNC(Player); virtual bool init(); /* 设置位置 */ virtual void setTagPosition(float x, float y); virtual Point getTagPosition(); /* 设置对象控制器 */ void setController(Controller * controller); protected: Controller * m_controller; } bool Player::init() { return true; } void Player::setTagPosition(float x, float y) { this->setPosition(x, y); } Point Player::getTagPosition() { return this->getPosition(); } void Player::setController(Controller * controller) { m_controller = controller; m_controller->setControllerListener(this); //给控制器,设置被控制的对象 }
控制器
控制器基类,保存一份被控对象的指针,方便 具体控制器 调用被控对象的方法,实现控制。#include "cocos2d.h" #include "ControllerListener.h" USING_NS_CC; // 控制器基类 class Controller : public Node { public: void setControllerListener(ControllerListener * c); protected: ControllerListener * m_controllerListener; };
具体的控制器:一直向x方向移动
在update方法中,通过调用被控对象的方法,控制被控对象的位置。
class SimpleMoveController : public Controller { public: CREATE_FUNC(SimpleMoveController); virtual bool init(); virtual void update(float dt); // schedualUpdate(); void setSpeed(int iSpeed); private: int m_iSpeed; }; // SimpleMoveController.cpp #include "SimpleMoveController.h" bool SimpleMoveController::init() { if (!Node::init()) return false; /* 默认速度为0 */ this->m_iSpeed = 0; /* 定时调用update */ this->scheduleUpdate(); return true; } void SimpleMoveController::update(float dt) { if ( m_controllerListener == nullptr ) { return; } /* 增加移动对象的x坐标值 */ Point pos = m_controllerListener->getTagPosition(); pos.x += m_iSpeed; /* 被控制的对象 */ m_controllerListener->setTagPosition(pos.x, pos.y); } void SimpleMoveController::setSpeed(int iSpeed) { this->m_iSpeed = iSpeed; }
测试代码:
// 创建向前移动的控制器 SimpleMoveController * simpleMoveController = SimpleMoveController::create(); simpleMoveController->setSpeed(3); this->addChild(simpleMoveController); //一定要添加到父节点,否则update不会调用 Player * player = Player::create(); player->setController(simpleMoveController);
相关文章推荐
- Cocos中在.h文件定义的指针类型变量不实例化会在析构时出现问题
- 拼接滚动地图-Quick-cocos2dx
- Cocos2D-x权威指南:核心类成员CCNode
- cocos2dx学习之路----第四篇(场景跳转)
- 收集Cocos2d提供的字体
- Cocos-x 3.2:从C++过渡到Lua
- cocos2d-x按钮CCControlButton的用法
- Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)
- iOS6 横屏项目自动旋转的问题解决 cocos2d
- Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
- 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- 搭建cocos2d游戏引擎环境HelloWorld!
- Cocos2dx-OpenGL ES2.0教程:你的第一个立方体(5)
- Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)
- Cocos2dx-OpenGL ES 2.0教程:你的第一个三角形(1)
- Cocos2d 有用的各种方法
- Cocos2dx-OpenGL ES2.0教程:使用VBO索引(4)
- cocos2dx之C++调用Lua
- 【android-cocos2d-X2.2 环境配置】在Mac下搭建Cocos2d-X-android开发环境!
- cocos2dx使用CocosBuilder(编辑器)完成基础骨骼动画