【问题标题】:Projectile delay in shooting c# game射击c#游戏中的弹丸延迟
【发布时间】:2018-11-30 10:13:06
【问题描述】:

我有一个游戏,我希望玩家能够在其上延迟发射激光。该代码有效,但我想知道我这样做是否正确。

我想知道添加延迟的正确方法是什么?

我尝试包含与问题相关的代码。

private double laserDelay;
private TimeSpan laserShootInterval = TimeSpan.FromSeconds(6);
laserDelay = laserShootInterval.TotalSeconds;

if (currentKeyState.IsKeyDown(Keys.Space))
{
    if(laserDelay == laserShootInterval.TotalSeconds)
    { 
          Shoot();
          laserDelay = laserDelay - laserShootInterval.TotalSeconds;
    }

}

UpdateLasers(graphics);


if(laserDelay < laserShootInterval.TotalSeconds)
{
      laserDelay++;
}

【问题讨论】:

  • 延迟什么?下次触发还是从按下按钮到实际触发?您是基于增量时间还是每秒固定的滴答数?
  • 我希望从下一次触发后有一个固定的时间,以便它在所有计算机上运行相同。
  • 您使用的是增量时间还是每秒固定的滴答数?
  • 没有错,只是该行应该是laserDelay &gt;= laserShootInterval.TotalSeconds
  • 补充 @MickyD 所说的,因为您使用的是浮点变量 (double),所以不要进行直接比较,而是测试它是否高于 [或等于] / 低于 [或等于]或测试该值是否接近目标而不是完全相同(因为它不太可能完全相同)

标签: c# xna monogame


【解决方案1】:

假设您没有使用增量时间(每秒固定的滴答数),我会这样做:

int delay = 6 * ticksPerSecond; // ticks to delay for
int cooldown = 0;

public void loop()
{

    if (currentKeyState.IsKeyDown(Keys.Space))
    {
        if(cooldown <= 0)
        { 
              Shoot();
              cooldown = delay
        }

    }

    UpdateLasers(graphics);


    if(cooldown > 0){
          cooldown -= 1;
    }
}

【讨论】:

  • 最好让它基于时间,使其独立于固定或非固定的Unity模式。如果有人更改模式,将导致代码维护增加
  • 我不熟悉 Unity,问题上没有 Unity 标签,所以我尽量保持简单(也请参阅我的 cmets 问题)。我也同意,如果可能的话,它应该是基于时间的。
  • 完全正确。很确定 XNA 也有类似的东西,此外,游戏引擎设计中的其他一切都是基于时间的,特别是自上一帧以来经过的时间,而不是当前帧索引替代方案。
  • @MickyD 就像我使用它们一样,相当肯定它默认固定为 30tps,但如果你愿意,你可以解锁它
  • 优秀。为你 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多