Cocos2d-x 3.x控制器模式

该模式不是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);

你可能感兴趣的:(Cocos2d-x 3.x控制器模式)