0

年に一度のゲーム大会である Ludum Dare 23 に参加するための準備として、かなり基本的な 3D ゲームを作ろうとしています。

私は Java を使用しており、Swing と AWT を使用しています。(私は自分のウィンドウを作成するために JFrame を使用しています (明らかに? idk))

私が抱えている問題は、画面にピクセルを描画しようとしているときに発生しています。BufferStrategyどうやらスレッドの問題と思われるもの に関して、いくつかの例外があります。

以下は、Eclipse のコンソール ボックスが私に投げかけているものです。

Exception in thread "Thread-2" java.lang.IllegalStateException: Component must have a valid peer
    at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3982)
    at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3956)
    at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4479)
    at java.awt.Component.createBufferStrategy(Component.java:3833)
    at java.awt.Canvas.createBufferStrategy(Canvas.java:194)
    at java.awt.Component.createBufferStrategy(Component.java:3756)
    at java.awt.Canvas.createBufferStrategy(Canvas.java:169)
    at com.ottdev.tale.TaleOfDwarvesComponent.render(TaleOfDwarvesComponent.java:66)
    at com.ottdev.tale.TaleOfDwarvesComponent.run(TaleOfDwarvesComponent.java:55)
    at java.lang.Thread.run(Thread.java:722)

この問題を解決する方法についてのアイデアはありますか? それは私の頭を動かしていて、私が前進するのを妨げています. すべてのヘルプは大歓迎です!

PS: 必要に応じてソース コードを公開できますが、今のところ、修正方法を知りたいので、将来この状況に遭遇した場合にどうすればよいかを知ることができますが、コードは異なります。

編集: 私のメイン クラス - TaleOfDwarvesComponent:

package com.ottdev.tale;    
import java.awt.*;
import java.awt.image.*;

import javax.swing.*;

import com.ottdev.tale.gui.*;

public class TaleOfDwarvesComponent extends Canvas implements Runnable {
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static final int SCALE = 2;
    public static final String TITLE = "Tale Of Dwarves!";

    private boolean running = false;
    private BufferedImage img;
    public int[] pixels;
    private Thread thread;
    private Game game;
    private Screen screen;

    public TaleOfDwarvesComponent() {
        game = new Game();
        screen = new Screen(WIDTH, HEIGHT);

        img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();



    }

    public void start() {
        if (running)
            return;
        running = true;
        new Thread(this).start();
    }

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

    }

    public void run() {
        while(running){
            render();
        }
    }

    public void tick(){
        game.tick();
    }

    public void render(){

        BufferStrategy bs = getBufferStrategy();
        if(bs == null){
            createBufferStrategy(3);
            return;
        }
        screen.render(game);
        for (int i = 0; i < WIDTH * HEIGHT; i++){
            pixels[i] = screen.pixels[i];
        }

        Graphics g = bs.getDrawGraphics();
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage(img, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {
        TaleOfDwarvesComponent game = new TaleOfDwarvesComponent();
        JFrame frame = new JFrame();
        frame.setSize(WIDTH, HEIGHT);
        frame.setLocationRelativeTo(null);
        frame.setTitle(TITLE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        game.start();

    }
}

BitmapクラスとクラスがありScreenますが、とりあえず、ここから私の悩みの答えが得られることを願ってこれを掲載します。

4

1 に答える 1

0

javadocs http://docs.oracle.com/javase/7/docs/api/java/awt/Canvas.html#createBufferStrategy(int )を見ると

Canvas が画面に表示される前に createBufferStrategy を呼び出しているという問題に具体的に対処していると思います。したがって、問題を解決するには、キャンバスに ComponentListener を追加し、componentShown で createBufferStrategy を呼び出すか、ペイント メソッドでこれを呼び出す必要があります。

于 2012-04-09T19:36:16.027 に答える