1

インターネットで答えを探したような気がしますが、まだこの問題を解決していません。私は C# でハングマン ゲームを作成しています (これはまだ新しいものです)。フォームにグループ ボックスがあり、そこでさまざまな「ボディ パーツ」を描画しています。問題は、描画イベントが呼び出されるたびに再描画されることです。頭ができて、次に腕や脚などになります。

私は OnPaintBackground をオーバーライドするなどのことを試みましたが、これは再描画の問題を解決しますが、フォーム全体を台無しにし、これを行うと見栄えが悪くなります。グループボックスの代わりにパネルにも描画しようとしましたが、何らかの理由で描画することさえできませんでした。

誰でも提案できますか?ちなみに、これは宿題ではなく、個人的なプロジェクトと学習体験です。

いくつかのコード:これは、描画機能をトリガーするために使用しているものです(他の条件でトリガーされます)

this.groupBoxHang.Paint += new System.Windows.Forms.PaintEventHandler(this.groupBoxHangMan_Paint);

それからここに来て、別のクラスにある実際の関数を呼び出します

    private void groupBoxHangMan_Paint(object sender, PaintEventArgs e)
    {          
       draw.DrawHangMan(e.Graphics, GetRemainingGuess());      
    }

これが他のクラスの一部です:

    public void DrawHangMan(Graphics dM, int guessesRemaining)
    {        
        Pen blackPen = new Pen(Brushes.Black);

        Pen deathPen = new Pen(Brushes.Red);
        deathPen.Width = 2.0F;

        if (guessesRemaining == 7)
        {
            dM.DrawEllipse(blackPen, 94, 75, 60, 60);//head
        }
        else if (guessesRemaining == 6)
        {
            dM.DrawLine(blackPen, 124, 210, 124, 135);//body
        }
        else if (guessesRemaining == 5)
        {
            dM.DrawLine(blackPen, 123, 170, 65, 145);//left arm
        }
        else if (guessesRemaining == 4)
        {
            dM.DrawLine(blackPen, 123, 170, 181, 145); //right arm
        }
        else if (guessesRemaining == 3)
        {
            dM.DrawLine(blackPen, 123, 210, 65, 255);//left leg
        }
        else if (guessesRemaining == 2)
        {
            dM.DrawLine(blackPen, 123, 210, 181, 255);//right leg
        }
        else if (guessesRemaining == 1)
        {
            dM.DrawEllipse(blackPen, 105, 93, 10, 10); //left open eye
            dM.DrawEllipse(blackPen, 133, 93, 10, 10); //right open eye
        }
        else if (guessesRemaining == 0)
        {
            dM.DrawLine(deathPen, 102, 104, 118, 92);//left eye dead
            dM.DrawLine(deathPen, 118, 104, 102, 92);

            dM.DrawLine(deathPen, 130, 104, 146, 92);//right dead eye
            dM.DrawLine(deathPen, 146, 104, 130, 92);
        }         

    }
4

1 に答える 1

0

If ステートメントに関する 2 つのこと。それらはカウントに等しい場合にのみアクティブになるように設定されているため、カウントがしきい値よりも小さい場合は再描画されません。2 つ目は、else ステートメントを使用してレベルの 1 つだけを実行することです。あなたのイベントでそれを行うことPaintは正しいです。次のようなことを試してください:

public void DrawHangMan(Graphics dM, int guessesRemaining)
{
    Pen blackPen = new Pen(Brushes.Black);
    Pen deathPen = new Pen(Brushes.Red);
    deathPen.Width = 2.0F;

    if (guessesRemaining < 8)
    {
        dM.DrawEllipse(blackPen, 94, 75, 60, 60);//head
    }
    if (guessesRemaining < 7)
    {
        dM.DrawLine(blackPen, 124, 210, 124, 135);//body
    }
    if (guessesRemaining < 6)
    {
        dM.DrawLine(blackPen, 123, 170, 65, 145);//left arm
    }
    if (guessesRemaining < 5)
    {
        dM.DrawLine(blackPen, 123, 170, 181, 145); //right arm
    }
    if (guessesRemaining < 4)
    {
        dM.DrawLine(blackPen, 123, 210, 65, 255);//left leg
    }
    if (guessesRemaining < 3)
    {
        dM.DrawLine(blackPen, 123, 210, 181, 255);//right leg
    }
    if (guessesRemaining < 2)
    {
        dM.DrawEllipse(blackPen, 105, 93, 10, 10); //left open eye
        dM.DrawEllipse(blackPen, 133, 93, 10, 10); //right open eye
    }
    if (guessesRemaining < 1)
    {
        dM.DrawLine(deathPen, 102, 104, 118, 92);//left eye dead
        dM.DrawLine(deathPen, 118, 104, 102, 92);
        dM.DrawLine(deathPen, 130, 104, 146, 92);//right dead eye
        dM.DrawLine(deathPen, 146, 104, 130, 92);
    }

}
于 2012-11-16T02:17:28.597 に答える