2013-09-30 2 views
0

현재 윈도우에 픽셀을 그려 넣으려는 중이므로 프로그램 시작시 픽셀을 벗어나 인덱스를 벗어난 것처럼 보입니다. 나는 정직하게 그것을 고치는 방법을 모른다. 아무도 문제가 어디 있는지 말해 줄 수 있습니까? 나는 많은 시간을 확인해 봤지만 그것이 나에게 잘되어야하는 것처럼 보인다. 아래에 내 프로젝트의 모든 코드를 주었지만 오류는 for 루프가있는 render 메서드 (Game 클래스)의 줄에 있습니다.배열 인덱스가 픽셀을 그릴 때 경계를 벗어났습니다.

편집 :

오류가 게임 클래스 루프의 어딘가입니다. pixles "라인 에서"48601 [내가] =의 screen.pixels [내가] "

화면 클래스

public class Screen { 
    private int width,height; 
    public int[] pixels; 

    public Screen(int width,int height){ 
     this.width = width; 
     this.height = height; 
     pixels = new int[width * height]; 

    } 

    public void render(){ 
     for (int y = 0; y < height; y++){ 
      for (int x = 0; x < width; x++){ 
       pixels[x + y * width] = 0xff00ff; 
      } 
     } 
    } 

} 


: 그것은

java.lang.ArrayIndexOutOfBoundsException을 말한다

Game Class 
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 java.awt.image.DataBufferInt; 
import javax.swing.JFrame; 


public class Game extends Canvas implements Runnable{ 

    private int width = 300; 
    private int height = width/16 * 9; 
    private int scale = 3; 
    private Thread thread; 
    private boolean running = false; 
    private JFrame frame; 
    private BufferedImage image = new BufferedImage(width * scale, height * scale,BufferedImage.TYPE_INT_RGB); 
    private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData(); 
    private Screen screen; 
    public Game(){ 

     screen = new Screen(width,height); 
     frame = new JFrame("Relm Of The Mad God Clone"); 
     this.setPreferredSize(new Dimension(width * scale, height * scale)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.add(this); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 



     start(); 

    } 

    public synchronized void start(){ 
     thread = new Thread(this,"Running Thread"); 
     thread.start(); 
     running = true; 
    } 

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

    public static void main(String[] args) { 
     Game g = new Game(); 
    } 

    private void update(){ 

    } 

    private void render(){ 
     BufferStrategy buffer = getBufferStrategy(); 

     if (buffer == null){ 
      createBufferStrategy(3); 
      return; 
     } 

     screen.render(); 

     for (int i = 0; i < pixels.length; i++){ 
      pixels[i] = screen.pixels[i]; 
     } 

     Graphics g = buffer.getDrawGraphics(); 

     g.drawImage(image, 0, 0, getWidth(), getHeight(),this); 

     g.dispose(); 
     buffer.show(); 
    } 

    @Override 
    public void run() { 
     while (running){ 
      update(); 
      render(); 

     } 
    } 
} 
+2

코드에서 정확히 어디서? – MadProgrammer

+0

원래 게시물에서 말하지만 Game 클래스의 for 루프 어딘가에 있습니다. 그것은 "java.lang.ArrayIndexOutOfBoundsException : 48601"줄에 "pixles [i] = screen.pixels [i]"@MadProgrammer라고 말합니다. – user2318396

+0

두 배열의 길이가 같습니까? 볼 수 있도록 각각의 길이를 인쇄하는 println()을 추가하십시오. – NormR

답변

1

screennew Screen(width, height)으로 초기화되므로 width*height 픽셀이됩니다. 반면에 pixels 변수는 image에서 초기화되며 width*scale * height*scale 픽셀입니다.

scale=3 때문에 이것은 pixels 어레이가 배열 screen보다 3 배 이상임을 의미한다. 그것이 예외를 얻는 이유입니다.

+0

감사합니다! 나는 그런 생각조차하지 않았다! @Vainolo – user2318396

관련 문제