xna更新方法-为什么=符号的行为类似于+=

xna更新方法-为什么=符号的行为类似于+=,xna,Xna,这是我关于射弹类更新方法的代码。 前一个位置的每个fram将被添加到最后一个结果,而不是替换最后一个结果。 问题的原因和解决办法是什么 public void Update(GameTime gameTime) { if (Position.X != previousXPosition) { flightTime += (float)gameTime.ElapsedGameTime.TotalSeconds; Position.X += prev

这是我关于射弹类更新方法的代码。 前一个位置的每个fram将被添加到最后一个结果,而不是替换最后一个结果。 问题的原因和解决办法是什么

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”不是增量时间,而是累计时间。像这样累积时间通常不是一个好办法。你计算的表达式不容易理解。考虑将它们简化,或者将它们分隔成几个子表达式,以帮助它更加可读和可维护。