组件必须具有有效的对等体(BufferStrategy)

时间:2016-04-02 12:18:43

标签: java canvas bufferstrategy

所以我在java上制作2D游戏,然后在我的游戏中实现了BufferStrategy方法。它已经停留在这条线上了#this; createBufferStrategy(3);'

从那以后,我收到了这个错误:

Exception in thread "Thread-2" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at main.game.Game.render(Game.java:72)
at main.game.Game.run(Game.java:51)
at java.lang.Thread.run(Unknown Source)

我不知道为什么..请帮忙。这是我的Game.java代码:

package main.game;

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


public class Game extends Canvas implements Runnable{

    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;

    private static Boolean GameRunning = false;

    private static final long serialVersionUID = 5551732181250630703L;

    public synchronized void ThreadCreation(){
        new Thread(new Game()).start();
        GameRunning = true;
        System.out.println("Thread created and running");
    }

    public void run(){
        //A common game loop used which is the 'heart' of the game.
        int frames = 0;
        int updates = 0;
        double ticknumber = 60.0;
        double divider = 1000000000 / ticknumber;
        double difference = 0;

        long prevTime = System.nanoTime();
        long timeKeeper = System.currentTimeMillis();

        while(GameRunning = true){
            long currentTime = System.nanoTime();
            difference += (currentTime - prevTime) / divider;
            prevTime = currentTime;

            while(difference >= 1){
                difference = difference - 1;
                tick();
                updates++;
            }

            render();
            frames++;

            if(System.currentTimeMillis() - timeKeeper >= 1001){
                timeKeeper = timeKeeper + 1000;
                System.out.println(frames);
                System.out.println(updates);
                frames = 0;
                updates = 0;
            }
        }
    }

        //Count frames (refreshes)
        private void tick(){

    }

    private void render(){
        BufferStrategy strats = this.getBufferStrategy();
        if (strats == null) {
            this.createBufferStrategy(3);
            return;
        }       
        Graphics g = strats.getDrawGraphics();

        //These are going to have a colored background and fill the game WindowFrame with it
        g.setColor(Color.black);
        g.fillRect(0, 0, WIDTH, HEIGHT);

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

    public static void main(String args[]){
        new WindowFrame(WIDTH, HEIGHT, "Combat", new Game());
    }
}

和WindowFrame.java代码:

package main.game;

import javax.swing.*;
import java.awt.*;

//This is the main WindowFrame class where the JFrame window's dimensions and features will be setted.
public class WindowFrame extends Canvas {

    private static final long serialVersionUID = -152448970909146807L;

    WindowFrame(int width, int height, String name, Game combat){

        combat.setPreferredSize(new Dimension(width, height));

        JFrame window = new JFrame(name);

        window.add(combat);                 //Adding the game to the new JFrame we made
        window.pack();
        window.setLocationRelativeTo(null); //Brings the window to the center of the screen instead of top left
        window.setResizable(false);         //Disabling resizing abilities
        window.setVisible(true);            //Visibility of windowFrame
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Actually closes the JFrame when we press exit
        combat.ThreadCreation();            //Starting the Thread creation and running it to execute game
    }
}

0 个答案:

没有答案