将WinForm解散为另一个表单

时间:2013-02-04 16:16:17

标签: c# winforms graphics

我试图让我的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;
    }
}

要停止关闭应用程序,我从一开始就运行所有表单,但未显示。我无法获得更有效的内存工作方式,因此我现在正在使用它作为一种解决方法。

2 个答案:

答案 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);
}

您的流程将是:

  1. Render form1 to a bitmap
  2. 将form2渲染为位图
  3. 分配临时位图
  4. 对于从0到1的t,踩踏,比如说.1,在form1位图和form2位图之间每隔一次(x,y)Lerp,并在划痕中设置该像素
  5. 显示划痕
  6. 现在,您可以编写此代码,并确保它可以正常工作。如果表现足够好,就这样吧。

    我认为你实际上并不想使用这段代码(我为了生活而编写图像处理代码)。在.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);
    }
}