0

私はjavaでゲームを作成していて、そのためのマルチプレーヤーを作成しようとしています。ゲームが最初に開始され、レベルが読み込まれ、クライアントがクライアント側のプレーヤーリストに追加されると、クライアントはリストを繰り返し処理し、サーバーが指示した場合はさらに追加しますが、問題は、ゲームが最初に開始されたときに「ArrayIndexOutOfBoundsException」が発生することです。ゲームにそれを無視するように指示しました。問題を解決できないようです。

私はそれが新しいプレーヤーの作成とスレッドが彼らの仕事をするのにかかる時間と関係があると思いますが、誰かが助けてくれることを望んでいました!

メッセージvarは、次のようにフォーマットされたサーバーから受信した文字列です。

名前;アドレス;posX;posY; fakeRotation;ローテーション;ローテーションスピード;スピード;sheildEnabled;sheildHealth; health

サーバーが送信するものの例を次に示します。

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

うまくいけば、誰かが助けてくれるといいのですが、私が言ったように、「新しい」アイテムを追加することと関係があると思いますが、それを機能させる方法が見つかりません!

私が受け取るスタックトレースは次のとおりです。

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

前もって感謝します!

4

1 に答える 1

0

スタックトレースによると、health回線でエラーが発生していますか?その場合、decrypted[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の意味を知っていますが、数か月後にはわかりません。彼のコードを振り返ると、謎に包まれたり混乱したりします。定数を追加すると、覚えておく必要がなくなります。また、エラーを見つけるのにも役立ちます。

于 2012-06-03T12:56:18.500 に答える