public void render(int xp, int yp, int tile, int colors, int bits) {
xp -= xOffset;
yp -= yOffset;
boolean mirrorX = (bits & BIT_MIRROR_X) > 0;
boolean mirrorY = (bits & BIT_MIRROR_Y) > 0;
int xTile = tile % 32;
int yTile = tile / 32;
int toffs = xTile * 8 + yTile * 8 * sheet.width;
for (int y = 0; y < 8; y++) {
int ys = y;
if (mirrorY) ys = 7 - y;
if (y + yp < 0 || y + yp >= h) continue;
for (int x = 0; x < 8; x++) {
if (x + xp < 0 || x + xp >= w) continue;
int xs = x;
if (mirrorX) xs = 7 - x;
int col = (colors >> (sheet.pixels[xs + ys * sheet.width + toffs] * 8)) & 255;
if (col < 255) pixels[(x + xp) + (y + yp) * w] = col;
}
}
}
YouTube のチュートリアルに従ってそのメソッドを作成しましたが、スプライト シートから 8x8 離れたタイルのみをレンダリングします。32x32 のタイルをレンダリングしたいのですが、次のようにすべての 8 から 32 に変更すると、次のようになります。
public void render(int xp, int yp, int tile, int colors, int bits) {
xp -= xOffset;
yp -= yOffset;
boolean mirrorX = (bits & BIT_MIRROR_X) > 0;
boolean mirrorY = (bits & BIT_MIRROR_Y) > 0;
int xTile = tile % 32;
int yTile = tile / 32;
int toffs = xTile * 32 + yTile * 32 * sheet.width;
for (int y = 0; y < 32; y++) {
int ys = y;
if (mirrorY) ys = 7 - y;
if (y + yp < 0 || y + yp >= h) continue;
for (int x = 0; x < 32; x++) {
if (x + xp < 0 || x + xp >= w) continue;
int xs = x;
if (mirrorX) xs = 7 - x;
int col = (colors >> (sheet.pixels[xs + ys * sheet.width + toffs] * 32)) & 255;
if (col < 255) pixels[(x + xp) + (y + yp) * w] = col;
}
}
}
次のようなエラーが表示されます。
Exception in thread "Thread-3" java.lang.ArrayIndexOutOfBoundsException: -1184
at orbis.src.Screen.render(Screen.java:79)
at orbis.src.TileWater.render(TileWater.java:37)
at orbis.src.World.renderBackground(World.java:143)
at plixel.orbis.Orbis.render(Orbis.java:383)
at plixel.orbis.Orbis.run(Orbis.java:297)
at java.lang.Thread.run(Unknown Source)