您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx扩展CCAction实现精灵抛物线运动

2014-11-30 20:46 190 查看
  在不使用物理引擎的情况下,模拟物体在重力作用下的抛物线运动(忽略空气阻力)。给出运动起始点位置,终点位置,重力加速度g,起始点的发射角作为参数。

  先根据已知条件求出物体在x轴和y轴上的初速度,再根据公式f(t)=v0t+0.5*at2 求出运动轨迹。

   类CCParabolaMove继承自CCAction。

CCParabolaMove* CCParabolaMove::create(const CCPoint& startPosition, const CCPoint& endPosition, float angle, float g,float &return_duration)
{
CCParabolaMove *pRet = new CCParabolaMove();
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<0)
{
angle *= -1;
}

vx0 = x1*sqrt(g / 2 / (x1*tan(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;
}


create()为静态函数,所以对非静态成员变量的赋值要在initWithDuration()中实现:

bool CCParabolaMove::initWithDuration(float duration, const CCPoint& startPosition, const CCPoint& 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;
return true;
}

return false;
}


在runaction时startWithTarget(CCNode *pTarget)会首先被调用,通过pTarget为执行动作的对象指针:

void CCParabolaMove::startWithTarget(CCNode *pTarget)
{
CCActionInterval::startWithTarget(pTarget);

}


update(float t)中参数t表示当前运动时间与整个运动时长的比值,范围0到1。

void CCParabolaMove::update(float t)
{
if (m_pTarget)
{
float elapsed = t * m_fDuration; //获得当前的运动时间
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)); //单位由米转换为像素
m_pTarget->setPosition(newPos);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: