0

我收到一个奇怪的错误,我不确定为什么有人能发现错误在哪里?

错误:

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: -61
    at ca.serict.game.gfx.Screen.render(Screen.java:55)
    at ca.serict.game.entities.Player.render(Player.java:57)
    at ca.serict.game.level.Level.renderEntities(Level.java:67)
    at ca.serict.game.Game.render(Game.java:168)
    at ca.serict.game.Game.run(Game.java:127)
    at java.lang.Thread.run(Unknown Source)

如果您需要从这些行中的任何一行查看代码,则会列出错误,请告诉我。

Screen.java 第 55 行:

int col = (colour >> (sheet.pixels[xSheet + ySheet * sheet.width + tileOffset] * 8)) & 255;

Player.java 第 57 行:

screen.render(xOffset,  + modifier, yOffset, (xTile + 1) + yTile * 32, colour); 

Level.java 第 65 - 69 行:

public void renderEntities(Screen screen) {
    for (Entity e : entities) {
        e.render(screen);
    }
}

Game.java 第 168 行:

level.renderEntities(screen);

Game.java 第 157 - 128 行:

    if (shouldRender) {
        frames++;
        render();
    }

屏幕 55 的公共无效:

public void render(int xPos, int yPos, int tile, int colour, int mirrorDir) {
    xPos -= xOffset;
    yPos -= yOffset;

    boolean mirrorX = (mirrorDir & BIT_MIRROR_X) > 0;
    boolean mirrorY = (mirrorDir & BIT_MIRROR_Y) > 0;

    int xTile = tile % 32;
    int yTile = tile / 32;
    int tileOffset = (xTile << 3) + (yTile << 3) * sheet.width;
    for (int y = 0; y < 8; y++) {
        if (y + yPos < -0 || y + yPos >= height)
            continue;
        int ySheet = y;
        if (mirrorY)
            ySheet = 7 - y;
        for (int x = 0; x < 8; x++) {
            if (x + xPos < -0 || x + xPos >= width)
                continue;
            int xSheet = x;
            if (mirrorX)
                xSheet = 7 - x;
            int col = (colour >> (sheet.pixels[xSheet + ySheet * sheet.width + tileOffset] * 8)) & 255;
            if (col < 255)
                pixels[(x + xPos) + (y + yPos) * width] = col;
        }
    }
}
4

2 回答 2

1

理想情况下,我们会从 Screen:55 获得代码。但在我看来,您正在访问数组之外​​的元素。尝试在 Screen:55 中打印您正在访问的数组的大小,您应该会看到问题。

于 2013-10-14T20:58:10.953 回答
1

所以你正在使用这个表达式计算你的数组索引:

xSheet + ySheet * sheet.width + tileOffset

您需要确保该值在您的数组范围内sheet.pixels。为此,您可以编写一个小方法来限制索引:

public int clamp(int index, int start, int end) {
    return index > end ? end : index < 0 ? 0 : index;
}

并像这样使用它:

 int i = clamp((xSheet+ySheet*sheet.width+tileOffset),  0, sheet.pixels.length-1)
 sheet.pixels[i];

这样您就可以确保索引在 [0, sheet.pixels.length-1] 范围内,但是您仍然需要知道这对您的用例是否有意义。

于 2013-10-14T21:11:40.107 回答