cocos2d-x2.2实现椭圆运动,参数为中心点坐标和长半轴、短半轴

CCAction运动中没有实现椭圆运动或者圆周运动,于是在网上找了很多相关帖子,有一个CCCircleBy可以实现圆周运动,但是当使用CCRepeatForever循环运动时,总是会卡一下,所以在网上有找了一个实现椭圆运动的例子,当长半轴和短半轴相等时,就是圆周运动,这个循环运动倒是不卡。

#include "../actions/CCActionInterval.h"
//包含系统延时类动作头文件

#define PI 3.14159

typedef struct _lrTuoyuanConfig{

CCPoint centerPosition; //中心点坐标

float aLength; //长半轴

float cLength; //椭圆c长,也就是半焦距

}lrTuoyuanConfig;

class __declspec(dllexport) LRTuoyuanBy : public CCActionInterval

{

public:

bool initWithDuration(float f, const lrTuoyuanConfig& c);

virtual void update(float time);

public:

static LRTuoyuanBy* actionWithDuration(float t, const lrTuoyuanConfig& c);

static inline float tuoyuanXat(float a, float bx, float c, float t)

{

return -a*cos(2*PI*t)+a;

}

static inline float tuoyuanYat(float a, float by, float c, float t)

{

float b = sqrt(powf(a,2)-powf(c,2));

return b*sin(2*PI*t);

}

protected:

lrTuoyuanConfig m_sConfig;

CCPoint m_startPosition;

CCPoint s_startPosition;

};

//实现文件为:

LRTuoyuanBy* LRTuoyuanBy::actionWithDuration(float t, const lrTuoyuanConfig& c)

{

LRTuoyuanBy* pTuoyuanBy = new LRTuoyuanBy();

pTuoyuanBy->initWithDuration(t,c);

pTuoyuanBy->autorelease();

return pTuoyuanBy;

}

bool LRTuoyuanBy::initWithDuration(float t, const lrTuoyuanConfig& c)

{

if(CCActionInterval::initWithDuration(t))

{

m_sConfig = c;

return true;

}

return false;

}

void LRTuoyuanBy::update(float time)

{

if(m_pTarget)

{

CCPoint s_startPosition = m_sConfig.centerPosition;
//中心点坐标

float a = m_sConfig.aLength;

float bx = m_sConfig.centerPosition.x;

float by = m_sConfig.centerPosition.y;

float c = m_sConfig.cLength;

float x = tuoyuanXat(a, bx, c, time); //调用之前的坐标计算函数来计算出坐标值

float y = tuoyuanYat(a, by, c, time);

m_pTarget -> setPosition(ccpAdd(s_startPosition, ccp(x-a, y)));
//由于我们画计算出的椭圆以原点为中心,所以要加上原来设定的中心点坐标

}

}

下面看看怎样使用

首先定义一个lrTuoyuanConfig

lrTuoyuanConfig config;

config.centerPosition = ccp(240,160);

config.aLength = 100;

config.cLength = 60;

sprite -> runAction(CCRepeatForever::create(LRTuoyuanBy::actionWithDuration(1.0f, config));

这样就可以让精灵实现无限椭圆运动

当cLength = 0时,就是圆周运动

时间: 2024-11-22 19:24:23

cocos2d-x2.2实现椭圆运动,参数为中心点坐标和长半轴、短半轴的相关文章

全国-城市-百度地图中心点坐标

1 121.487899486,31.24916171 上海-上海市2 100.092612914,23.8878061038 云南省-临沧市3 100.229628399,26.8753510895 云南省-丽江市4 99.1779956133,25.1204891962 云南省-保山市5 100.223674789,25.5968996394 云南省-大理白族自治州6 98.5894342874,24.441239663 云南省-德宏傣族景颇族自治州7 98.8599320425,25.86

IOS高德地图开发

博客链接:www.goofyy.com/blog 或者百度搜索 goofyy 玩了苹果原生地图,觉得IOS8的原生还是差了那么一点点,对比了一下腾讯的SDK和高德的SDK,还是觉得高德更碉些,第三方地图就先拿高德地图开刀了. 使用高德SDK,首先到高德官网注册一个开发者账号,获取开发者KEY.这些高德LBS开放平台都是有详细教程.小编编就不在这里赘余啦.首先是导入库和开发前简单设置. 高德官网下载高德开发的SDK导入.具体导入的库如下 1.引入地图库&搜索库 左侧目录中选中工程名,在 TARGE

【iOS开发】如何用 Swift 语言进行LBS应用的开发?

本文分为三部分,第一部分详解用Swift语言开发LBS应用,并给出完整的示例与源代码:第二部分介绍如何申请LBS密钥,第三部分是综合示例查看,扫描二维码即可查看示例demo. 第一部分 使用Swift语言开发LBS应用 1.下载iOS地图SDK的最新版本,地址:http://lbs.amap.com/api/ios-sdk/down/ 2.申请LBS密钥(见第二部分). 3.xCode新建工程 新建一个 Single View Application 工程.注意:Language 选择 Swif

绘图QPainter-画刷

Qt提供的画刷风格: Qt.TexturePattern   自定义图像画刷 线性渐变 QLinearGradientPattern QLinearGradient需要传入的参数为需要进行渐变的区域坐标,那其实只要把我们在paintEvent()事件函数中要绘制的矩形区域的坐标输入即可(输入两点坐标,若输入对角坐标,则在对角方向上渐变,笔者这里就是输入的左上和右下对角坐标) 径向渐变QRadialGradientPattern 锥形渐变QConicalGradientPattern 1 impo

cocos2d 绕椭圆移动

1.效果图 跟我合作的美工兼策划说要给主角加上主角光环,绕椭圆形移动.cocos2d自带没有,参考网上的写了一个. 2.椭圆数学知识 有关椭圆的数学知识我已经忘光了!网上找了点资料: a是椭圆的长半轴,b是椭圆的短半轴. o是角度,范围是[0, 2π]. 我们需要知道椭圆上的位置,可以用下面的公式: 3.直接代码了.. OvalActionInterval.h #ifndef __JumpGame__OvalInterval__ #define __JumpGame__OvalInterval_

cocos3 图片按照椭圆运动

#pragma once #include "cocos2d.h" USING_NS_CC; typedef struct _EclipseConfig { //中心点坐标 CCPoint centerPosition; //椭圆a长,三角斜边 float aLength; //椭圆c长,三角底边 float cLength; } EclipseConfig; class Eclipse:public ActionInterval { public: bool initWithDura

canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用

canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始,需要使用ctx.moveTo(x,y)方法 演示效果如下图 上代码: html <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title

OJ刷题之《可变参数--求n维空间点之间的距离》

题目描述 利用可变参数求n(N<5)维空间两点之间的距离.n维空间两点X(x1,,,,xn),Y(y1,...,yn)之间的距离定义为: 部分代码已给定如下,只需要提交缺失的代码. #include <stdarg.h> #include <iostream> #include <math.h> #include <iomanip> using namespace std; int main() { double distance(int dime,.

Cocos2d-x3.0模版容器详解之——cocos2d::Vector&lt;T&gt;, cocos2d::Map&lt;K,V&gt;, cocos2d::Value

Cocos2d-x3.0模版容器详解之一:cocos2d::Vector<T>  http://www.cocoachina.com/bbs/read.php?tid=199793Cocos2d-x3.0模版容器详解之二:cocos2d::Map<K,V>  http://www.cocoachina.com/bbs/read.php?tid=199916Cocos2d-x3.0模版容器详解之三:cocos2d::Value  http://www.cocoachina.com/b