我正在做一个基于文本的冒险游戏。在游戏中,有一个列表框显示文本,文本框用户输入命令:
我把游戏循环放在Game_Load方法中,这会产生一个问题,因为它一直在检查TextBox内容,而且由于在用户有机会键入任何内容之前它是空的,所以它返回null并崩溃。
我已经做了一个类似的游戏作为一个控制台应用程序之前与此代码:
while(run)
{
Console.WriteLine("What is your next step?");
var input = Console.ReadLine().ToLower();
if (input == Text.Language.Quit)
run = false;
else
Actions.Instance.Execute(input.Split(" "));
}
它运行得很好,现在我很难把它转换成Windows窗体,我不知道该把哪个方法放在哪里来避免这个问题。
如何使游戏在需要之前不要求输入?
我试着创建一个GetText方法,并调用它来代替var input = ......但也不起作用。我试着将while(run)从Form_Load中移出,但它并不总是像它应该的那样运行。
1条答案
按热度按时间a2mppw5e1#
据我所知,您想要的东西,外观和行为像一个控制台,但在WinForms应用程序,这是一个风格的选择。* 否则有更好的方式来提示用户输入WinForms!*
运行一个类似于控制台应用程序的“游戏循环”是可能的,但需要特别小心。我们说WinForms是“事件驱动”的,因为应用程序有一个消息循环来监听鼠标点击和按键等事件。但这意味着,例如,这个循环将陷入等待按键的状态,因为它“阻塞了UI线程”来“检测”这些按键。
另一方面,在
async
方法中使用的await
关键字将导致该方法立即返回,但当“发生某些事情”时,会在此处继续:异步读取命令
在调用
ReadLineAsync()
时阻止。按下[Enter]键时,解锁信号量。
异步游戏循环示例
下面是我用来测试这个答案的代码: