cocos2dx3.0关于实现椭圆运动
椭圆数学知识
首先椭圆一开始是有一个公式的
S=π(圆周率)×a×b(其中a,b分别是椭圆的半长轴,半短轴的长).或S=π(圆周率)×A×B/4(其中A,B分别是椭圆的长轴,短轴的长).
c1c2clone可以依据关于圆的有关公式,类比出关于椭圆公式.
这个公式是面积公式的,周长公式没有精确计算的公式,该公式就是百度来的借鉴一下。
椭圆那就有一个长半轴和短半轴根据椭圆第一定义,用a表示椭圆长半轴的长,b表示椭圆短半轴的长,且a>b>0。
椭圆周长公式:L=2πb+4(a-b)
椭圆周长定理:椭圆的周长等于该椭圆短半轴长为半径的圆周长(2πb)加上四倍的该椭圆长半轴长(a)与短半轴长(b)的差。
椭圆的参数方程: x=acosθ , y=bsinθ (θ为参数)
这里主要是用了椭圆的一个“参数方程”,还有很多就不一一介绍了百度很多都有的。。。。。。。。。。。。。。等等
a是椭圆的长半轴,b是椭圆的短半轴。 o是角度,范围是[0, 2π]。(注:自己画的画好还请见谅)
------------头文件设定------------
#ifndef __SP__OvalAction__
#define __SP__OvalAction__
/*
x=acosθ , y=bsinθ (θ为参数)
*/
#include "cocos2d.h"
定义一个结构来包含确定椭圆的参数
typedef struct OvalConfig {
//中心坐标
cocos2d::Vec2 centerPos;
//长半径
float a;
//短半径
float b;
//是否逆时针运动
bool moveClockDir;
//层级设置
std::pair<int, int> zOrder;
}LOvalConfig;
//椭圆的运动
class MoveOvalBy : public cocos2d::ActionInterval {
public:
MoveOvalBy();
~MoveOvalBy();
//动作持续时间 和 椭圆控制参数 初始化动作
bool initWithDuration(float dt, const OvalConfig& c);
virtual MoveOvalBy* clone() const override;
virtual MoveOvalBy* reverse() const override;
virtual void update(float dt);//运用Update函数来进行不断的坐标设定
virtual void startWithTarget(cocos2d::Node *target) override;
public:
//动作持续时间 和 椭圆控制参数 初始化动作
static MoveOvalBy* create(float dt, const OvalConfig& c);
protected:
OvalConfig _config;
//x = a * cos(t) t = [0, 2π]
//当期那返回一个X坐标,,,,运用的是一个参数方程
inline float getPosXAtOval(float dt) {
if (_config.moveClockDir) {
return _config.a * cos(4 * MATH_PIOVER2 * dt);
}
return _config.a * cos(4 * MATH_PIOVER2 * (1 - dt));
}
//y = b * sin(t) t = [0, 2π]
//当期那返回一个Y坐标,,,,运用的是一个参数方程
inline float getPosYAtOval(float dt) {
if (_config.moveClockDir) {
return _config.b * sin(4 * MATH_PIOVER2 * dt);
}
return _config.b * sin(4 * MATH_PIOVER2 * (1 - dt));
}
};
#endif
---------------------------Cpp文件---------------------
#include "OvalActionInterval.h"
USING_NS_CC;
MoveOvalBy::MoveOvalBy()
{
}
MoveOvalBy::~MoveOvalBy()
{
}
//利用定义的椭圆的参数初始化椭圆
MoveOvalBy *MoveOvalBy::create(float dt, const OvalConfig &c)
{
auto moveOvalBy = new MoveOvalBy();
if (moveOvalBy && moveOvalBy->initWithDuration(dt, c))
{
moveOvalBy->autorelease();
return moveOvalBy;
}
return nullptr;
}
bool MoveOvalBy::initWithDuration(float dt, const OvalConfig &c)
{
if (ActionInterval::initWithDuration(dt))
{
_config = c;
return true;
}
return false;
}
void MoveOvalBy::update(float dt)
{
//用之前的坐标计算函数计算坐标
//由于需要画计算出的椭圆做值是以原点为中心的,所以需要加上我们设定的中心点坐标
if (_target)
{
float x = getPosXAtOval(dt);
float y = getPosYAtOval(dt);
_target->setPosition(_config.centerPos + Vec2(x, y));
if (dt <= 0.5)
{
_target->setZOrder(_config.zOrder.first);
}
else
{
_target->setZOrder(_config.zOrder.second);
}
}
}
MoveOvalBy *MoveOvalBy::clone() const
{
auto moveOvalBy = new MoveOvalBy();
if (moveOvalBy && moveOvalBy->initWithDuration(_duration, _config))
{
moveOvalBy->autorelease();
return moveOvalBy;
}
return nullptr;
}
MoveOvalBy *MoveOvalBy::reverse() const
{
OvalConfig newConfig;
newConfig.a = _config.a;
newConfig.b = _config.b;
newConfig.centerPos = _config.centerPos;
newConfig.moveClockDir = !_config.moveClockDir;
newConfig.zOrder = _config.zOrder;
return MoveOvalBy::create(_duration, newConfig);
}
void MoveOvalBy::startWithTarget(Node *target)
{
ActionInterval::startWithTarget(target);
}
---------------------------------------------------------------------运用
//调用方式
auto visibleSize = Director::getInstance()->getVisibleSize();
auto s1 = Sprite::create("CloseSelected.png");
addChild(s1);
s1->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
auto s2 = Sprite::create("CloseNormal.png");
addChild(s2);
OvalConfig c;
c.a = 100;
c.b = 60;
c.centerPos = s1->getPosition();
c.moveClockDir = false;
c.zOrder.first = -1;
c.zOrder.second = 1;
s2->runAction(RepeatForever::create(MoveOvalBy::create(1.0f, c)));
----------------
代码也是借鉴几位前辈的,如果多有冒犯还请见谅,第一次写。
写这个也主要是面试的时候被问到的一个这么个问题,谨记!!!!!
cocos2dx3.0关于实现椭圆运动相关推荐
- 在Windows环境下编译cocos2d-x-3.0
1. 安装配置开发环境 1.1 安装JDK 1) 下载并安装jdk-7u7-windows-i586.exe 2) 设置[JAVA_HOME]为"C:\Program Files\J ...
- Cocos2d-x3.0游戏实例《不要救我》第一章——前言
我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物...
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...
- 利用 Cocos2dx-3.0 新物理特性模拟弹珠迷宫
本文转自:http://segmentfault.com/a/1190000000393216 前言 看到这张图,不知道你会不会想到些什么?儿时的玩物,满满的童年的味道.那时候没有太多玩具,这些小玩意 ...
- 如何使用cocos2dx3.0制作基于tilemap的游戏:第二部分
引言 程序截图: 这篇教程是<如何使用cocos2dx3.0制作基于tilemap的游戏>的第二部分.在上一个教程中,我们创建了一个简单的基于tiled地图的游戏,里面有一个忍者在沙漠里寻 ...
- cocos2dx-3.0 环境安装
这里我只是简单写下如何在wondows下运行例程. 环境要求: windows cocos-2dx-3.0(http://www.cocos2d-x.org/download) Visual Stdu ...
- Cocos2d-x3.0游戏实例《别救我》目录导航(共10篇,已完结)
这个5.1假期还真不错,有个小惊喜,那就是,我某个游戏今天的下载量爆表了,突破历史最高点~! 于是,我决定写一个新的游戏实例教程,以示庆祝~ 啊才怪啊~!这教程5.1之前就在写了,我还因此暂停了差不多 ...
- 在cocos2d-x3.0里面如何使用物理引擎:弹球
前言 程序截图: 这个教程的目的就是让你们熟悉在cocos2d-x3.0里面如何使用新版的物理引擎,所采用的例子就是制作一个简单的应用,里面有一个篮球,你可以通过旋转你的手机来改变重力的方向,同时篮球 ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
好吧,我真心全然搞不懂.我如今仅仅只是是写了3个类而已.怎么就已经到第八篇了?我感觉我说话已经够简单明了毫不唠叨了,真是奇怪.(小若:我噗.噗噗.) 好吧,既然如今主角已经能出现而且进行操作了.那,也 ...
- Cocos2d-x3.0游戏实例之《别救我》第十篇(完结)——用Json配置各类型怪物数据
现在我们有2种类型的怪物,而且创建的时候是写死在代码里的,这是要作死的节奏~ 所以,必须可配置,不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...
最新文章
- 【Qt】QImage使用总结
- 基于fedora23的karora23初始版本安装crt信赖libpng升级glibc造成系统无法进入...
- 写个测试程序测试下,单片机使用浮点型数效率有多低
- linux 之RAID详解
- tomcat虚拟目录和虚拟主机等相关配置
- 6410 实现 linux 串口驱动详解
- javascript 对象的设计模式
- 2016年3-8,哦,好日子
- 补充“为什么Scrum不行”
- Linux软件包管理之源码包、脚本安装包
- 5.3 Seq2seq与 Attention的结合:原理与计算过程
- 初次使用dcm4che-tool-findscu做查询
- 图解大数据 | 大数据分析挖掘-Spark初步
- 15个数据可视化的绝妙案例
- EBS中的销售员SQL
- mc无可用java_新人求助,MC无法打开,内存java均无问题
- 算法训练 4-2找公倍数
- 多个excel工作簿、工作表合并
- android画布裁剪圆角,Android 视图圆角化处理方案
- 国内最全的Android市场,最全Android软件商店
热门文章
- 安卓原生系统_有效解决跳过原生安卓系统开机验证问题的方法,赶快上车
- 修改Android手机的分辨率和屏幕密度
- PHP获取当前完整网址加HTTP/HTTPS
- ESP32学习10:TcpClient
- 模型笔记1---3d max 导入obj模型设置
- CentOS加入Windows域
- 山东大学软件学院《数据仓库与数据挖掘》复习知识点
- 装系统缺少硬盘驱动_缺少操作系统-向我学习,请在今年备份您的硬盘!
- java 异或_Java异或详解
- java 抓取搜狗微信_大虾们,求帮助……用httpclient 进行获取微信搜狗公众号文章问题...