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) = ;
virtual void StepAction(double dt) = ;
virtual bool IsDone() = ;
};
下面是一个移动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);
}