2012-06-02 14 views
5

Wenn ich versuche, herauszufinden, wie man Pufferstrategien verwendet, und insgesamt verbessert nur, wie ich meinen Code schreibe und Dinge säubere. Wenn ich den folgenden Code ausführen, erhalte ich eine Fehlermeldung, wenn ich "createBufferStrategy (3)"Ungültiger Status Ausnahme beim Erstellen neuer Pufferstrategie

package Game1Test; 

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

import javax.swing.*; 

public class Base extends Canvas implements Runnable{ 

    private static final long serialVersionUID = 1L; 
    private boolean running = false; 
    int ticks = 0; 

    public Base(JFrame f) { 
     setSize(f.getWidth(),f.getHeight()); 
     start(); 
    } 

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

    } 
    public void run(){ 
     while(running){ 
      ticks++; 
      System.out.println(ticks); 
      render(); 

       try { 
        Thread.sleep(2); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
     } 
    } 
    public void render(){ 
     BufferStrategy bs = getBufferStrategy(); 
     Graphics g; 
     if(bs == null){ 
      createBufferStrategy(3); 
      requestFocus(); 
      return; 
     } 
     bs.show(); 
    } 



} 

The Base dann mit hinzugefügt wird:

package Game1Test; 

import java.awt.*; 

import javax.swing.JFrame; 

public class Screen extends JFrame{ 

    public final int GAME_WIDTH = 400; 
    public final int GAME_HEIGHT = 400; 
    public Dimension gameDim = new Dimension(GAME_WIDTH,GAME_HEIGHT); 
    final String gameName = "Test"; 

    public Screen(){ 
     setSize(gameDim); 
     setTitle(gameName); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setLayout(new GridLayout()); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 
    public static void main(String[] args){ 
     Screen s = new Screen(); 
     s.add(new Base(s)); 
    } 
} 

Ich erhalte die folgende Fehlermeldung:

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 Game1Test.Base.render(Base.java:46) 
    at Game1Test.Base.run(Base.java:33) 
    at java.lang.Thread.run(Unknown Source) 

Kann mir bitte jemand sagen, warum das passiert? und vielleicht eine Lösung für dieses Problem?

Dank

+0

In der API wird diese Ausnahme ausgelöst, wenn die Komponente nicht angezeigt werden kann. –

+0

@HovercraftFullOfEels Was genau bedeutet das? – grimrader22

Antwort

5

einen Blick auf die API nehmen, diese Ausnahme wird ausgelöst, wenn die Komponente nicht angezeigt werden kann. In diesem Fall ist das Canvas.peernull. einen Blick auf das peer Feld nehmen zeigt, dass

The peer is set when the Component is added to a container that also is a peer

Da Sie den Update-Thread aus starten Konstruktor Ihrer Komponente, render genannt werden kann, bevor die Komponente immer in einem anderen Behälter gegeben wird, welche die peer ist null bedeuten würde, und dann würde ein IllegalStateException geworfen werden.

+0

Sorry, wenn ich dumm bin, aber wann ist die Komponente hinzugefügt, darüber bin ich verwirrt, wenn shuold ich die Rendermethode aufrufen? – grimrader22

+0

Sie sollten die Methode 'render' nur aufrufen, nachdem * Base einem Container hinzugefügt wurde. In dem Code, den Sie uns gezeigt haben, wird "Base" niemals einem Container hinzugefügt. – Jeffrey

+0

Ich habe gerade den Basiscode hinzugefügt, wäre es besser Wenn ich alles in eine Klasse lege? – grimrader22

3

In meiner Erfahrung mit diesem Fehler und mit dem Code, den Sie schreiben, fehlt Ihnen eine Rahmenfunktion.

hinzufügen, wo Ihre Bilder sind (zB: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);) und die Funktion frame.add(game);

In diesem Beispiel hinzufügen, ist mein Display game = new Display(); aber je nachdem, was Ihre Variable für die neue Anzeige ist, kann es variieren.

Verwandte Themen