2016-04-14 10 views
0

私はゲームを作っていますが、私はまだ画面作成のプロセスにいます。 黒、濃いグレー、明るい灰色、白の色のスプライトシートを作成しましたが、明るい色にしたいのですが、最初の色を初期化しようとするとArryIndexOutOfBoundsExeptionが表示されます。色を使用しようとするとArrayIndexOutOfBoundsExeptionが発生するJava

これは私が手助けするクラスのための私のコードです:誰かがexeptionがなくなっているように、問題を解決する方法を知っている場合は、返信気軽に

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]; 

       } 

      } 

     } 

    } 

} 

;)

+1

すべてのArrayIndexOutOfBoundsExceptionは重複しています。このような質問には、ほとんどの場合、オートクローゼスが必要です。そして、最小限の検証可能な例については何が難しいでしょうか? – KevinO

+1

単純な検証を行うと、「スレッド内の例外」メイン「java.lang.ArrayIndexOutOfBoundsException:16128 at(ある行番号)」を受け取ります。配列のサイズは16128なので、[16128]に何かを置くことはできません。 – KevinO

+0

配列は通常0バインドなので、インデックスから1を差し引いて正しい場所に配置する必要があります。 – Brody

答えて

0

チェック配列のサイズとアクセスしようとしているインデックスの大きさです。

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

64 * 63 * 4 = 16128

カウンタの

最大値* 4 + 3 = 16,383

16,383

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

4095 = 4095 64×64-1であり、> 16,128、インデックスが範囲外です。

関連する問題