xna更新方法-为什么=符号的行为类似于+=
这是我关于射弹类更新方法的代码。 前一个位置的每个fram将被添加到最后一个结果,而不是替换最后一个结果。 问题的原因和解决办法是什么xna更新方法-为什么=符号的行为类似于+=,xna,Xna,这是我关于射弹类更新方法的代码。 前一个位置的每个fram将被添加到最后一个结果,而不是替换最后一个结果。 问题的原因和解决办法是什么 public void Update(GameTime gameTime) { if (Position.X != previousXPosition) { flightTime += (float)gameTime.ElapsedGameTime.TotalSeconds; Position.X += prev
public void Update(GameTime gameTime)
{
if (Position.X != previousXPosition)
{
flightTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
Position.X += previousXPosition;
Position.Y -= previousYPosition;
previousXPosition = (projectileVelocity.X * flightTime) + 0.5f * (wind * (float)Math.Pow(flightTime, 2));
previousYPosition = (projectileVelocity.X * flightTime) + 0.5f * (gravity * (float)Math.Pow(flightTime, 2));
}
以这种方式累积“飞行时间”不会导致速度变化。它假设整个飞行的每一帧速度都是这个特定帧的速度,但事实并非如此 这里有一个方法,我会建议编码的炮弹飞行。将“速度”确定为一个矢量2,其方向表示射弹的行进方向,其大小表示射弹行进的速度,单位为每秒
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; // time since last frame only
// the velocity vector will have a magnitude equiv to units traveled per second.
float speed = velocity.Length();
Vector2 windDrag = (Vector2.Negate(velocity) / speed) * (speed * speed * dragCOef);
Vector2 gravity = Vector2.UnitY * gravCOef;// gravity can be a constant per unit time.
Vector2 velocityChange = windDrag + gravity;
velocity += velocityChange * elapsed;// adds just the change of velocity this frame to the overall velocity
Position += velocity * elapsed;// 'velocity' is distance traveled per second. 'velocity * elapsed' is just distance traveled per frame
o谢谢你的回答,但我想知道为什么=符号的行为像+=登录:previousXPosition=它代表增量。我应该每次都取消它吗?previousXPosition不是增量。这是因为“flightTime”不是增量时间,而是累计时间。像这样累积时间通常不是一个好办法。你计算的表达式不容易理解。考虑将它们简化,或者将它们分隔成几个子表达式,以帮助它更加可读和可维护。