我试图让我的winForms相互融合,比如Manhole。所有表格都在屏幕中央打开。任何帮助将不胜感激。
这是我目前打开和关闭表单的方式:
private void storyChooser_Click(object sender, EventArgs e)
{
switch (userChoice)
{
case Choice.Son:
this.Close();
form2.Show();
form2.label1.Text = "Son has been choosen.";
break;
case Choice.Dad:
this.Close();
form2.Show();
form2.label1.Text = "Dad has been choosen.";
break;
case Choice.Mom:
this.Close();
form2.Show();
form2.label1.Text = "Mom has been Choosen.";
break;
default:
break;
}
}
要停止关闭应用程序,我从一开始就运行所有表单,但未显示。我无法获得更有效的内存工作方式,因此我现在正在使用它作为一种解决方法。
答案 0 :(得分:1)
你想要的是一种交叉淡入淡出。您拍摄图像并将每个像素从一个图像插值到另一个图像。
这很容易做到。假设时间从0(所有第一个图像)到1.0(所有最后一个图像),那么你将会做这样的事情:
public Color Lerp(Color c1, Color c2, float t)
{
return Color.FromArgb(Lerp(c1.R, c2.R, t), Lerp(c1.G, c2.G, t), Lerp(c1.B, c2.B, t));
}
public int Lerp(int a, int b, float t)
{
float tp = 1.0f - t;
return (int)(tp * a + t * b);
}
您的流程将是:
现在,您可以编写此代码,并确保它可以正常工作。如果表现足够好,就这样吧。
我认为你实际上并不想使用这段代码(我为了生活而编写图像处理代码)。在.NET中执行所有像素修改的开销可能会让你陷入困境。你可能最好从位图获取原始字节字节并对它们执行lerp而不是执行get / get / set像素。此外,每个颜色组件的那三个浮点运算也会拖累你,所以如果是我的话,如果我在字节上操作,我会在固定点上完成工作。
答案 1 :(得分:0)
首先:WinForms不是创建游戏的最佳选择。
但是如果你想要或不得不应该使用多种表格来完成这项任务。
您可以在一个表单中创建多个面板,然后使用计时器操纵它们的不透明度。
如果您制作大型游戏,则必须动态创建屏幕。
<强>示例强>
以下是如何动态创建控件的示例。您可以开始为不同的场景创建自己的控件(例如,为一个问题的不同答案提供n个组合框的控件)。然后你可以开始用步骤定义你的故事,然后每一步都会创建正确的控制,就像一个“决定步骤”,它会询问一个问题并根据答案选择下一步。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var newButton = new Button { Text = "Click me", Dock = DockStyle.Top };
newButton.Click += new EventHandler(newButton_Click);
this.panel1.Controls.Add(newButton);
}
void newButton_Click(object sender, EventArgs e)
{
MessageBox.Show("I was clicked");
var button = sender as Button;
button.Click -= new EventHandler(newButton_Click);
this.panel1.Controls.Remove(button);
}
}