【问题标题】:iterating through XNA gametime delay timer in arrays遍历数组中的 XNA 游戏时间延迟计时器
【发布时间】:2014-06-08 14:32:23
【问题描述】:

我正在尝试遍历一组子弹,以便以 0.3 秒的延迟设置每个子弹的位置。

FireTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;

            if (kbState.IsKeyDown(Keys.Space) && FireTimer > FireRate)
            {
                for (int i = 0; i < bullets.Count(); i++)
                {
                    if (bullets[i].IsAlive == false)
                    {
                        bullets[i].IsAlive = true;
                        bullets[i].position = position;
                        FireTimer = 0f;
                    }
                }

            }

我的 FireTimer 被分配了 0.0f 的值,而 FireRate 被分配了 0.3f。

当我调用此方法时,所有项目符号都被绘制并赋予相同的位置。谁能告诉我需要做什么才能让它们以 0.3 秒的间隔定位在该位置?

【问题讨论】:

    标签: c# arrays loops for-loop xna


    【解决方案1】:

    当按键按下时,您正在检查触发计时器,然后您遍历整个数组并触发每个子弹。您需要一个变量来存储剪辑中的当前索引,然后在每次发射子弹时递增它。

    int clipIndex = 0;
    
    ...
    
    
    FireTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
    
    if (kbState.IsKeyDown(Keys.Space) && clipIndex < bullets.Count() FireTimer > FireRate)
    {
        if (bullets[clipIndex].IsAlive == false)
        {
            bullets[i].IsAlive = true;
            bullets[i].position = position;
            FireTimer = 0f;
        }
        clipIndex++;
     }
    

    然后您可以通过将索引更改回 0 来重新加载;需要注意的另一件事是,如果子弹的标志 IsAlive 为真,则此未命中会触发单帧。如果你只想找到下一个活着的子弹,你可以做一个 while 语句:

    while (bullets[clipIndex].IsAlive && clipIndex < bullets.Count())
        clipIndex++;
    
    if (clipIndex < bullets.Count())
        ...
    

    if 语句发生了变化,因为您知道 clipIndex 将是一个不存在的项目符号的索引,但您确实想确保存在一个项目符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多