XNA:减慢绘制间隔

时间:2014-10-21 20:42:07

标签: c# xna-4.0

我正在快速绘制一个tileset来可视化算法,所以我转向XNA为我做绘图。问题是它总是尽可能快地绘制,我想减慢速度,而不是每X毫秒绘制一次,其中X根据局部变量是任意的。例如,每100毫秒绘制一次。我尝试使用IsFixedTimeStep和TargetElapsedTime,但所有这些都是触发了正确数量的更新,但每隔X毫秒绘制一次,导致缺少所有中间步骤。

有谁知道怎么解决这个问题?这是我的绘图和更新方法:

protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    // TODO: Add your update logic here
    if (Mouse.GetState().LeftButton == ButtonState.Pressed)
    {
        _engine.SpreadFire();
    }

    if (Keyboard.GetState().IsKeyDown(Keys.Escape))
    {
        _engine.InitializeBoardStates(5);
        SuppressDraw();
    }

    base.Update(gameTime);
}

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    for (var i = 0; i < _engine.BoardStates.Count; i++)
    {
        for (var j = 0; j < _engine.BoardStates[i].Count; j++)
        {
            var isOnFire = _engine.BoardStates[i][j];
            this.spriteBatch.Draw(isOnFire ? LitTile : NormalTile, new Rectangle(j * 10, i * 10, 10, 10), Color.White);
        }
    }
    spriteBatch.End();

    base.Draw(gameTime);
}

(我也对我做错了和/或效率低下的小事采取任何建议。我今天下午才开始关注XNA。)

2 个答案:

答案 0 :(得分:1)

如果您还没有画出(如X变量所示),是否有任何理由可以退出Draw例程?不过,只需在绘制时跟踪最后的drawTime即可。

答案 1 :(得分:0)

如果你在Update方法中尝试以下(或类似),我相信它会达到预期的效果,尽管我还没有测试过。

// This should restrict your code to running once per 100 ticks
if (gameTime.ElapsedGameTime.Ticks % 100 == 0)
{
    if (Mouse.GetState().LeftButton == ButtonState.Pressed)
    {
        _engine.SpreadFire();
    }

    if (Keyboard.GetState().IsKeyDown(Keys.Escape))
    {
        _engine.InitializeBoardStates(5);
        SuppressDraw();
    }
}

然后您可以使用gameTime.ElapsedGameTime.TotalSeconds或类似内容,这里是TimeSpan结构的MSDN documentation。同时将值更改为mod会影响更新的速度。