好的,所以我正在制作一个在线格斗游戏,你输入服务器IP的对话框会一次又一次地弹出,即使代码只要求一次。它不是在任何一种循环中,所以我不知道发生了什么。
public void connectAndInit(){
try{
String ip = JOptionPane.showInputDialog("Input server IP.");
players = new Player[MAX_PLAYERS];
players[0] = new Player(25,25,135);
players[1] = new Player(750,550,315);
ct = new ClientThread(ip, players);
ct.start();
ct.setPriority(Thread.MAX_PRIORITY);
playerNum = ct.playerNum;
init = false;
}
catch(Exception e){
e.printStackTrace();
}
}
@Override
public void update()
{
if(init)
connectAndInit();
}
以下是有问题的游戏:http://prime.programming-designs.com/java/metaship-client.jnlp
以下是您在运行游戏之前需要启动的服务器:http://prime.programming-designs.com/java/metaship-server.jnlp
答案 0 :(得分:3)
我需要确定类层次结构是确定的,因为我不是100%关于调用update()
的时间和原因,但这是我怀疑正在发生的事情。
update()
被调用两次,最初一次(当您第一次显示JOptionPane
时)并且由于某种原因再次被调用。可能是JOptionPane
显示,销毁或者在其他组件中导致重新绘制时。
问题是,当JOptionPane显示在该线程上的执行已经停止时,所以当它关闭时,执行线程会发生疯狂的争夺,connectAndInit()
经常(或总是)调用init=false
到达了。如果对update()
的调用来自不同的主题,则可能是始终主张。
要解决此问题,请将代码更改为:
if(init){
init=false;
connectAndInit();
}
取消init=false;
中的connectAndInit()
。
答案 1 :(得分:0)
让我们说update()
在一百个不同的主题中一次被调用一百次。 init
在每个帖子中都是正确的,因此connectAndInit()
将被调用一百次,因此您的对话框将显示一百次。
我不确定这是否一定会发生在这里,但很有可能。
答案 2 :(得分:0)
使用调试器的好例子。
无论如何,我的猜测是检查你设置的init变量是否未在其他地方设置,例如通过一个单独的线程。