【问题标题】:Creating a second runloop inside XNA在 XNA 中创建第二个 runloop
【发布时间】:2011-03-13 09:43:03
【问题描述】:

我正在将游戏引擎从 Java 移植到 Windows Phone 7 XNA。我正在努力解决的一件事是如何创建模式对话框。该对话框是使用 SpriteBatch 在 XNA 中呈现的,就像其他所有内容一样,但我基本上想要的是这样的:

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() 方法。它直接进入 Game 构造函数。

【问题讨论】:

  • 这在 XNA 中很难做到。你试过这个吗? msdn.microsoft.com/en-us/library/ff827868.aspx
  • 我知道这个方法,我知道如何使用精灵实现自定义对话框的异步显示,但我真的在寻找一种同步的方法。我已经非常接近(当然不受支持)RunOneFrame,我只是缺少输入。
  • 我一直在研究使用其他方法检测触摸和键盘状态,但到目前为止还没有运气。唯一可用的方法似乎特定于 XNA(不起作用)和 Silverlight(我没有使用)。

标签: c# windows-phone-7 xna xna-4.0


【解决方案1】:

您要做的是添加另一个“状态”,您只需要显示对话框,直到用户不选择某些内容...和_modalDialogIsUp bool..

    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
        }
    }

我只是无法理解为什么你如此绝望地想要完全模态行为......它是某种新的“同步”教派吗? :)

【讨论】:

  • 我想要它,因为我正在移植一个拥有它的游戏引擎,如果我希望能够轻松地从已经使用它的平台上移植使用这个游戏引擎的游戏,它需要表现相同方法。所以这不是一个可接受的解决方案。
猜你喜欢
  • 2011-11-06
  • 2023-03-17
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多