Cocos2d弓箭运动与空气摩擦,没有物理引擎,怎么样?

时间:2012-10-24 10:02:54

标签: cocos2d-iphone game-physics

我花了最近两天的时间来确定从弓箭射出的箭头没有完美的最终结果。以下是我到目前为止的情况:

    - (void) update:(ccTime) dt {
    elapsedTime += dt;
    CGFloat t = elapsedTime;
    float theta = CC_DEGREES_TO_RADIANS(angle);
    velocity = ccp (initialVelocity.x* cos(theta), initialVelocity.y*sin(theta));


    float k = 0.3; //this would be the air resistance factor
    float vvx = sqrtf( velocity.x*velocity.x + velocity.y*velocity.y );
    float vvy = sqrtf( velocity.x*velocity.x + velocity.y*velocity.y );

    CGFloat ax = -k*vvx; //accelerationX
    CGFloat ay = -k*vvy - gravity; //accelerationY


    velocity = ccp(velocity.x + ax * t , velocity.y + ay * t);

    CGPoint oldPosition = self.position;
    CGPoint newPosition = ccp(self.position.x + velocity.x * t + ax * t * t, self.position.y + velocity.y * t + ay * t * t);

    CGPoint v1 = CGPointMake(0.0, 0.0);
    CGPoint v2 = CGPointMake(newPosition.x - oldPosition.x ,  newPosition.y - oldPosition.y);
   CGFloat newAngle = (atan2(v2.y, v2.x) - atan2(v1.y, v1.x));
    self.rotation = CC_RADIANS_TO_DEGREES(-newAngle);
    self.position = newPosition;

}

使用此代码我得到这种行为:

使用:k = 0.3且角度= 0度,重力= 9.8

当initialVelocity = 100时,箭头有一个漂亮的抛物线轨迹

使用initialVelocity = 200时,箭头移动得更快,但轨迹与initialVelocity = 100完全相同

使用initialVelocity = 300时,箭头移动得更快,轨迹略有不同,但仍然非常接近initialVelocity = 100

的轨迹

我的代码有问题吗?请注意,我对所有概念都没有很好的理解,大部分实现都是热门话题。根据我在网上看到的内容而错过了。

2 个答案:

答案 0 :(得分:1)

你多次加入加速度。你有:

velocity = ccp(velocity.x + ax * t , velocity.y + ay * t);

然后低于:

CGPoint newPosition = ccp(self.position.x + velocity.x * t + ax * t * t, self.position.y + velocity.y * t + ay * t * t);

在我看来,你可以将第二行简化为

CGPoint newPosition = ccp(self.position.x + velocity.x * t, self.position.y + velocity.y * t);

但是,我认为你的整体算法比它需要的更复杂,这使得bug更难找到。跟踪角度应该没有任何理由;只需分离矢量并独立处理每个矢量。在伪代码中,类似这样:

// setup
vx = cos(InitAngle) * InitVelocity;
vy = sin(InitAngle) * InitVelocity;
locx = 0;
locy = 0;
gravity = -1.0;
friction  -0.01;

// loop
Update(t) {
  vx *= 1+(friction * t);
  vy +=gravity * t;
  locx += vx * t;
  locy += vy * t;
}

(我的罪恶/ cos可能会逆转;我总是犯错误。)

答案 1 :(得分:0)

Horatiu,如果你不想使用物理引擎而你想通过命中和未命中,我会建议在没有空气阻力的情况下开始。开始简单,从简单的物理学中收集帮助:抛出物体的方程(加速度,速度,位置,推导和时间),然后当它很好时,添加空气摩擦力。 如果你有正确的方程式,编码将是一个简单的步骤!