2

車のゲームをシミュレートするアプリケーションを作成しています。左右のキーの 2 つのキーを使用します。私は楕円を使用しており、それを両方向に動かしています。アプリケーションを起動して楕円を右のキーに移動すると、左のキーを押すと正常に動作し、フリーズし、常に下に移動する必要がある別の楕円を使用しています。以下は、楕円を移動するために使用する 2 つの関数です。およびフォームの key_down イベント:

 public void MoveLeft()
    {

        if (startPoint.Y > 100)
        {
            startPoint.Y = 1;
        }
        while (startPoint.Y > 1)
        {


            graphics.Clear(BackColor);
            if (startPoint.Y > this.ClientSize.Height)
                startPoint.Y = 0;
            startPoint.Y += 5;
            graphics.DrawEllipse(Pens.Black, new Rectangle(carPoint, new Size(100, 100)));
            graphics.FillEllipse(new SolidBrush(Color.Green), new Rectangle(carPoint, new Size(100, 100)));
            Move();
            System.Threading.Thread.Sleep(50);


        }
    }

    public void MoveRight()
    {
       while (startPoint.Y > 1)
        {
            if (startPoint.Y > this.ClientSize.Height)
                startPoint.Y = 0;
            startPoint.Y += 5;
            carPoint = new Point(100, 250);
            graphics.DrawEllipse(Pens.Black, new Rectangle(carPoint, new Size(100, 100)));
            graphics.FillEllipse(new SolidBrush(Color.Green), new Rectangle(carPoint, new Size(100, 100)));
            Move();
            System.Threading.Thread.Sleep(50);
            graphics.Clear(BackColor);
        }
    }

    public void Move()
    {
        graphics.DrawEllipse(Pens.Black, new Rectangle(startPoint, new Size(100, 100)));
        graphics.FillEllipse(new TextureBrush(image), new Rectangle(startPoint, new Size(100, 100)));
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyData)
        {
            case Keys.Right:
                {
                    moveCar = new Thread(new ThreadStart(MoveRight));
                    moveCar.Start();

                }
                break;
            case Keys.Left:
                {
                    if (moveCar != null)
                    {
                        moveCar.Abort();
                        moveCar = null;
                    }
                    moveCar = new Thread(new ThreadStart(MoveLeft));
                    moveCar.Start();
                }
                break;

        }
    }
4

1 に答える 1

1

コードにはいくつかの問題があります。

まず、おそらく On_Paint イベントでのみペイントする必要があります。そのイベントが発生すると、本来あるべき場所に車をペイントするだけです。PaintEventArgsOn_Paint イベントに渡され、Graphics オブジェクトを含む があります。

移動関数では、車を動かすためのスレッドを作成するのは良いことですが、キーが押されるたびにスレッドを再作成したくはありません。bool IsMovingLeft代わりに、またはのように Form で方向の状態を維持できますint Velocity。次に、その変数の状態に基づいて位置を更新する 1 つのスレッドを作成します。

車の位置を更新したら、フォーム/コントロール自体を強制的に再描画することもお勧めします。を使用this.Refresh()してそれを実現できます。

于 2012-06-20T14:01:35.430 に答える