Visual Basic C#窗口形成后台工作器对象移动循环不能按预期运行

时间:2013-04-20 13:01:20

标签: c# winforms visual-studio-2012 backgroundworker

我正在尝试编写一种经典的蛇类游戏,用户使用键盘的箭头键将蛇引导到屏幕周围。到目前为止,我已经成功地解决了成功控制运动和键盘控制的代码,但在尝试合并这些代码时遇到了问题。

为了移动蛇,我正在为每个箭头键使用单独的后台工作循环:

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

所有这些代码都不会对程序产生致命错误,但是,当命令蛇向另一个方向移动时(在这种情况下,假设它正在向下移动并按下右箭头键),蛇将开始向适当的方向移动,但也可以像往常一样向前移动(按下右箭头键后,蛇开始沿对角方向移动,而不是像我希望的那样向右移动)。这个问题根本不在于有4个独立的后台工作人员,因为如果我只使用1个后台工作人员来处理所有关键输入,就会出现同样的问题。

如果这里有人可以提供帮助,那就太棒了。

提前致谢!

1 个答案:

答案 0 :(得分:0)

用if ...替换while ...

if (Snake1.Top - 5 >= 8)

循环应该留给外面,你只需要检查空间,而不是继续减少内循环中的顶部。 ; - )