Исключение в потоке "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 5 - PullRequest
0 голосов
/ 03 марта 2019

новая проблема.После того, как я исправил массив, появляется эта ошибка:

Исключение в потоке "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 5 в de.gandalf1783.Level.getTilesTouched (Level.java:37)в de.gandalf1783.Creature.move (Creature.java:33) в de.gandalf1783.Player.update (Player.java:19) в de.gandalf1783.Game.update (Game.java:84) в de.gandalf1783.Game.run (Game.java:54) на java.lang.Thread.run (Неизвестный источник)

Вот класс уровня: package de.gandalf1783;

import java.awt.Graphics;

public class Level {
  private TileSet[] ts;
  private int sizeX, sizeY;
  private int[][][] tileMap;
  private Game game;

  public Level(Game game, String path, TileSet[] ts1) {
    this.game = game;
    this.ts = ts1;
    String file = Utils.loadFileAsString(path);
    String[] tokens = file.split("\\s");
    sizeY = Utils.parseInt(tokens[1]);
    tileMap = new int[1][sizeX][sizeY];
    int i = 2;
    for(int y = 0; y < sizeY; y++){
      for(int x = 0; x < sizeX; x++){
        tileMap[1][x][y] = Utils.parseInt(tokens[i++]);
      }
    }
  }

  public void renderMap(Graphics g){
    for(int tileY = 0; tileY < sizeY; tileY++){
      for(int tileX = 0; tileX < sizeX; tileX++){
        ts[0].renderTile(g, tileMap[0][tileX][tileY], tileX * TileSet.TILEWIDTH - game.getGameCamera().getxOffset(),
                  tileY * TileSet.TILEHEIGHT - game.getGameCamera().getyOffset());
      }
    }
  }
  public int[][] getTilesTouched(Creature player) {
    int[][] ret = new int[1][2];
    int numX = (player.entityX + Player.MARGIN_HORIZ) / player.width;
    int numY = (player.entityY + player.height - Player.MARGIN_VERT) / player.height;
    ret[0][0] = tileMap[0][numX][numY];
    if(ts[0].hs.contains(ret[0][0])) {
      ret[0][0] <<= 16;
    }
    numX = (player.entityX + player.width - Player.MARGIN_HORIZ) / player.width;
    ret[0][1] = tileMap[0][numX][numY];
    if(ts[0].hs.contains(ret[0][1])) {
      ret[0][1] <<= 16;
    }
    return ret;
  }

public int getSizeX() {
    // TODO Auto-generated method stub
    return sizeX;
}
public int getSizeY() {
    return sizeY;
}
}

В нем говорится, что программа прерывает работу, потому что массив там пуст или я ошибаюсь?

РЕДАКТИРОВАТЬ 1: Метод, вызывающий проблемы:

     public int[][] getTilesTouched(Creature player) {
    int[][] ret = new int[1][2];
    int numX = (player.entityX + Player.MARGIN_HORIZ) / player.width;
    int numY = (player.entityY + player.height - Player.MARGIN_VERT) / player.height;
    ret[0][0] = tileMap[0][numX][numY];
    if(ts[0].hs.contains(ret[0][0])) {
      ret[0][0] <<= 16;
    }
    numX = (player.entityX + player.width - Player.MARGIN_HORIZ) / player.width;
    ret[0][1] = tileMap[0][numX][numY];
    if(ts[0].hs.contains(ret[0][1])) {
      ret[0][1] <<= 16;
    }
    return ret;
  }

А вот строка, которая вызывает проблемы (строка 37):

ret[0][0] = tileMap[0][numX][numY]

1 Ответ

0 голосов
/ 03 марта 2019

Прежде всего, sizeX, кажется, никогда не присваивается правильное значение.
Его первое использование здесь, и это приведет к [1][0][whatever]

tileMap = new int[1][sizeX][sizeY];

Затем, здесь

ret[0][0] = tileMap[0][numX][numY];

он, конечно, выдает ArrayIndexOutOfBoundsException.

Возможно, вы захотите назначить sizeX и sizeY внутри Level конструктора

final String[] tokens = file.split("\\s");
sizeX = Utils.parseInt(tokens[0]);
sizeY = Utils.parseInt(tokens[1]);

Я полагаю, это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...