-1

私は Java でアプリケーションを開発しており、3 つの主要なクラス ファイルを書き終えましたが、わかりにくいエラーが発生しました。現在、画面にピクセルを描画しようとしていますが、ピクセル配列が機能しません。

コードで警告またはエラーが発生しているにもかかわらず、Render.javaでIndexOutOfBoundsExceptionを取得していますか?

Display.java

public class Display extends Canvas implements Runnable {

    private static final long serialVersionUID = 1L;
    
    public static final int WIDTH = 300;
    public static final int HEIGHT = 190;
    public static final int SCALE = 3;
    
    public static Dimension DIMENSION = new Dimension(WIDTH * SCALE, HEIGHT * SCALE);
    
    public static final String TITLE = "Untitled Project";
    
    public int[] pixels;

    public boolean isRunning = false;
    
    public Thread thread;
    public Screen screen;
    public Render render;
    
    public BufferedImage img;
    
    public Display() {
        screen = new Screen(WIDTH, HEIGHT);
        img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    }
    
    public void start(boolean isDebug) {
        if (isRunning)
            return;
        
        isRunning = true;
        
        thread = new Thread(this);
        thread.start();
    }
    
    public void stop() {
        if (!isRunning)
            return;
        
        isRunning = false;
        
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }
    }
    
    private void render() {
        BufferStrategy bs = this.getBufferStrategy();
        
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }
        
        screen.render();
        
        for (int i = 0; i < WIDTH * HEIGHT; i++)
            pixels[i] = screen.pixels[i];
        
        Graphics g = bs.getDrawGraphics();
        
        g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
        g.dispose();
        bs.show();
    }
    
    private void tick() {
        
    }

    public void run() {
        while (isRunning) {
            render();
            tick();
        }
    }
    
    public static void main(String[] args) {
        Display display = new Display();
            display.setMinimumSize(DIMENSION);
            display.setMaximumSize(DIMENSION);
            display.setPreferredSize(DIMENSION);
            
        JFrame frame = new JFrame();
            frame.setTitle(TITLE);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(display, BorderLayout.CENTER);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            frame.setVisible(true);
            
        display.start(true);
    }
}

Render.java

public class Render {
    
    public final int width;
    public final int height;
    public final int[] pixels;
    
    public Render(int width, int height) {
        this.width = width;
        this.height = height;
        pixels = new int[width * height];
    }
    
    public void draw(Render render, int xOffset, int yOffset) {
        for (int y = 0; y < render.height; y++) {
            
            int yPix = y + yOffset;
            
            for (int x = 0; x < render.width; x++) {
                int xPix = x + xOffset;
                
        ERROR -->   pixels[xPix + yPix * width] = render.pixels[x + y * render.width];
          }
        }
      }
    }

Screen.java

public class Screen extends Render {
    
    public Render render;
    public Random random;

    public Screen(int width, int height) {
        super(width, height);
        render = new Render(256, 256);
        random = new Random();
        
        for (int i = 0; i < 256 * 256; i++) {
            render.pixels[i] = random.nextInt();
        }
    }
    
    public void render() {
        draw(render, 0, 0);
    }
}

エラー

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 57000
at com.willajhughes.java.graphics.Render.draw(Render.java:23)
at com.willajhughes.java.graphics.Screen.render(Screen.java:21)
at com.willajhughes.java.Display.render(Display.java:76)
at com.willajhughes.java.Display.run(Display.java:94)
at java.lang.Thread.run(Unknown Source)
4

3 に答える 3

0

render高さと幅を重ね合わせようとしているように見えます

256, 256 (65536 pixels)

高さと幅の画面に

300, 190; (57000 pixels)

両方に同じインデックスを使用しています。


レンダリングを画面に合わせたいと思うかもしれません

render = new Render(this.width, this.height);

あなたのように256x256にハードコーディングする代わりに

于 2013-08-16T15:35:38.083 に答える
0

Screenオブジェクトは高さ 190 ピクセルで作成されますが、コンストラクターで作成されたオブジェクトRenderScreen高さは256ピクセルです。の境界を上書きしないようにする必要がありますScreen

注意してくださいWIDTH * HEIGHT = 300 * 190 = 57000。(クラスで定義されたWIDTHおよびから。)HEIGHTDisplay

于 2013-08-16T15:37:20.043 に答える