1

Manholeのように、winForms を互いに溶解させようとしています。すべてのフォームが画面中央に開きます。どんな助けでも大歓迎です。

これは、現在フォームを開いたり閉じたりする方法です。

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;
    }
}

アプリケーションが閉じないようにするために、最初からすべてのフォームを実行していますが、表示されていません。よりメモリ効率の良い方法を見つけることができなかったので、今のところ回避策としてこれを使用しています。

4

2 に答える 2

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. form1 をビットマップにレンダリングする
  2. form2 をビットマップにレンダリングする
  3. スクラッチ ビットマップを割り当てる
  4. t が 0 から 1 の場合、たとえば .1 ずつステップして、form1 ビットマップと form2 ビットマップの間のすべての (x, y) を Lerp し、そのピクセルをスクラッチに設定します。
  5. スクラッチを表示する

これで、このコードを書くことができ、それが機能することを確認する必要があります。性能が良ければそのまま。

このコードを実際に使用したくないとは思いません (私は生計を立てるために画像処理コードを書いています)。.NET ですべてのピクセル マンジングを行うことによるオーバーヘッドは、おそらくあなたの足を引っ張るでしょう。get/get/set pixel を実行する代わりに、ビットマップから raw バイト バイトを取得し、それらに対して lerp を実行する方がよいでしょう。さらに、色コンポーネントごとにこれら 3 つの浮動小数点演算を実行することもあなたを引きずります。

于 2013-02-04T16:33:37.567 に答える
0

まず、WinForms はゲームを作成するのに最適な選択肢ではありません。

しかし、このタスクに複数のフォームを使用したい、または使用しなければならない場合は、おそらく使用しないでください。

1 つのフォームで複数のパネルを作成し、タイマーで不透明度を操作できます。

大きなゲームを作成する場合は、画面を動的に作成する必要があります。

サンプル

コントロールを動的に作成する方法の例を次に示します。さまざまなシナリオに対応する独自のコントロールの作成を開始できます (質問に対するさまざまな回答に対して 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);
    }
}
于 2013-02-04T16:27:33.230 に答える