技术经验分享:cocos3抛物线运动

简介: 技术经验分享:cocos3抛物线运动

"

#pragma once

#include ""cocos2d.h""

USING_NS_CC;

class Parabola:public ActionInterval

{

public:

static Parabola* create(const CCPoint& startPosition, const CCPoint& endPosition,

float //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1ODY3Ng==.html

angle, float g,float &return_duration);

//override

virtual Parabola* clone() const override;

virtual Parabola* reverse() const override;

virtual void update(float time) override;

protected:

bool initWithDuration(float duration, const CCPoint& startPosition,

const CCPoint& endPosition, float angle, float g, float vx0, float vy0);

protected:

float m_vx0;

float m_vy0;

Point m_startPosition;

Point m_endPosition;

float m_angle;

float m_dur ;

float m_tan_a;

float m_g;

};

#include ""Parabola.h""

#define PIXELS_PER_METER 100

Parabola* Parabola::create(const CCPoint& startPosition, const CCPoint& endPosition,

float angle, float g,float &return_duration)

{

Parabola *pRet = new Parabola();

float vx0,vy0, x1, y1, duration;

x1 = endPosition.x - startPosition.x;

y1 = endPosition.y - startPosition.y;

x1 /= PIXELS_PER_METER; //像素到米的转换,PIXELS_PER_METER为转换系数,这里设置为100

y1 /= PIXELS_PER_METER;

angle = angle*3.14 / 180;//convert t to radian

if (x1[span style=""color: rgba(128, 0, 128, 1)"">0)

{

angle *= -1;

}

vx0 = x1sqrt(g / 2 / (x1tan(angle) - y1)); //求出初速度

vy0 = vx0 * tan(angle);

duration = x1 / vx0; //求出整个运动的时间

return_duration = duration; //将duration通过参数返回

pRet->initWithDuration(duration,startPosition, endPosition, angle,g, vx0, vy0);

pRet->autorelease();

return pRet;

}

bool Parabola::initWithDuration(float duration, const Point& startPosition, const Point& endPosition, float angle, float g, float vx0, float vy0)

{

if (CCActionInterval::initWithDuration(duration))

{

m_vx0 = vx0;

m_vy0 = vy0;

m_startPosition = startPosition;

m_endPosition = endPosition;

angle = angle*3.14 / 180;//convert t to radian

m_angle = angle;

m_dur = duration;

m_tan_a = tan(angle);

m_g = g;


//代码效果参考: https://v.youku.com/v_show/id_XNjQwMDQxMTcwNA==.html

return true;

}

return false;

}

Parabola* Parabola::clone() const

{

CC_ASSERT(0);

return nullptr;

}

Parabola* Parabola::reverse() const

{

CC_ASSERT(0);

return nullptr;

}

void Parabola::update(float time)

{

if (_target)

{

float elapsed = _elapsed; //获得当前的运动时间

float diff_x = m_vx0 * elapsed;

float diff_y = m_vy0 elapsed - 0.5 m_g elapsed elapsed;

CCPoint newPos = ccpAdd(m_startPosition, ccp(diff_x PIXELS_PER_METER, diff_y PIXELS_PER_METER)); //单位由米转换为像素

_target->setPosition(newPos);

}

}


"
image.png
相关文章
|
6月前
|
前端开发
视觉充电:CSS动画特效,为网站带来动力与活力!(一键复制)
视觉充电:CSS动画特效,为网站带来动力与活力!(一键复制)
|
6月前
|
图形学
Unity精华☀️三、四元数(Quaternion)解决万向锁
Unity精华☀️三、四元数(Quaternion)解决万向锁
|
6月前
|
存储 API 图形学
Unity精华☀️二、到底是什么原因导致“万向锁”?旋转翻车的终极解析!
Unity精华☀️二、到底是什么原因导致“万向锁”?旋转翻车的终极解析!
|
8月前
|
定位技术 图形学
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
254 0
|
8月前
|
Python
【Python 训练营】N_9 自由落体运动
【Python 训练营】N_9 自由落体运动
36 0
|
前端开发
前端必学——实现电商图片放大镜效果(附代码)
放大镜可以说是前端人必须学会的程序之一,今天的案例为大家展示一下怎么实现放大镜的效果! 效果图展示   整个效果就是当鼠标放到展示图上的时候,会出现一个遮罩层以及弹出来一个框展示一个详情图,并且鼠标移动的时候详情图跟着移动,鼠标离开详情图消失。
|
API 图形学 C++
【Unity趣味编程】——c++实现小球的自由移动
【Unity趣味编程】——c++实现小球的自由移动
146 0
|
Python
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏02之物体运动
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏02之物体运动
142 0
|
前端开发 Python
学习笔记 | Python程序基本格式及trutle绘图函数库(奥运五环、太阳花、五角星、运动时钟、玫瑰花实例附源码)
学习笔记 | Python程序基本格式及trutle绘图函数库(奥运五环、太阳花、五角星、运动时钟、玫瑰花实例附源码)
学习笔记 | Python程序基本格式及trutle绘图函数库(奥运五环、太阳花、五角星、运动时钟、玫瑰花实例附源码)
|
Java 图形学
java游戏开发杂谈 - 游戏物体
java游戏开发杂谈 - 游戏物体现实生活中,有很多物体,每个物体的长相、行为都不同。 物体存在于不同的空间内,它只在这个空间内发生作用。 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理。
1222 0

热门文章

最新文章