我是一个相当聪明的人,但当我看到某种数学时,我可能会成为一个巨大的白痴。我真的可以在这里使用一些帮助。
当我学习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的关系,那将会很棒。我该如何应用这个公式?这是我的代码示例(发射射弹):
- (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;
所有对象都预先加载并保持这种状态。机体设置为非活动状态,精灵设置为不可见。粒子系统停止了。再次使用抛射物则相反。
非常感谢您提供的任何帮助。我希望我没有忘记任何事情。
答案 0 :(得分: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!
答案 1 :(得分: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
:mass F
:强制Fx
:力量的水平分量Fy
:力量的垂直分量当然,每当您看到x(0)
或vy(0)
时,这些值都会在时间t获取,即它们是初始值。这些方程是basic cinematic equations,具有基本的电影变量(位置,速度,力,质量)。