大丈夫ですので、私はボードゲームに取り組んでいます。 最初の 'whileループ'は、ゲームが終了したかどうかをチェックし、内側の 'whileループ'はユーザーの入力を待つことになっています(squareSelectorとrooSelectorは自分のマウスリストです。リスナーによって返される) しかし、 'whileループ'はプログラムをクラッシュさせ、リスナーの動作をブロックします。 これについて読んだところ、スイングはシングルスレッドであることがわかったので、whileループがアクティブな間はリスナーは動作しません。しかし、私はnullpointersを避けるために入力を待つ必要があります。 これを解決する方法に関するアイデアはありますか? (別のアプローチのように、またはどのように入力のための私のループ待ち時間を作るために)whileループが私のリスナーの仕事を妨げている
gameloop
while(currentPlayer.haveIWon() == false){
//wait for input
while(!inputIsDone){
System.out.println("waiting for move");
System.out.println(squareSelector.isDone() + " " + rooSelector.isDone()) ;
checkInput() ;
if(squareSelector.isDone() && rooSelector.isDone()){
inputIsDone = true ;
}
}
//update board
currentPlayer.performMove(k, s);
rooSelector.setDone(false);
squareSelector.setDone(false);
inputIsDone = false ;
//currentPlayer.setInput(false);
//repaint
Main.getState().getComponent().repaint();
}
//display winnner thing
checkInput方法
public void checkInput(){
if(rooSelector.getSelected() != null){
k = rooSelector.getSelected() ;
}
if(squareSelector.getSelected() != null){
s = squareSelector.getSelected() ;
}
}
あなたが起こっているのかを理解するために多くのコードが必要な場合私に知らせて、私はもっと追加します。
[イベントディスパッチスレッド](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html)をブロックしてはなりません。 - 問題は、ループによってEDTが入力イベントを処理できなくなることです。ゲームループ(必要な場合)は、独自のスレッドで実行する必要があります([SwingWorker](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)など)。 – Thomas
入力を賢明にするには、飢餓によって他人を殺すのを防ぐ方法が含まれています:Thread.yield()またはThread.sleep(1) – Doleron
一般的にUI(つまりアニメーションなし) (すなわち、「リアルタイム」ではない)ゲームループはめったに必要ありません。 NPEを防止する必要があると主張していますが、ループの実際の必要性よりもむしろ設計上の欠陥またはコーディングエラーを示しています。 – Thomas