一个简单的游戏开发框架(六.行为Action)

Action是cocos2d-x中比较重要的概念,有一个庞大的类族。参见老G写的cocos2d-x学习笔记09:动作2:持续动作

除了各种包装器,剩下的主要是一些持续动作:

CCMoveTo:移动到、CCMoveBy:按……移动
CCJumpTo:跳跃到、CCJumpBy:按……跳跃
CCBezierTo:贝兹移动到、CCBezierBy:按……贝兹移动
CCRotateTo:旋转到、CCRotateBy:按……旋转
CCScaleTo:缩放到、CCScaleBy:按……缩放
CCSkewTo:切变到、
CCSkewBy:按……切变
CCTintTo:颜色渐变到、CCTintBy:按……颜色渐变
CCFadeIn:从无到有,也叫淡入、CCFadeOut:从有到无,也叫淡出、CCFadeTo:改变不透明度到某个值
CCBlink:闪耀
CCDelayTime:延时

可以看出cocos2d中的Action在概念上,主要还是面对图形,动画的操作。我希望Action有更高层级的抽象,不是面向图形,而是面向游戏里的逻辑对象比如角色,怪物,地表物品等。而且不仅仅用于客户端,也能用于服务器。cocos2d里的各种包装器概念在新的框架里依然有用。除此之外就是依项目需求,游戏里各种对象所需要的行为,典型的比如移动,攻击。Action的主要功能,就是改变对象属性。Action和ActionManager,Object之间的关系,与cocos2d-x中CCAction和CCActionManager,CCNode之间的关系一样,接口也非常近似。
class ActionMgr
{
public:
    void ActionTick();
    void AddAction(Action* pAction);
    void StopAction(Action* pAction);
};
class Action
{
public:
    virtual void RunWithTarget(Object* pTarget) = 0;
    virtual void StepAction(double dt) = 0;
    virtual bool IsDone() = 0;
};

下面是一个移动Action的例子,可以看到行为怎样和对象属性发生作用。Action应该设计得尽量小,依赖的属性尽量少,每个Action只影响一个或一组属性为好。

void ActionMoveTo::StepAction(double dt)
{
    if (!_bRunning)
        return;

    // 取当前位置
    Point3F pos;
    pos.x = _pTarget->GetProperty(Properties::POSX);
    pos.y = _pTarget->GetProperty(Properties::POSY);
    pos.z = _pTarget->GetProperty(Properties::POSZ);

    // 计算下一时刻位置
    pos.x += (float)(_ds.x * dt);
    pos.y += (float)(_ds.y * dt);
    pos.z += (float)(_ds.z * dt);

    // 判断是否到达目的地
  ……

// 修改位置属性 auto xyz = std::make_tuple(pos.x, pos.y, pos.z); _pTarget->SetPropertyGroup<Properties::POSX>(xyz); }
 
原文地址:https://www.cnblogs.com/bnudc/p/3446322.html