Переместить местоположение PictureBox с резьбой - PullRequest
0 голосов
/ 30 ноября 2011

Я создаю ловящую игру, в которой выпадают яйца. В моем подклассе Panel у меня есть этот код

public void startGame()
    {
        Thread t = new Thread(new ThreadStart(game));
        t.Start();
    }

private void game()
    {
        bool run = true;

        int level = 1;

        while (run)
        {
            Egg egg = dropper.selectEgg();
            int speed = dropper.getSpeed(level);

            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate { 
                    this.Controls.Add(egg);
                    egg.setInitialLocation(dropper.selectPosition());

                    int x = egg.Location.X;
                    int y = egg.Location.Y;

                    while (y <= 1000)
                    {
                        egg.setCurrentLocation(x, dropper.drop(egg, speed));
                        y = egg.Location.Y;
                    }
                }));
            }
            else
            {
                this.Controls.Add(egg);
                egg.setInitialLocation(dropper.selectPosition());

                int x = egg.Location.X;
                int y = egg.Location.Y;

                while (y <= 1000)
                {
                    egg.setCurrentLocation(x, dropper.drop(egg, speed));
                    y = egg.Location.Y;
                }
            }
            Thread.Sleep(3000);
        }
    }

Яйцо является подклассом PictureBox, и я хочу изменить его расположение в цикле, чтобы оно выглядело так, как будто яйца падают. Я использую подкласс EggDropper с этим методом:

public int drop(Egg egg, int speed)
    {

        int y = egg.Location.Y;
        y += speed;

        return y;
    }

но почему-то я не вижу ни одного из выпадающих объектов Яйца. Я предполагаю, что это проблема с потоком, обращающимся к подклассу PictureBox? Но я не могу найти какое-либо решение онлайн.

Заранее большое спасибо.

1 Ответ

1 голос
/ 30 ноября 2011

Вы звоните drop в основном потоке пользовательского интерфейса. Это быстро запускает цикл, который увеличивает y, пока не станет> 1000. Пользовательский интерфейс не может обновиться, пока работает этот цикл, поэтому все, что вы увидите, - это яйцо в нижней части экрана, когда drop завершится и пользовательский интерфейс может работать его цикл сообщений снова.

Решение состоит в том, чтобы изменить drop, чтобы просто уменьшить y один раз, а затем вернуть управление в цикл game. Вам также придется перенести проверку y <= 1000 в этот цикл.


UPDATE:

Ваш "шаг" - это итерация цикла while( run ) - здесь у вас есть Sleep для управления анимацией. Вы должны сделать только одно обновление до egg.Location.Y на каждом «шаге» - не запускайте весь цикл while( y <= 1000 ) на каждом «шаге».

...