"
#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);
}
}
"