好了,今天想要讲的是如何让精灵按照自己定义的路径去运动,官方给我们了一个action类,里面有很多运动的类型,比如bezier曲线运动,比如jump运动等等,设计好了运动之后,我们只要让精灵调运runAction()即可。 本人呢是十足的秦时明月粉丝,特别喜欢里面 的 少司命!!!简直是我的女神呀,所以自然想和少司命搭上一点关系那,就记得当初少司命 搭救 盗跖 那次 耍了一招 用树叶画八卦阵放大招技能来着。 然后就让我各种各种激动(原谅我爱少司命爱的那么深沉!)

好的,转入正题,首先我们可以看看利用 粒子系统 + 运动轨迹做出来效果如何。。。

这个是我静态的粒子系统,是树叶绕着中心转,有一点点散开的效果:

这个是粒子系统在在八卦路线的时候样子,如果有少司命的纤细小手的话技能就好看了:

由于本人用了粒子系统有散开效果,所有早先的路径下叶子就有点散开了,也可以通过叶子浓度看出叶子经过的路径方向。

首先我们来分析原理,最一开始,我们画了一个 半径为R,中心点为(a,b)的圆,等圆画完以后紧接着画一个半斤为 R/2 ,中心点为(a-R/2 , b)的半个圆(上半个圆弧),再接着,我们就画半径为 R/2 ,中心点为 (a+R/2 , b )的半圆弧(在图中由于截图过早的问题还没有画完整)。这样,我们要的八卦效果就出来了。。。

由上面分析可知,我们必须要解决画圆算法:由初中还是高中知识可知,x^2 + y^2 = R^2。然后再做适当平移(a,b)就可以得到我们指定中心点为(a,b),半径为R的圆了。 当然 x^2 + y^2 = R^2 求解由于正负的关系考虑比较复杂 ,所以我把它转化成为 : (R*cos(α))^2 + (R*sin(α))^2  = R^2 所以我们的圆上点坐标为 (a+R*cos(α) ,a+R*sin(α) ), 其中 α > 0 && α <2 * Pi , 这样就是我们要画的正圆了。通过 对 α 范围控制,我们也可以画我们指定想要的半圆。

//定义一个结构体,包含里中心点坐标以及要画圆的半径长度
typedef struct _WuzhuangConfig
{cocos2d::Point centerPosition;//中心点坐标float rudius;//半径
}WuzhuangConfig;
//根据画圆进度t以及圆的配置信息计算出圆上点坐标
static inline Vec2 PointAt(float t /*这里的t代表画圆进度,若单纯顺时针画一个圆时,与动作进度相同,若逆时针或者画半圆等需要一定映射关系*/, const WuzhuangConfig c )
{float x = - c.rudius * cos(3.1415926 * t * 2  ) + c.centerPosition.x ;//上面加负号时因为从左手边开始画起float y = c.rudius * sin(3.1415926 * t * 2  ) + c.centerPosition.y;return Vec2(x,y);
}

好,上面解决了画圆问题,下面我们来剖析我们画圆的顺序与 动作进度 t (0代表动作起点,1代表动作结束,0.5代表动作执行到了刚刚好一半) 之间关系 。

上面大圆的周长是全路径的 2/3 (初中知识不解释),小半圆分别占了全路径的 1/6 。

故 t < 2.0/3 && t>0 时 , 我们执行画大圆操作。因为我们要画的整个大圆 ,而不是2/3个圆,故我们需要把动作进度映射到画圆进度上 即画大圆的进度 p = t * 3/2 。这样就可以画出整个大圆了。

同理 t < 5/6 && t >2/3 时,p = (t- 2.0/3) * 3  ; 当 t >5/6 && t < 1 时,p = 7.0/2 - t * 3 ;

知道了这个映射关系以后,我们就可以写出整个画八卦的根据 动作进度 t 的函数

void Wuzhuang::update(float t)
{if(_target){if(t < 2.0/3){_target->setPosition(PointAt( 3.0 / 2 * t, m_config ));}else{if(t < 5.0/6){_target->setPosition(PointAt((t- 2.0/3) * 3 , m_config1/*小圆1配置信息*/ ));}else{_target->setPosition(PointAt( 7.0/2 - t * 3, m_config2/*小圆2配置信息*/ ));}}}
}

介绍完了画圆核心的,剩下的就是简单设置配置属性和定义一个调用接口了。

//小圆的配置信息
WuzhuangConfig m_config1,m_config2;
//初始化
bool Wuzhuang::initWithDuration(float t, const WuzhuangConfig& c)
{if (ActionInterval::initWithDuration(t)){m_config = c;m_config1.rudius = c.rudius/2;m_config2.rudius = c.rudius/2;m_config1.centerPosition = c.centerPosition - Vec2(c.rudius/2,0);m_config2.centerPosition = c.centerPosition + Vec2(c.rudius/2,0);return true;}return false;
}
//外部调用的静态接口
Wuzhuang* Wuzhuang::actionWithDuration(float t,const WuzhuangConfig& c)
{Wuzhuang* pWuzhuang = new Wuzhuang();pWuzhuang ->initWithDuration(t, c);pWuzhuang ->autorelease();return pWuzhuang;
}

基本整个代码就是这样了。。这样外部就可以调用了。调用的话就像调用bezierby一样调用就好了。

    WuzhuangConfig m_config;m_config.centerPosition = Vec2(370, 500);m_config.rudius = 200;Wuzhuang* pAction = Wuzhuang::actionWithDuration(4, m_config);p->runAction(pAction);

所有想要自定义的动作都可以通过这样实现。如果不懂可以去看看BezierBy这样的类他们时怎么实现的,仿照他们这样写就可以了。。。

cocos2dx 3.2 学习篇之六(精灵运动,自定义运动轨迹(太极八卦))相关推荐

  1. cocos2d-x 菜鸟实习生学习篇(十) win32项目移植到安卓

    再两天就过年啦,这篇博客应该是今年的最后一篇吧.在此提前恭贺大家....元宵节快乐!!!相信很多大牛说的都是新年快乐之类的,但是咱不能跟他们一样啊,咱虽然博客不咋的,但是肯定要体现出自己的身份跟内涵. ...

  2. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...

    [本文摘要] [注]本文所述内容为学习Yjango<学习观>相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用. 阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英 ...

  3. Lucene学习总结之六:Lucene打分公式的数学推导

     Lucene学习总结之六:Lucene打分公式的数学推导 在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索 ...

  4. java mysql jsp分页代码_JAVA/JSP学习系列之六(MySQL翻页例子)

    JAVA/JSP学习系列之六(MySQL翻页例子) 更新时间:2006年10月13日 00:00:00   作者: 一.运行前准备 下载了mysql的jdbc驱动(一个jar文件)并加载在CLASSP ...

  5. 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  6. 【木头Cocos2d-x 026】Lua篇(第01章):让Lua和C++牵手

    [木头Cocos2d-x 026]Lua篇(第01章):让Lua和C++牵手 网上关于Lua的教程似乎还没有泛滥,最近刚好学习在Cocos2d-x使用Lua,当然了,我是写教程狂,我会分享我的学习心得 ...

  7. 重来之大学版|学习篇-大学逃课问题,逃学威龙低配版

    逃课,是大学校园里一个普遍的现象.其实很多时候是看别人翘课,然后就跟着效仿,却从来没有想过究竟为什么要翘课. 我不是什么「资深逃课专家」,应该说,我是「逃课搞笑人 」. 第一次逃课,是一次英语课.之前 ...

  8. [视觉SLAM十四讲]学习笔记1-刚体运动之旋转矩阵与变换矩阵

    [视觉SLAM十四讲]学习笔记1-刚体运动之旋转矩阵与变换矩阵 1点.向量和坐标系 2 坐标系间的欧式变换 2.1 欧式变换之旋转 2.2 欧式变换之平移 3 变换矩阵与齐次坐标 4 Eigen库的简 ...

  9. 阿里云天池大赛赛题解析――深度学习篇

    作者:天池平台 出版社:电子工业出版社 品牌:电子工业出版社 出版时间:2021-09-01 阿里云天池大赛赛题解析――深度学习篇

  10. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

最新文章

  1. 修改zend studio字符集
  2. Selenium3+python自动化008-操作浏览器基本方法
  3. cmake简明使用指南
  4. stm32中使用#pragma pack(非常有用的字节对齐用法说明)
  5. java中的jgroup_JGroups实现聊天小程序
  6. Git 的BUG小结
  7. alien rpm deb,ubuntu下安装jdk过程及遇到的问题
  8. C# decimal保留指定的小数位数,不四舍五入
  9. JetBrains:webstrom中代码模板设置
  10. item不可见 recycleview_你不知道的 TypeScript 高级技巧
  11. C言语教程第三章: C言语挨次妄想开端(7)
  12. 【译】Angular Elements 及其运作原理
  13. javascript获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
  14. 可编辑!热门动态表情包!
  15. window进行resize的时候ie假死(jquery插件处理)
  16. console接口配置登录密码
  17. php amr mp3,php实现微信语音amr文件在线播放方法
  18. 【20保研】复旦大学2019年大数据学院全国优秀大学生夏令营活动方案
  19. VMware Workstation Pro新建虚拟机的操作步骤
  20. 楼氏电子为非处方助听器市场推出新型平衡电枢接收器

热门文章

  1. 阿里巴巴泰山版《Java 开发者手册》,也是一份防坑指南
  2. 使用友盟+实现第三方登录(QQ、微信、微博)
  3. openssl的算法套件格式映射IANA的格式
  4. csgo控制台所有代码飞天_CSGO飞天穿墙指令noclip设置移动速度,及卡住不动解决方法...
  5. Spring5.0响应式编程入门
  6. java 组合问题_java数组排列组合问题汇总
  7. 马云:眼光有多远 未来就有多远【2014世界互联网大会】
  8. mysql提现_MYSQL事务教程之Yii2.0商户提现功能
  9. PHP小白编程学习——第三方登录功能设计思维
  10. 总体分布概况符合无界约翰逊分布(johnsonsu)的情况