0

Я создаю игру в java, и я пытаюсь создать для нее многопользовательский режим, когда игра начинается, уровень загружается и клиент добавляется в список игроков, который клиентский, клиент будет перебирать список и добавлять больше, если сервер сообщает об этом, но проблема в том, что я получаю «ArrayIndexOutOfBoundsException», когда он начинает игру, я дал указание моей игре проигнорировать это, я не могу показаться чтобы решить проблему.Array Index Out Of Bounds Exception Java Game

Я предполагаю, что это связано с созданием нового игрока и временем, необходимым для того, чтобы потоки выполняли свою работу, но надеялись, что кто-то может помочь!

Сообщение вар является строка получила fromt он сервер, отформатированный как это:

имя, адрес, PosX; Пози; 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 

Вот вары:

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(); 
      } 
     } 

Надеюсь кто-то может помочь, как я сказал, я думаю, что его somethign делать с добавлением «новый» товар, но я не могу найти способ сделать это Работа!

Трассировка стека я получаю это:

java.lang.ArrayIndexOutOfBoundsException: 1 
at multiplayer.Translator.interperate(Translator.java:28) 
at multiplayer.GameClient.run(GameClient.java:81) 

Заранее спасибо!

+1

Как объявляется 'command []'? Для того, что у вас есть в настоящее время, оно должно быть не менее 10. Если вы раскомментируете строку состояния, это должно быть 11. Как вы инициализировали 'command []'? –

+0

извините, команда String [] commands = decrypted [x] .split (";"); и дешифрование дешифровано = сообщение.Трещина(","); –

+0

сообщение отформатировано как имя, адрес; posX; posY; fakeRotation; rotation; rotationSpeed; speed; sheildEnabled; sheildHealth; health –

ответ

0

В соответствии с трассировкой стека, происходит ли ошибка на линии health? Если это так, расшифровка [x] может не содержать в ней достаточного количества точек с запятой.

редактировать -

String[] commands = decrypted[x].split(";"); 

Итак, что такое x? Когда вы смотрите на все decrypted[x], вы видите, что ожидаете? Это ценность данных «Люка», которые вы опубликовали ранее?

редактировать - тоже, я рекомендую заменить 0 и 1 в pos[0] и pos[1] с static final константами:

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, через несколько месяцев вы этого не сделаете, и когда вы оглянетесь назад, он станет мистифицированным или запутанным. Добавление констант означает, что вам не нужно помнить. Это также поможет вам выявить ошибки.

+0

В соответствии с трассировкой стека, которую я получаю, ошибка возникает, когда я пытаюсь сравнить адрес игрока с адресом команды –

+0

Итак, сразу после создания массива 'command', напечатайте количество элементов в этом массиве. Еще лучше, пройдите через него с помощью отладчика и посмотрите, что происходит. –

+0

Хорошо, очевидно, сервер отправляет 1 команду в первый раз, а затем посылает по 11 команд каждый раз после этого, поэтому, возможно, у сервера есть проблема? –

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