2016-04-09 3 views
1

Я пытаюсь создать простую игру, в которой вы идете и выбираете палочки. Я отслеживаю весь графический вывод и анимацию с использованием массива 2D-пикселей. В clear(), в котором я установил все пиксельные значения 0, это дает мне ArrayIndexOutOfBoundsExceptionjava.lang.ArrayIndexOutOfBoundsException на двумерном пиксельном массиве

Выход:

Exception in thread "Display" java.lang.ArrayIndexOutOfBoundsException: 225 
at com.game.sticks.Game.render(Game.java:105) 
at com.game.sticks.Game.run(Game.java:82) 
at java.lang.Thread.run(Unknown Source) 

Основной код:

package com.game.sticks; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 

import com.game.sticks.Graphics.Screen; 
import com.game.sticks.Player.Player; 

public class Game extends Canvas implements Runnable{ 
private static final long serialVersionUID = 1L; 

public static int width = 400; 
public static int height = width/16 * 9; 
public static int scale = 3; 
public static String title = "Pickn' Sticks"; 

boolean running = false; 
JFrame frame = new JFrame(); 
Thread thread; 

private Stick stick; 
private Player player; 

public int[][] pixels = new int[width][height]; 

public BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

public Game() { 
} 

Game(int i) { 
    Dimension size = new Dimension(width * scale, height * scale); 
    setPreferredSize(size); 

} 

public synchronized void start() { 

    thread = new Thread(this,"Display"); 
    stick = new Stick(); 
    player = new Player(); 

    running = true; 

    thread.start(); 

} 

public synchronized void stop() { 
    running = false; 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String[] args) { 
    Game game = new Game(1); 

    game.frame.setVisible(true); 
    game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    game.frame.add(game); 
    game.frame.pack(); 
    game.frame.setLocationRelativeTo(null); 
    game.frame.setResizable(false); 
    game.frame.setTitle(title); 

    game.start(); 
} 

public void run() { 
    setFocusable(true); 
    while (running) { 
     update(); 
     render(); 
    } 
    stop(); 
} 

public void update() { 
    player.update(); 
    System.out.println("updating"); 

} 

public void render() { 
    BufferStrategy bs = getBufferStrategy(); 
    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 

    clear(); 

    for(int i = 0;i<width;i++) { 
     for(int i2 = 0;i2<height;i++) { 
      pixels[i][i2] = -4325345; 
     } 
    } 

    for(int x = 0;x < width;x++) { 
     for(int y = 0;y < height;y++) { 
      image.setRGB(x,y,pixels[x][y]); 
     } 
    } 

    System.out.println("rendering"); 

    Graphics g = bs.getDrawGraphics(); 
    g = bs.getDrawGraphics(); 
    g.setColor(Color.green); 
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
    g.dispose(); 
    bs.show(); 
} 

private void clear() { 
    for(int i = 0; i<width; i++) { 
     for(int i2 = 0; i2<height; i++) { 
      pixels[i][i2] = 0; 
     } 
    } 
} 
} 

Как бы я идти о фиксации этого исключения ?

ответ

3

У вас есть два типа. Во-первых, в вашем цикле for на линии 104 инкремент должен быть i2 ++, а не i ++. Он должен выглядеть следующим образом:

for(int i = 0;i<width;i++) { 
    for(int i2 = 0;i2<height;i2++) { //The change is from i++ to i2++ 
     pixels[i][i2] = -4325345; 
    } 
} 

Вы также имеют те же проблемы в вашем методе ясного() в нижней части вашего кода.

+0

Благодарим за это. Я копировал и вставлял вложенные петли, и, наверное, я просто сделал глупую ошибку. Теперь я буду следить за этим. – Bojofart

+0

@Bojofart: Пожалуйста, отметьте это как принятый ответ, затем – nullpointer

0

У вас есть опечатка в вашей внутренней петле. Вы должны увеличивать i2 вместо i.

private void clear() { 
    for(int i = 0; i<width; i++) { 
     for(int i2 = 0; i2<height; i2++) { 
      pixels[i][i2] = 0; 
     } 
    } 
} 
0

Вы на самом деле сделали две ошибки в своей программе. из-за просто скопировать и вставить код

Первый Один private void clear() Метод.

private void clear() { 
    for(int i = 0;i<width;i++) { 
     for(int i2 = 0;i2<height;i++) { 
      pixels[i][i2] = 0; 
     } 
    } 
} 

Второй один только после того, как метода render().

for(int i = 0;i<width;i++) { 
     for(int i2 = 0;i2<height;i++) { 
      pixels[i][i2] = -4325345; 
     } 
    } 
Смежные вопросы