我正在用java创建游戏,我正在尝试为它创建一个多人游戏,当游戏首次启动时,级别被加载并且客户端被添加到客户端的玩家列表中,客户端将遍历列表并添加更多,如果服务器告诉它,但问题是我得到'ArrayIndexOutOfBoundsException'当他的游戏第一次启动时,我已经指示我的游戏忽略它,我似乎无法解决问题。
我假设它与创建新玩家和线程完成工作所需的时间有关,但希望有人可以提供帮助!
消息var是从服务器收到的字符串,格式如下:
名;地址; POSX; POSY; fakeRotation;旋转; rotationSpeed;速度; sheildEnabled; sheildHealth;健康
以下是服务器发送内容的示例:
Luke;/127.0.0.1:53701;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100
以下是vars:
String[] decrypted = message.split(",");
String[] commands = decrypted[x].split(";");
这是困扰我的代码:
boolean newPlayer = true;
if(Main.level.playerList != null)
{
try
{
for(int p = 0; p < Main.level.playerList.size(); p++)
{
if(Main.level.playerList.get(p).address.toString().equals(commands[1]))
{
newPlayer = false;
break;
}
}
if(newPlayer)
{
Player player = new Player(50, 50, 100, 150, commands[1], Main.level.shipImage1, Main.level.thrusterFlamesSprite1, Main.level.shieldSprite1);
Main.level.playerList.add(player);
}
for(int p = 0; p < Main.level.playerList.size(); p++)
{
Player player = Main.level.playerList.get(p);
if(player.address.equals(commands[1]))
{
// name:address:posX:posY:fakeRotation:rotation:rotationSpeed:speed:sheildEnabled:sheildHealth:health
player.name = commands[0];
player.address = commands[1];
player.pos[0] = Double.parseDouble(commands[2]);
player.pos[1] = Double.parseDouble(commands[3]);
player.fakeRotation = Float.parseFloat(commands[4]);
player.rotation = Float.parseFloat(commands[5]);
player.rotationSpeed = Double.parseDouble(commands[6]);
player.speed = Double.parseDouble(commands[7]);
player.sheildEnabled = Boolean.parseBoolean(commands[8]);
player.sheildStrength = Integer.parseInt(commands[9]);
//player.health = Integer.parseInt(commands[10]);
}
}
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Array index out of bounds, continuing.");
e.printStackTrace();
}
}
希望有人可以提供帮助,就像我说我认为它与添加“新”项目有关,但我找不到任何方法让它起作用!
我收到的堆栈跟踪是:
java.lang.ArrayIndexOutOfBoundsException: 1
at multiplayer.Translator.interperate(Translator.java:28)
at multiplayer.GameClient.run(GameClient.java:81)
提前致谢!
答案 0 :(得分:0)
根据堆栈跟踪,health
行上发生的错误是什么?如果是这样,解密的[x]可能没有足够的分号。
编辑 -
String[] commands = decrypted[x].split(";");
那么,x
是什么?
当你看到所有decrypted[x]
时,你看到了你的期望吗?这个值是您之前发布的“Luke”数据吗?
编辑 - 另外,我建议您使用pos[0]
常量替换pos[1]
和static final
中的0和1:
private static final int X_COORD = 0;
private static final int Y_COORD = 1;
/* ... snip ... */
player.pos[X_COORD] = Double.parseDouble(commands[2]);
player.pos[Y_COORD] = Double.parseDouble(commands[3]);
这一点是允许您的代码通过描述性常量而不是数字来引用X和Y坐标。虽然现在你知道0和1意味着什么,从现在开始几个月你就不会,当你回头看他的代码时,你会感到神秘或困惑。添加常量意味着您不必记住。它还可以帮助您发现错误。