2013-02-04 64 views
1

我试图让我的winForm解散为对方,如Manhole。所有窗体都在屏幕中间打开。任何帮助将不胜感激。将WinForm解散为另一种形式

这是我如何打开和目前接近形式:

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

你的问题是什么? –

+0

您可以通过制作自己的表单类来显示无边框窗体并绘制自定义边框来实现该效果。在“淡入淡出”时,您可以减少表单自定义边框的不透明度,并在动画完成后将子元素转移到目标表单并关闭淡化表单。 这是一种奇怪的做法和一个完整的黑客,它可能更容易和更一致的切换到WPF和定义用户控件,他们会很容易淡入和淡出 –

+0

看看:https:// code.google.com/p/dot-net-transitions/易于使用的滑动和淡入淡出过渡。 –

回答

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. 渲染窗口2为位图
  3. 分配临时位图
  4. 当t从0至1,由步进,说0.1,线性插值每(X,Y)Form1中的位图和窗口2的位图,并设置在该像素之间刮伤CH
  5. 显示划痕

现在,你可以写这样的代码,你应该确保它的工作原理。如果表现足够好,就让它成为。

我不认为你实际上不想使用这段代码(我写的图像处理代码为生)。在.NET中完成所有像素的开销可能会让你失望。你最好从位图获取原始字节字节,并对它们做lerp而不是get/get/set像素。此外,每个颜色分量的这三个浮点运算也会拖延你的操作,所以如果是我,我会在固定点执行工作,如果我使用字节进行操作的话。

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); 
    } 
} 
+0

有没有一种方法可以根据条件在窗格中创建控件?例如,按钮和单选按钮根据故事所在的位置而变化。 – ZeroPhase

+0

我已将代码示例添加到我的答案中 – Stefan