我正在开发一款 trivia kahoot 风格的游戏,其客户端基于 WPF 框架(向所有有同样问题的 magshimim 同学问好)
加载游戏窗口时,该窗口应该向服务器请求并显示问题,但该窗口显示为空白。没有编译错误或运行时异常,当我单击任务栏中的最小化窗口时,它没有打开。
public GameQuestionWindow(Communicator communicator, MenuWindow menu, int timePerQuestion, int questionsLeft, Window prevWindow)
{
this.Show();
InitializeComponent();
prevWindow.Close();
m_communicator = communicator;
m_questionsLeft = questionsLeft;
m_menuWindow = menu;
m_mediaPlayer = new MediaPlayer();
m_mediaPlayer.Open(new Uri("pack://application:,,,/Client;component/Audio/tick.mp3"));
time = TimeSpan.FromSeconds(timePerQuestion);
timer = new DispatcherTimer();
gameLoop();
}
我尝试在初始化后执行
this.Show()
,或者使用ShowDialog(),但后者的问题是没有后台游戏逻辑被执行,线程被停止,而窗口再次为空白。
这就是窗口的创建方式:
if (serverResp.getCode() == 150)
{
shouldStop = true;
GameQuestionWindow window = new GameQuestionWindow(this.communicator, this.menuWindow, answerTimeout, answerAmount, this);
}
shouldStop
用于后台刷新线程,无关紧要。
我不能将 window.Show() 放在构造函数之后,因为所有游戏逻辑都在构造函数的主线程上执行,如前所示,这意味着如果在构造函数返回后调用 Show(),则只会在游戏结束后调用完成,只要调用窗口之前没有关闭(确实如此)。
在 Visual Studio XAML 设计器中,游戏窗口显示没有问题。
问题是,
GameQuestionWindow
的构造函数永远不会完成,因为gameLoop
永远不会返回,将游戏循环更改为异步任务将解决您的问题
public async Task gameLoop()
{
while (true)
{
// simulate what happen;
await Task.Delay(1000);
QuestionsLeft++;
}
}
请考虑以下代码永远不会返回给调用者,并且它会导致您的情况出现问题
public void gameLoop()
{
while (true)
{
// simulate what happen;
Task.Delay(1000).Wait();
QuestionsLeft++;
}
}