转载自ufolr的博客 原文连接:http://blog.csdn.net/ufolr/article/details/7447773
在cocos2d中,系统提供了CCMove、CCJump、CCBezier(贝塞尔曲线)等让精灵移动的action,但是有时候,为了让程序看上不不是那么的呆板,或者为了实现某些特定的功能,我们需要让精灵按照我们自己设定的路径(曲线运动)来移动。这就是这位篇文章我们需要讨论的话题。
自己开始也很纠结cocos2dx没有提供更多的action动作,比如说我们要做个抛物线什么的,虽然可以用贝塞尔曲线来模拟。
用贝塞尔曲线扔个飞镖什么的倒是还不错,但当你需要重复执行action时,问题就出来了,再第二次重复贝塞尔曲线动作到时候,精灵就会飞到别的地方去了。(出现这个问题的原因,猜测贝塞尔曲线是没有起点和终点了,在第一次执行了动作之后,之前的曲线动作并没有被释放,第二次再延续这个动作,就会延为执行的那段曲线移动,当然,只是猜测,未深入研究。后来觉得不是这个原因,但具体原因未明。)
如果我们要做一个椭圆的轨迹,有人说用3~4条贝塞尔曲线来模拟,但实验证明,在两天贝塞尔曲线的衔接点Action会有停顿,所以效果简直可以用鲁迅先生的“目不忍视”来形容。
于是,我们考虑自己定义曲线的路径,让精灵按照我们自己的定义来行动。
需求:
将自己设定的路径封装成一个action,让精灵执行,这里以椭圆轨迹为例。
先来两张效果图:
实现:
单独建一个自己的动作模块:LRActionInterval。{LRActionInterval.h&LRActionInterval.cpp}
基于cocos2d-x的CCActionInterval来封装自己的动作,所以:
LRActionInterval.h
-
#include"CCActionInterval.h"//包含系统延时类动作头文件
-
-
usingnamespacecocos2d;
想一想确定一个椭圆的条件,初中老师告诉我们,去顶一个椭圆我们需要知道他的空间位置(中心点坐标)、长半轴(a)、和短半轴(b)(或者知道半焦距(c))。也就是我们需要三个量来确定一个椭圆,所以在LRActionInterval.h中定义一个包含三个成员的结构来作为我们生成椭圆的参数:
-
-
typedefstruct_lrTuoyuanConfig{
-
-
CCPointcenterPosition;
-
-
floataLength;
-
-
floatcLength;
-
}lrTuoyuanConfig;
然后定义我们的椭圆的类:
-
class__declspec(dllexport)LRTuoyuanBy:publicCCActionInterval
-
{
-
public:
-
-
boolinitWithDuration(ccTimet,constlrTuoyuanConfig&c);
-
virtualvoidupdate(ccTimetime);
-
public:
-
-
staticLRTuoyuanBy*actionWithDuration(ccTimet,constlrTuoyuanConfig&c);
-
-
protected:
-
lrTuoyuanConfigm_sConfig;
-
CCPointm_startPosition;
-
CCPoints_startPosition;
-
};
接下来是我们的实现部分:
LRActionInterval.cpp
其实设定路径就是不断的刷新,将路径上的点赋给执行action的对象。
因此,既然我们要做一个椭圆的轨迹,我们就需要得到椭圆上每个点的坐标值,然后将其赋给执行action的对象。获得椭圆的轨迹,再次回想初中老师的教导——椭圆标准方程:x^2/a+y^2/b=1。
但这是个2次方程,李勇这个方程求x、y的值的时候会需要开方,而开方后还需要确定正负,虽然可以实现功能,但是给自己增加了不少代码量,也会浪费不少笔芯。所以我们要找一个更简单的公式——椭圆参数方程。
参数方程:x=acos(θ)y=bsin(θ);利用这个一次方程可以直观的计算出当前坐标点。
由椭圆的参数方程我们可以分别写出返回X/Y坐标值的函数:
-
staticinlinefloattuoyuanXat(floata,floatbx,floatc,ccTimet)
-
{
-
-
return-a*cos(2*3.1415926*t)+a;
-
}
-
staticinlinefloattuoyuanYat(floata,floatby,floatc,ccTimet)
-
{
-
floatb=sqrt(powf(a,2)-powf(c,2));
-
-
returnb*sin(2*3.1415926*t);
-
}
然后实现根据中心左边、a、c确定椭圆:
-
-
-
-
LRTuoyuanBy*LRTuoyuanBy::actionWithDuration(ccTimet,constlrTuoyuanConfig&c)
-
{
-
LRTuoyuanBy*pTuoyuanBy=newLRTuoyuanBy();
-
pTuoyuanBy->initWithDuration(t,c);
-
pTuoyuanBy->autorelease();
-
-
returnpTuoyuanBy;
-
}
-
-
boolLRTuoyuanBy::initWithDuration(ccTimet,constlrTuoyuanConfig&c)
-
{
-
if(CCActionInterval::initWithDuration(t))
-
{
-
m_sConfig=c;
-
returntrue;
-
}
-
-
returnfalse;
-
}
-
voidLRTuoyuanBy::update(ccTimetime)
-
{
-
if(m_pTarget)
-
{
-
CCPoints_startPosition=m_sConfig.centerPosition;
-
floata=m_sConfig.aLength;
-
floatbx=m_sConfig.centerPosition.x;
-
floatby=m_sConfig.centerPosition.y;
-
floatc=m_sConfig.cLength;
-
floatx=tuoyuanXat(a,bx,c,time);
-
floaty=tuoyuanYat(a,by,c,time);
-
m_pTarget->setPosition(ccpAdd(s_startPosition,ccp(x-a,y)));
-
}
-
}
这样我们只需要在程序中像使用CCBezier一样使用LRTuoyuan,让精灵执行这个Action,他就会沿着我们设定的椭圆运动了。当然,只要你给出你自己的运动函数轨迹,精灵就会按照你自己设定的轨迹运动。
分享到:
相关推荐
使用javascript实现一组图片或者div按照椭圆轨迹运动,鼠标移入停止运动,鼠标移出开始运行。
设定椭圆曲线方程参数,实现椭圆曲线加密算法
通过卡尔曼滤波实现对运动轨迹的追踪,里面包含椭圆和圆的
3张图片,按照椭圆轨迹移动,实现功能替换
椭圆曲线-椭圆曲线.pdf
运用WPF .netFrameWork4.0出的新功能,PathListBox分布物体,制作出这些物体一起按照这个椭圆的轨迹运动的动画,关于PathListBox的属性用法,大家自己Baidu一下。
密码学椭圆曲线加密计算公钥、基点;实现加解密cpp文件
Axure 实现汽车指定轨迹移动行走
椭圆轨迹绘制MATLAB程序,采用等弦差法,验证可行,显示椭圆轨迹
超声椭圆振动铣削的matlab程序,主要用来进行运动轨迹的仿真。
椭圆曲线密码系统的matlab实现
椭圆曲线matlab代码。可以调试使用。密码系统,分多个文件
椭圆曲线算法的代码实现,能生成椭圆曲线以及相应的公钥,私钥,加解密文件。在VS2005环境下编译成功运行。
1985 年,Miller 和 Koblitz 各自独立的提出了椭圆曲线公钥密码[3],它是基于有限域上椭圆曲线构成加密体制,其安全性基于有限域上椭圆曲线离散对数问题(Elliptic Curve Discrete Logarithm Problem, ECDLP)的难解...
cocos2dx 运动轨迹特效源码,商业游戏必学技巧,xcode 工程,可自己加android或win32工程。
针对移动手持设备处理能力和存储空间较弱的限制,提出了一种基于椭圆曲线密码体制的移动电子支付系统。与传统的基于RSA及离散对数问题的电子支付系统相比,提出的系统所需安全参数字节较短且易于扩展,因而存储、...
ECM被认为是一种特殊用途的保理算法,因为它最适合寻找小因素。目前,它仍然是不超过50至60 位数的除数的最佳算法,因为其运行...[1]增加测试曲线的数量可以提高找到因子的几率,但它们与数字数量的增加不成线性关系。
椭圆曲线参数,方便椭圆曲线取基点和阶,a,b的值免去不必要的运算。
移动电商平台的椭圆曲线签密方案研究,路放,苏放,移动互联网飞速发展的今天,电子商务平台越来越多的向移动端发展。移动电商平台不同于有线电商的特点也给它的设计、实现和应用带
移动机器人的轨迹跟踪算法,包括椭圆、园、直线、等