C# 卸载和加载窗体/隐藏和关闭
C# unload and load form / hide and close
我正在使用 Windows 表单应用程序在 C# 中编写一个简单的侧滚程序。我想要它,所以当玩家触摸出口点时,这会立即加载一个新级别。
为了实现这一点,我使用了以下代码:
if (player.Bounds.IntersectsWith(exit.Bounds))
{
Form2 myNewForm = new Form2();
myNewForm.Visible = true;
this.Hide();
}
这行得通。但是,它加载了许多 form2 实例——我只希望它加载一次。我不知道怎么写这个(抱歉,我是新手 - 写这段代码花了我一段时间!)。
此外,通过新表单加载关卡效率低下。有没有办法卸载打开的表单以在同一个 window/instance 中加载下一个表单,而不是创建另一个单独的 window?
抱歉,如果不清楚。我已经做了我最好的研究+我是新来的。请不要提及 XNA!谢谢
您可以使用 Application.OpenForms[]
集合来检索打开的表单实例,然后显示它。
试试这个:
Form2 frmMyForm = (Form2)Application.OpenForms["formName"];
frmMyForm.Show();
实际问题不在于您的表单被多次加载,而在于您的游戏逻辑在到达关卡终点时没有被暂停。这意味着当新关卡已经加载时,您的游戏会继续玩旧关卡。
如果 Form1 是主窗体,那么您的整个应用程序将关闭。您需要引导程序,它将成为您应用程序的入口点,而不是 Form1。如果你这样做,你的 Form1 将是一个 child 与 Form2 相同的意义。您可以在不关闭应用程序的情况下打开和关闭它们。如果您不知道该怎么做,只需创建另一个空窗体,我们称它为 Main 并将其作为您应用程序的起始窗体。然后隐藏它并从主窗体作为模态打开 Form1。然后,当您在 Form1 中完成关卡时,关闭 Form1,代码流将 return 到主窗体,您将从主窗体生成 Form2 作为模态。您将拥有完全可预测的逻辑,所有表单都从一个受控位置打开。
您需要对项目的 Program.cs 文件稍作修改,以更改您的应用决定终止的方式。当没有更多 windows 剩余时,您可以简单地退出。让它看起来像这样:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var start = new Form1();
start.FormClosed += WindowClosed;
start.Show();
Application.Run();
}
static void WindowClosed(object sender, FormClosedEventArgs e) {
if (Application.OpenForms.Count == 0) Application.Exit();
else Application.OpenForms[0].FormClosed += WindowClosed;
}
}
现在很简单:
if (player.Bounds.IntersectsWith(exit.Bounds))
{
new Form2().Show();
this.Close();
}
我正在使用 Windows 表单应用程序在 C# 中编写一个简单的侧滚程序。我想要它,所以当玩家触摸出口点时,这会立即加载一个新级别。
为了实现这一点,我使用了以下代码:
if (player.Bounds.IntersectsWith(exit.Bounds))
{
Form2 myNewForm = new Form2();
myNewForm.Visible = true;
this.Hide();
}
这行得通。但是,它加载了许多 form2 实例——我只希望它加载一次。我不知道怎么写这个(抱歉,我是新手 - 写这段代码花了我一段时间!)。
此外,通过新表单加载关卡效率低下。有没有办法卸载打开的表单以在同一个 window/instance 中加载下一个表单,而不是创建另一个单独的 window?
抱歉,如果不清楚。我已经做了我最好的研究+我是新来的。请不要提及 XNA!谢谢
您可以使用 Application.OpenForms[]
集合来检索打开的表单实例,然后显示它。
试试这个:
Form2 frmMyForm = (Form2)Application.OpenForms["formName"];
frmMyForm.Show();
实际问题不在于您的表单被多次加载,而在于您的游戏逻辑在到达关卡终点时没有被暂停。这意味着当新关卡已经加载时,您的游戏会继续玩旧关卡。
如果 Form1 是主窗体,那么您的整个应用程序将关闭。您需要引导程序,它将成为您应用程序的入口点,而不是 Form1。如果你这样做,你的 Form1 将是一个 child 与 Form2 相同的意义。您可以在不关闭应用程序的情况下打开和关闭它们。如果您不知道该怎么做,只需创建另一个空窗体,我们称它为 Main 并将其作为您应用程序的起始窗体。然后隐藏它并从主窗体作为模态打开 Form1。然后,当您在 Form1 中完成关卡时,关闭 Form1,代码流将 return 到主窗体,您将从主窗体生成 Form2 作为模态。您将拥有完全可预测的逻辑,所有表单都从一个受控位置打开。
您需要对项目的 Program.cs 文件稍作修改,以更改您的应用决定终止的方式。当没有更多 windows 剩余时,您可以简单地退出。让它看起来像这样:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var start = new Form1();
start.FormClosed += WindowClosed;
start.Show();
Application.Run();
}
static void WindowClosed(object sender, FormClosedEventArgs e) {
if (Application.OpenForms.Count == 0) Application.Exit();
else Application.OpenForms[0].FormClosed += WindowClosed;
}
}
现在很简单:
if (player.Bounds.IntersectsWith(exit.Bounds))
{
new Form2().Show();
this.Close();
}