0

我是一个相当聪明的人,但当我看到某种数学时,我还不如成为一个巨大的白痴。我真的可以在这里使用一些帮助。

在学习 iOS 游戏开发的过程中,我一直在研究大量的东西,并且在进行一些搜索时遇到了一个公式。这是公式:

x(t) = x(0) + v(0)*t + .5 (F/m) * t^2

还说明了求解 x 和 y:

Fx = (x(t) - x(0) - vx(0)*t) * 2m/t^2

Fy = (y(t) - y(0) - vy(0)*t) * 2m/t^2

资料来源: Box2D.org 论坛

现在对于我的实际问题,这是什么意思?请记住,在这种情况下,我是个白痴。如果有人能用简单的术语解释变量以及它们与 box2d 的关系,那就太好了。我将如何应用这个公式?这是我的代码示例(发射弹丸):

- (void)spawnProjectile:(CGPoint)from direction:(CGPoint)direction inParent:(CCNode*)parentNode
{
    double curTime = CACurrentMediaTime();
    
    double timeTillShotDies = curTime + SHOT_TYPE1_EXIST_TIME;
    
    b2Body *shotBody = projectileBodyTracker[nextShot];
    
    b2Vec2 moveToPosition = b2Vec2(from.x/PTM_RATIO, from.y/PTM_RATIO);
    shotBody->SetTransform(moveToPosition, 0.0);
    shotBody->SetActive(true);
    
    CCSprite *shot = [projectiles objectAtIndex:nextShot];
    shot.position = ccp(from.x/PTM_RATIO, from.y/PTM_RATIO);

    shot.visible = YES;
    [projectilesTracker replaceObjectAtIndex:nextShot withObject:[NSNumber numberWithDouble:timeTillShotDies]];
    CCParticleSystemQuad *particle = [projectileParticleTracker objectAtIndex:nextShot];
    [particle resetSystem];
    nextShot++;
    if(nextShot >= projectiles.count) nextShot = 0;
    
    // dx2 and dy2 are analog stick values (see below code)
    b2Vec2 force = b2Vec2(dx2, dy2);
    shotBody->SetLinearVelocity(force);
     
    [AudioController playLaserShot];
}

在这段特定的代码中,我从播放器以模拟所在的角度发射。我还需要使用公式从敌人向玩家开火。这是一个自上而下的太空射击游戏。

总而言之,我如何根据 box2d 代码解决 x 和 y 随时间变化的恒定力?

额外信息:

dx2 = (float)joypadBG2.position.x - (float)convertedPoint.x;
dy2 = (float)joypadBG2.position.y - (float)convertedPoint.y;

所有对象都预先加载并保持这种方式。身体被设置为非活动状态,精灵被设置为不可见。粒子系统停止。再次使用射弹则相反。

非常感谢您提供的任何帮助。我希望我没有忘记任何事情。

4

2 回答 2

1

这是一个快速的解释:

x(t) = x(0) + v(0)*t + .5 (F/m) * t^2
Fx = (x(t) - x(0) - vx(0)*t) * 2m/t^2
Fy = (y(t) - y(0) - vy(0)*t) * 2m/t^2

这 3 个方程是标准运动方程:

  • t: 时间
  • x(t): 时间位置t
  • v(t): 时间速度t
  • vx(t): 时间速度的水平分量t
  • vy(t): 时间速度的垂直分量t
  • m: 大量的
  • F: 力量
  • Fx: 力的水平分量
  • Fy:力的垂直分量

所以当然,每次看到x(0)orvy(0)时,这些值都是在时间 t 取的,即它们是初始值。这些方程是具有基本电影变量(位置、速度、力、质量)的基本电影方程。

于 2011-06-14T14:18:17.770 回答
1

第一个方程描述了物体受到恒定力的运动。物体从位置 x(0) 开始,速度为 v(0)。x 和 v 都是向量,因此在 2d 射击游戏中,x(0) 将是 (x0,y0),或者 xy 位置,而 v(0) 将是 (vx0, vy0)。

如果没有重力,则非推进弹丸(没有推进器的弹丸)上的 F=0,因此速度将是恒定的。

x(t1) = x(t0) + vx * (t1-t0) y(t1) = y(t0) + vy * (t1-t0)

t1-t0 或 dt (delta-t) 是自上次更新弹丸位置以来经过的时间。

如果重力或重力对物体施加力,那么速度将随着时间而变化。

vx(t1) = vx(t0) + ax * (t1-t0) vy(t1) = vy(t0) + ay * (t1-t0)

a 是加速度。在游戏中,您通常不关心质量和力量,只关心加速度。在物理学中,a = F/m。

编辑 1:在电脑游戏中,您会非常频繁地更新对象的位置(通常每秒 60 次左右)。您拥有上次更新时对象的位置和速度,并且您想要计算新位置。

您通过假设速度是恒定的来更新位置:

positionVectorAt(newTime) = positionVector(lastTime) + velocityVector*(newTime - lastTime);

如果物体的速度改变了,你也更新速度:

velocityVectorAt(newTime) = velocityVector(lastTime) + accelerationVector*(newTime - lastTime);

假设我们有一个精灵

positionVector.x=100; 
positionVector.y=10;

初始速度为

velocityVector.x = 3;
velocityVector.y = -10;

精灵正在使用推进器,它每秒提供一个水平加速度

thrusterVector.x= 5; 

它还受到重力的影响,每秒产生的垂直加速度为

gravityVector.y = -10;

更新精灵位置的代码将是:

deltaTime = now - lastTime; // Time elapsed since last position update

// Update the position
positionVector.x = positionVector.x + velocityVector.x * deltaTime;
positionVector.y = positionVector.y + velocityVector.y * deltaTime;

// Update the velocity
velocityVector.x = velocityVector.x + (thrusterVector.x + gravityVector.x) * deltaTime;
velocityVector.y = velocityVector.y + (thrusterVector.y + gravityVector.y) * deltaTime;

// Done! The sprite now has a new position and a new velocity!
于 2011-06-14T13:49:19.993 回答