Cocos2d iphone Cocos2d弓箭运动与空气摩擦和没有物理引擎,如何?

Cocos2d iphone Cocos2d弓箭运动与空气摩擦和没有物理引擎,如何?,cocos2d-iphone,game-physics,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

在过去的两天里,我一直在琢磨从弓上射出的箭的运动,但没有完美的结局。以下是我到目前为止的情况:

    - (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的轨迹


我的代码有问题吗?请注意,我对所有的概念都不是很了解,很多实现都是基于我在网上读到的内容而进行的。

Horatiu,如果你不想使用物理引擎,你想通过hit&miss,我建议在没有空气阻力的情况下开始。从简单的开始,从简单的物理中获得帮助:投掷物体的方程式(加速度、速度、位置、导数和时间),然后在情况良好时,添加空气摩擦力。
当你有了正确的方程式,编码将是一个简单的步骤

您多次添加加速度。你有:

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;
}

(我可能把正误颠倒过来;我总是弄错。)

你真的需要自己来实现吗?你已经花了两天的时间,但你可以通过花几个小时在你的项目中添加物理引擎来实现这一点。好吧,对于一个知道自己在做什么的人来说,这应该不是一项非常困难的任务,我认为我不应该仅仅为此依赖物理引擎。好的。在这种情况下,根本不用框架,不用objective-c,用汇编语言编写程序。我看不出你的回答有什么相关性。很明显,你对这个问题没有任何线索,但仍然有反应。有什么原因吗?我同意Horatiu的观点,我相信这很简单,实现一个庞大的、臃肿的物理引擎会有点过头。按照Morion的说法,不妨跳过整个游戏开发过程,从game Stop购买视频游戏!这比自己做要简单得多/讽刺。在主题中,对于旋转,您可以计算箭头将落在何处,然后在箭头与地面碰撞所需的时间内,将箭头的旋转增加90度,或者其他任何相关的角度。此外,如果您需要箭头的角度,请通过执行vx和vy的arctan分别计算它。。。但不要让它成为你实际运动计算的一部分。另外,我修改了摩擦力的计算,使之成为乘法而不是加法;那样更现实。否则,摩擦可能导致向后运动加速。也。。。我没有对Y分量施加摩擦力,但它可能应该加上,在加上重力加速度后乘以它。谢谢你的详细回答。运动正在使用你的建议。然而,当我在vy组件上添加摩擦力时,我的箭头在应该向下的时候向上。我做的是vy+=重力*t*摩擦力。这是错的吗?