数组索引? (也许?)

时间:2018-08-07 18:41:42

标签: java

基本上,我正在按照教程尝试制作基于图块的塔防游戏,到目前为止,我的代码如下:

private int[] findNextDir(tile s) {
    int[] dir = new int[2];
    tile u = grid.getTile(s.getXPlace(), s.getYPlace() - 1);
    tile r = grid.getTile(s.getXPlace() + 1, s.getYPlace());
    tile d = grid.getTile(s.getXPlace(), s.getYPlace() + 1);
    tile l = grid.getTile(s.getXPlace() - 1, s.getYPlace());

在此点之后,第54行(d行)返回(没有代码段):

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
at data.tileGrid.getTile(tileGrid.java:41)

public tile getTile(int xPlace, int yPlace) {
    return map[xPlace][yPlace];

at data.enemy.findNextDir(enemy.java:54)

private int[] findNextDir(tile s) {
    int[] dir = new int[2];
    tile u = grid.getTile(s.getXPlace(), s.getYPlace() - 1);
    tile r = grid.getTile(s.getXPlace() + 1, s.getYPlace());
    tile d = grid.getTile(s.getXPlace(), s.getYPlace() + 1);

at data.enemy.<init>(enemy.java:37)

this.directions = new int[2];
    //xDir
    this.directions[0] = 0;
    //yDir
    this.directions[1] = 0;
    directions = findNextDir(startTile);

at data.boot.<init>(boot.java:31)

enemy e = new enemy(texLoad("enemy"), grid.getTile(10, 10),
        grid, 64, 64, 2);

at data.boot.main(boot.java:49)

public static void main(String[] args) {
    new boot();

烦人的事情是,当我取出“ +1”时,除了缺少“ +1”之外,它的工作原理都是完美的。

2 个答案:

答案 0 :(得分:1)

我花一点时间看看您正在使用什么。这是一个设置大小的数组,可以通过将其作为调试的简单输出来找到。

 System.out.println(arrayname.length());

为什么这很重要?查看您的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11

这说明您已经超出了设置的数组大小-初始化数组时,它的大小已设置;您可以在每个位置填充新元素或将其删除(留空),但总体尺寸保持不变。具体来说,在此错误中,您尝试将第11个元素放入大小为10的数组中。

这可能是由很多原因引起的,但是正如您已经部分发现的那样,我来看看

tile d = grid.getTile(s.getXPlace(), s.getYPlace() + 1);

当您在地图边缘时,会在这里发生什么? s.getYPlace()之后是否再没有其他元素了?由于您已经达到了地图的限制,并且数组的大小是固定的,因此您尝试为不存在的数组分配值-因此出现错误。

可能的解决方案?有几个,但是如果您想要一个非常有针对性的对象,为什么不将检查添加到网格中呢?加上+1实际上是将实体放置在您想要的位置,还是实际上有一个空格?

答案 1 :(得分:0)

好吧,我已经明白了,我试图将其抽象化,我想我的日食并不是那样。原始代码:

tile u = grid.getTile(s.getXPlace(), s.getYPlace() - 1);
tile r = grid.getTile(s.getXPlace() + 1, s.getYPlace());
tile d = grid.getTile(s.getXPlace(), s.getYPlace() + 1);
tile l = grid.getTile(s.getXPlace() - 1, s.getYPlace());

w /摘要

public int getXCoord() {
    return (int) x / 64;
}

public int getYCoord() {
    return (int) y / 64;

通常可以,但是不会。

    tile u = grid.getTile((int) s.getX() / 64, (int) (s.getY() - 1) / 64);
    tile r = grid.getTile((int) (s.getX() + 1) / 64, (int) s.getY() / 64);
    tile d = grid.getTile((int) s.getX() / 64, (int) (s.getY() + 1) / 64);
    tile l = grid.getTile((int) (s.getX() - 1) / 64, (int) s.getY() / 64);

如果没有使其抽象化并且在这里进行所有的划分都可以完美地工作,我没有丝毫的线索为什么会起作用,但是我不会纠结于此。

感谢所有发表评论或回答的人! <3