您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x 3.x控制器模式

2016-02-22 13:12 423 查看
该模式不是23种设计模式中的一种,是游戏开发中经常采用的一种设计模式,在此,顺便拿来讨论。

模式定义

该模式描述了“控制器”和“被控对象”之间的关系,被控对象同一时刻可能被多个控制器控制。

实例

在游戏中,精灵的移动可以表现为多种方式(平移,贝塞尔曲线等等)。为了方便控制精灵,我们可以设计多种控制器用于控制精灵。

被控对象

首先定义一个被控对象基类,并提供接口以便控制器调用(用于控制)。

#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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: