如何在XNA中倒计时创建类似暂停的效果

时间:2015-11-12 20:46:06

标签: c# xna

我正在创建一个简单的游戏,每当我离开菜单时,我想要一个3秒的计时器来掩盖屏幕,同时游戏暂停。我曾经想过我会做这样的事情

protected void Draw(GameTime gameTime)
{
    //..//
    for(int i = 3; i > 0; i--)
    {
        spriteBatch(gameFont, i.ToString(), new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2), Color.White);
        Thread.Sleep(1000);
    }
    //..//
}

然而,这只是在菜单上暂停了三秒钟,然后立即让你进入游戏。你可以一瞬间看到一个随机数,但根本不是一个真正的倒计时。我可以做些什么来暂停游戏并继续绘制游戏?

1 个答案:

答案 0 :(得分:0)

Thread.Sleep()

在最好的情况下,您希望避免使用Draw()而我无法想到任何时候,您应该在游戏中使用它。游戏应该运行平坦,你想要最小化CPU阻塞或只是睡觉的情况

  

我可以做些什么来暂停游戏并继续绘制游戏?

通常在游戏中(XNA也不例外),绘制代码状态更新机制分开。这意味着您的Update()应该专注于绘图而不是其他任何内容。

暂停可被视为游戏,并且可以更好地在您的游戏enum States { Initialising, InMenu, LeavingMenu, InGame, } States _state; 中处理。

考虑在游戏中添加一个状态,或许:

Update()

然后在您的DateTime timeOfEscPressed; protected virtual void Update(GameTime gameTime) { switch (_state) { case States.Initialising: break; case States.InMenu: // *** pseudo-code here *** // if ESC pressed then // _state = States.LeavingMenu // timeOfEscPressed = DateTime.Now; break; case States.LeavingMenu: // stay in this state for 3 seconds if ((DateTime.Now - timeOfEscPressed).TotalSeconds >= 3) { _state = States.InGame; } break; case States.InGame: if (menuKeyPressed) // pseudo code { _state = States.InMenu; timeOfEscPressed = DateTime.Now; } break; } } 中,您可以使用状态机,从菜单中切换;离开菜单;最终在游戏中:

protected void Draw(GameTime gameTime)
{
    switch (_state)
    {
        case States.InMenu:
            DrawMenu();
            break;
        case States.LeavingMenu:
            ShowTimer();
            break;
    }
}

您的绘图代码就是这样,绘制代码:

def revstr(a):
    b=''
    if len(a)%2==0:
        for i in range(0,len(a),2):
            b += a[i + 1] + a[i]
        a=b
    else:
        c=a[-1]
        for i in range(0,len(a)-1,2):
            b += a[i + 1] + a[i]
        b=b+a[-1]
        a=b
    return b
a=raw_input('enter a string')
n=revstr(a)
print n

通过这种方式,您可以获得游戏暂停的错觉,但不会冻结更新 - 绘制循环。