2016-04-14 72 views
0

我正在做一個遊戲,但我仍然在製作屏幕的過程中。 我製作了黑色,深灰色,淺灰色和白色的spritesheet,我想讓它們變成鮮豔的顏色,但是當我試圖初始化第一種顏色時,我得到了一個ArryIndexOutOfBoundsExeption。ArrayIndexOutOfBoundsExeption當我嘗試使用顏色Java

這是我,我想幫助類代碼:

public static final int MAP_WIDTH = 64; 
public static final int MAP_WIDTH_MASK = MAP_WIDTH - 1; 

public int[] tiles = new int[MAP_WIDTH * MAP_WIDTH_MASK]; 
public int[] colours = new int[MAP_WIDTH * MAP_WIDTH_MASK * 4]; 

public int xOffset = 0; 
public int yOffset = 0; 

public int width; 
public int height; 

public SpriteSheet sheet; 

public Screen(int width, int height, SpriteSheet sheet){ 

    this.width = width; 
    this.height = height; 
    this.sheet = sheet; 

    for(int i = 0; i < MAP_WIDTH * MAP_WIDTH; i++){ 

     colours[i*4+0] = 0xff00ff; 
     colours[i*4+1] = 0x00ffff; 
     colours[i*4+2] = 0xffff00; 
     colours[i*4+3] = 0xffffff; 

    } 

} 

public void Render(int[] pixels, int offset, int row){ 

    for(int yTile = yOffset >> 3; yTile <=(yOffset + height) >> 3; yTile++){ 

     int yMin = yTile * 8 - yOffset; 
     int yMax = yMin + 8; 
     if(yMin < 0) yMin = 0; 
     if(yMax > height) yMax = height; 

     for(int xTile = xOffset >> 3; xTile <=(xOffset + width) >> 3; xTile++){ 

      int xMin = xTile * 8 - yOffset; 
      int xMax = xMin + 8; 
      if(xMin < 0) xMin = 0; 
      if(xMax > width) xMax = width; 

      int tileIndex = (xTile & (MAP_WIDTH_MASK)) + (yTile & (MAP_WIDTH_MASK)) * MAP_WIDTH ; 

      for(int y = yMin; y < yMax; y++){ 

       int sheetPixel = ((y + yOffset) & 7) * sheet.width + ((xMin + xOffset) & 7); 
       int tilePixel = offset + xMin + y * row; 

       for(int x = xMin; x < xMax; x++){ 

        int colour = tileIndex * 4 + sheet.pixels[sheetPixel++]; 

        pixels[tilePixel++] = colours[colour]; 

       } 

      } 

     } 

    } 

} 

如果有人知道如何解決這一問題,以便exeption走了,隨時回覆;)

+1

每個ArrayIndexOutOfBoundsException都是重複的。在這些問題上幾乎應該是一種自閉症。對於一個最小可驗證的例子來說有什麼困難? – KevinO

+1

做一個簡單的驗證,一個接收到'線程中的異常'主要「java.lang.ArrayIndexOutOfBoundsException:16128在(某些行號)''。數組的大小是16128,因此顯然不能放置[16128]處的東西。 – KevinO

+0

數組通常是0綁定的,因此您需要從索引中扣除1以將其放在正確的位置。 – Brody

回答

0

檢查數組的大小與您嘗試訪問的索引的大小。

public int[] colours = new int[MAP_WIDTH * MAP_WIDTH_MASK * 4]; 

64 * 63 * 4 = 16128

計數器的

最大值爲64×64-1 = 4095

colours[i*4 + 3] == colours[4095*4 + 3] 

4095 * 4 + 3 = 16383

16383> 16,128,所以索引超出界限。