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);
}
 

一个简单的游戏开发框架(六.行为Action)的更多相关文章

  1. 一个简单的游戏开发框架(四.舞台Stage)

    首先是StageManager类: class StageManager : public Singleton<StageManager> { friend class Singleton ...

  2. 一个简单的游戏开发框架(七.动作Motion)

    发现还没谈到最基本也是最重要的问题,怎么画图,画动画? 在原版cocos2d-x里画动画比较麻烦,见cocos2d-x学习笔记04:简单动画 cocostudio扩展出CCArmature类,就比较简 ...

  3. 一个简单的游戏开发框架(五.对象Object)

    前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...

  4. Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航

    原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...

  5. 5、使用Libgdx设计一个简单的游戏------雨滴

    (原文:http://www.libgdx.cn/topic/49/5-%E4%BD%BF%E7%94%A8libgdx%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7% ...

  6. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  7. Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)

    原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说   填充数据 ...

  8. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  9. Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块

    原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...

随机推荐

  1. gbd基本使用一

    http://biancheng.dnbcw.info/linux/391846.html

  2. Markdown学习和插件介绍

    markdown能干啥 亲们github上的项目首页的 内容+样式,都是项目中README.md文件控制的.将md风格的代码,转化成html. 而且markdown语法非常简单,5-10分钟即可学会! ...

  3. hdu4273Rescue(三维凸包重心)

    链接 模板题已不叫题.. 三维凸包+凸包重心+点到平面距离(体积/点积)  体积-->混合积(先点乘再叉乘) #include <iostream> #include<cstd ...

  4. MCU的四个功能

    以下来自Atmel Mega128的说明手册: 微控制器(微处理器)Microcontroller(MCU)的四个基本功能为: 1. access memory, 2.  perform calcul ...

  5. [Java] SoapUI使用Java获取各时间日期方法

    import java.util.*; import java.text.SimpleDateFormat; // current date String dateNew = today() // t ...

  6. 联想键盘 去掉fn

    这个帖子 很实用 http://iknow.lenovo.com/detail/dc_039949.html 键盘驱动下载地址:http://support1.lenovo.com.cn/lenovo ...

  7. flask笔记1-安装

    1.创建应用的根目录: 2.在根目录下创建独立的虚拟python运行环境,创建完成后当前目录会有一个文件夹,即该独立环境(使用--no-site-pachages参数将不会复制任何系统python环境 ...

  8. ES6(一)ECMAscript6介绍

    nvm-windows Node.js是JavaScript语言的服务器运行环境,对ES6的支持度比浏览器更高.通过Node,可以体验更多ES6的特性.建议使用版本管理工具nvm,来安装Node,因为 ...

  9. 【LeetCode】#344 Reverse String

    [Question] Write a function that takes a string as input and returns the string reversed. Example: G ...

  10. selenium ide脚本回放出现element not found

    原因: 点击按钮,没有设置时间延迟,而页面加载,需要时间:当页面元素未加载完全,执行点击事件,就会报错:element... not found. 解决方案: 在点击事件前添加新的COMMAND.设置 ...