我正在创建一个简单的游戏,每当我离开菜单时,我想要一个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);
}
//..//
}
然而,这只是在菜单上暂停了三秒钟,然后立即让你进入游戏。你可以一瞬间看到一个随机数,但根本不是一个真正的倒计时。我可以做些什么来暂停游戏并继续绘制游戏?
答案 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
通过这种方式,您可以获得游戏暂停的错觉,但不会冻结更新 - 绘制循环。