2015-07-16 5 views
0

Я работаю над реализацией Snake и в основном выполняю. Моя единственная проблема в том, что, когда мой JMenuItem для запуска новой игры щелкнут, игра замерзает. Here's соответствующий код:Почему мой метод run() корректно не звонит из моего Actionlistener

   this.newGame.addActionListener(new ActionListener() 
       { 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       neuesSpiel(); 
      } 

       }); 





      public void neuesSpiel() 
      {  //The old snake game is finished and the playing field is reseted 
        if(snake!=null) 
        { 
         snake.beendeSpiel(); 

         for(int i=0; i<20;i++) 
         { 
          for(int j=0;j<10;j++) 
          {  
          spielfeld[i][j] = false; 
          } 
         } 

        }//the new snake game is created below 
        snake = new Snake(null,null, 10,5, this);  
        Snake snake2 = new Snake(snake,null,11,5,this); 
        snake.hintermann = snake2; 
        snake2.hintermann = new Snake(snake2,null,12,5,this); 

        snake.run(); 
       } 

В классе Snake:

public void run() 
{ 
Game.zf.requestFocus(); 

while(spiellauf){ 
try 
{ 
    Thread.sleep(120); 
} 
catch (InterruptedException e) { } 
if(spiellauf) 
bewege(); //the Snake Block is moved 
} 

I'm довольно уверен, что метод run() является проблемой, потому что, если Я не вызвать метод, игра не замерзает. Кроме того, метод neuesSpiel() тоже должен быть в порядке, потому что, когда я его вызываю в конструкторе, он работает по назначению. Я не знаю, как еще я могу заставить свою функцию ждать 120 мс, кроме того, используя потоки. Есть ли альтернатива? Спасибо заранее!

ответ

2

Я не знаю, как еще я могу заставить свою функцию ждать 120 мс, кроме того, используя потоки.

Вы не используете темы. Вы выполняете свой метод run в текущем потоке.

Если вы хотите, чтобы запустить его в новом потоке, вам нужно что-то вроде:

new Thread(snake).start(); 
+0

Ok спасибо за информацию. Но все же, если я запускаю новый поток, игра зависает. Вы знаете, почему? – Monocle

+0

@Monocle по той же самой причине - вы блокируете поток событий Swing, вероятно, в коде, который вы нам не показываете. Решение: не делайте этого, не блокируйте EDT. Google и читать «Параллелизм и свинг». Изучайте все в нем. –

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