如何在Windows Forms中从另一个窗体恢复游戏计时器的运行?
解决方案
方案1:使用模态对话框实现(改动最小,推荐)
暂停状态下不需要操作游戏主窗体,直接用模态弹窗阻塞主流程,等待暂停窗口操作完成后直接在主窗体后续逻辑重启计时器即可,改法如下:
- 修改游戏主窗体
Paused方法代码:
private void Paused() { gameTimer.Stop(); PausedScreen pausedWindow = new PausedScreen(); // ShowDialog会阻塞当前线程,直到暂停窗口关闭才会执行后续代码 pausedWindow.ShowDialog(); // 暂停窗口关闭后直接重启计时器 gameTimer.Start(); isPaused = false; }
- 修改暂停界面窗体
UnPause方法代码:
private void UnPause(object sender, EventArgs e) { // 关闭当前暂停窗口,触发主窗体后续逻辑 this.Close(); } private void QuitGame(object sender, EventArgs e) { Application.Exit(); }
方案2:传递主窗体引用(适用于需要非模态暂停窗的场景)
如果你需要暂停窗弹出时仍可操作主窗体,可以把主窗体实例传递给暂停窗,直接调用主窗体的计时器启动逻辑:
- 首先给暂停窗体新增带主窗体参数的构造函数,注意将代码中
GameForm替换为你实际的游戏主窗体类名:
// 存储主窗体实例 private GameForm _mainGameForm; public PausedScreen(GameForm mainForm) { InitializeComponent(); _mainGameForm = mainForm; } private void UnPause(object sender, EventArgs e) { Hide(); // 调用主窗体的游戏恢复逻辑 _mainGameForm.ResumeGame(); } private void QuitGame(object sender, EventArgs e) { Application.Exit(); }
- 在游戏主窗体新增公有恢复方法,同时修改
Paused方法传参:
// 主窗体新增公有恢复方法,符合封装规范不需要暴露计时器控件 public void ResumeGame() { gameTimer.Start(); } private void Paused() { gameTimer.Stop(); // 把当前主窗体实例传递给暂停窗 PausedScreen pausedWindow = new PausedScreen(this); pausedWindow.Show(); isPaused = false; }
内容的提问来源于stack exchange,提问作者ineedhelp
相关产品推荐
相关产品推荐

