技术经验分享: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
相关文章
|
1天前
|
定位技术 图形学
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
6 0
|
1月前
|
计算机视觉 索引 Python
分析”圣诞帽“代码,入门OpenCV
分析”圣诞帽“代码,入门OpenCV
分析”圣诞帽“代码,入门OpenCV
|
Python
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏02之物体运动
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏02之物体运动
103 0
|
Python
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏03之重力及碰撞检测
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏03之重力及碰撞检测
150 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏05图像仿射变换(平移和缩放操作)
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏05图像仿射变换(平移和缩放操作)
125 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏09之sprite动画
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏09之sprite动画
139 0
|
前端开发 JavaScript
2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
432 0
2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
|
开发者
干货送上,小程序运动步数实战分享
小程序开发讲堂开课了,首期讲堂带来《小程序运动步数实战分享—众安保险》,让您尝鲜小程序步数能力新玩法。
1212 0
干货送上,小程序运动步数实战分享
|
Java 图形学
java游戏开发杂谈 - 游戏物体
java游戏开发杂谈 - 游戏物体现实生活中,有很多物体,每个物体的长相、行为都不同。 物体存在于不同的空间内,它只在这个空间内发生作用。 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理。
1182 0
|
vr&ar 图形学 开发者
在Unity中使用UFPS创建第一人称射击游戏
UFPS,即 Ultimate FPS,是由Opsive(FPS) 开发的模板项目,这个项目对初级或中级开发者来说是必不可少的,因为它可以帮助您提高FPS游戏运行效率。它是Unity Asset Store中维护时间最长的资源之一, 在整个生命周期中,得到了来自开发者的诸多好评。
1500 0