Я работаю над реализацией 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 мс, кроме того, используя потоки. Есть ли альтернатива? Спасибо заранее!
Ok спасибо за информацию. Но все же, если я запускаю новый поток, игра зависает. Вы знаете, почему? – Monocle
@Monocle по той же самой причине - вы блокируете поток событий Swing, вероятно, в коде, который вы нам не показываете. Решение: не делайте этого, не блокируйте EDT. Google и читать «Параллелизм и свинг». Изучайте все в нем. –