2011-11-30 2 views
0

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

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

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

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


UPDATE:

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

+0

Извините, я немного смущен. В drop() я просто установил, чтобы он возвращал позицию y. И в игре(), где я добавил egg.setCurrentLocation(). Он все еще не работает. –

+0

Можете ли вы изменить свой вопрос с помощью кода, который у вас есть сейчас? –

+0

Отредактировано! Большое спасибо. –

Смежные вопросы