在XNA内创建第二个runloop

问题描述:

我正在将游戏引擎从Java移植到Windows Phone 7 XNA。我正在努力的一件事是如何创建模态对话框。该对话框使用SpriteBatch就像一切在XNA渲染,但我想基本上是这样的:在XNA内创建第二个runloop

result = Dialog.Ask("Some Question?", DialogButtons.YesNo); 

哪里Dialog.Ask不会返回,直到用户点击一个按钮。我已经做了接近的唯一一件事就是对游戏不断调用RunOneFrame()的方法:

private int runLoopCount; 
public void BeginRunLoop() { 
    int runIndex = ++runLoopCount; 
    while (runLoopCount == runIndex) { 
    RunOneFrame(); 
    Thread.Sleep(1); 
    } 
} 

public void EndRunLoop() { 
    --runLoopCount; 
} 

有几个问题是:

  1. RunOneFrame只是推测用于调试目的。
  2. 输入无效!调用TouchPanel.GetState()GamePad.GetState(PlayerIndex.One)不会返回新值。

有什么办法可以在不抛弃Game类的情况下启动一个运行循环,并且它可以用于初始化吗?而且我不知道无论如何,没有Game类,因为Windows Phone 7 XNA应用程序中没有Main()方法。它直接进入游戏构造函数。

+0

这在XNA中很难做到。你试过这个吗? http://msdn.microsoft.com/en-us/library/ff827868.aspx – 2011-03-12 22:09:10

+0

我知道的方法,我知道如何去实现使用精灵的自定义对话框的异步显示,但我真的很期待为了一种同步的方式。我已经如此接近(肯定不支持)的RunOneFrame,我只是缺少输入。 – 2011-03-12 22:27:17

+0

我一直在寻找检测触摸和键盘状态使用其他方法,但没有运气到目前为止。唯一可用的方法似乎是特定于XNA(不起作用)和Silverlight(我没有使用)。 – 2011-03-18 21:10:26

你想要做的是增加一个“国家”,你只需要显示对话框,直到用户没有选择的东西......和_modalDialogIsUp布尔..

protected override void Update(GameTime gameTime) 
    { 
     if (_modalDialogIsUp) 
     { 
      // handle only secesary mouse and button clicks 
     } 
     else 
     { 
      // normal mouse and button clicks 
     } 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     if (_modalDialogIsUp) 
     { 
      // draw only modal dialog 
     } 
     else 
     { 
      // draw game 
     } 
    } 

我做不到undestang为什么你如此绝望地想要确切的模态行为......它是一种新的“同步”派? :)

+0

我想要它,因为我正在移植一个拥有它的游戏引擎,并且如果我希望能够从已经在使用它的平台上使用此游戏引擎轻松移植游戏,则它需要以同样的方式运行。所以这不是一个可接受的解决方案。 – 2011-03-13 04:48:28