0

現在、ウィンドウにピクセルを描画しようとしていますが、プログラムの起動時に範囲外のエラーに遭遇してインデックスを作成しているようです。正直なところ、それを修正する方法がわかりません。問題がどこにあるか誰か教えてもらえますか? 何度も確認しましたが、私には問題ないようです。以下に私のプロジェクトのすべてのコードを示しましたが、エラーは for ループがある render メソッド (Game クラス) の行にあります。

編集:

エラーは Game クラスの for ループのどこかにあります。それは言う

java.lang.ArrayIndexOutOfBoundsException: 48601" 行 "pixles[i] = screen.pixels[i]"

画面クラス

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

}


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();

        }
    }
}
4

1 に答える 1

1

screen変数は で初期化されてnew Screen(width, height)いるため、おそらくwidth*heightピクセルが含まれています。一方、pixels変数は、ピクセルimageを持つから初期化されます。width*scale * height*scale

以来scale=3、これは配列が配列pixelsよりも 3 倍長いことを意味しscreenます。そのため、例外が発生しています。

于 2013-09-30T02:55:12.827 に答える