0

現在、ユーザーがキーボードの矢印キーを使用して画面上でヘビを操作する、古典的なヘビのようなゲームを作成しようとしています。これまでのところ、動きとキーボード コントロールを指示するコードをうまく整理できましたが、これらのコードをマージしようとすると問題が発生しました。

ヘビを動かすために、矢印キーごとに個別のバックグラウンド ワーカー ループを使用しています。

    public void worker_DoWork(object sender, DoWorkEventArgs e)
        {

            for (int i = 0; i < 1000; i++)
            {
                if (abortloop == true)
                {
                    worker2 = null;
                    worker3 = null;
                    worker4 = null;
                    break;
                }
                while (Snake1.Top - 5 >= 8)
                {
                    {
                        this.Invoke((MethodInvoker)delegate()
                        {
                            Snake1.Top = Snake1.Top - 5;
                                 Refresh(); 
                        });
                        System.Threading.Thread.Sleep(500);



                    }
                }
            }
        }

バックグラウンド ワーカーはキーボード入力から呼び出されます。

 else if (e.KeyCode == Keys.W)
        {
            abortloop2 = true;
            abortloop3 = true;
            abortloop4 = true;
            if (worker == null && abortloop == true)
            {
                abortloop = false;
                worker = new BackgroundWorker();
                worker.DoWork += new DoWorkEventHandler(worker_DoWork);
                worker.RunWorkerAsync();
            }
        }

このコードはすべて、いわばプログラムに致命的なエラーを生成しませんが、ヘビに別の方向に移動するように命令すると (この場合、現在下に移動しているとしましょう。私は右矢印キーを押します)、ヘビは動き始めます。適切な方向に移動するだけでなく、前と同じ方向に移動することもできます (右矢印キーを押すと、ヘビは、私が望むように右だけではなく、斜めに移動し始めます)。この問題は、すべてのキー入力に対して 1 つのバックグラウンド ワーカーを使用するだけで同じ問題が発生するため、4 つの個別のバックグラウンド ワーカーが存在することに起因するものではありません。

ここで誰かが助けてくれたら、それは素晴らしいことです。

前もって感謝します!

4

1 に答える 1

0

while を if に置き換えます...

if (Snake1.Top - 5 >= 8)

ループは外側に残す必要があり、スペースを確認するだけで、内側のループで Top を減らし続けないでください。;-)

于 2013-04-21T12:21:39.853 に答える