2012-06-02 14 views
5

Cuando intento descubrir cómo usar las estrategias de búfer, y en general solo estoy mejorando la forma en que escribo mi código y la limpieza. Cuando funciono el siguiente código, consigo un error cuando I "(3) createBufferStrategy"Excepción de estado ilegal al crear una nueva estrategia de Buffers

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



} 

La base se añade a continuación, con:

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

consigo el siguiente error:

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) 

¿Puede alguien decirme por qué sucede esto? y tal vez una solución a este problema?

Gracias

+0

por API, esta excepción se produce si el componente no se puede visualizar. –

+0

@HovercraftFullOfEels ¿Qué significa exactamente eso? – grimrader22

Respuesta

5

echar un vistazo a la API, esta excepción se produce si el componente no es visualizable. En este caso, es cuando Canvas.peer es null. Echando un vistazo al campo peer revela que

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

Puesto que usted está comenzando el hilo de actualización desde el constructor del componente, render podría ser llamado antes de su componente está siempre añadirse a otro contenedor, que significaría la peer es null, y entonces se lanzaría un IllegalStateException.

+0

Lo siento si estoy siendo estúpido, pero cuando se agrega el componente, eso es lo que estoy confundido, ¿cuándo lo llamo el método de renderizado? – grimrader22

+0

Solo debe llamar al método 'render' * después de que' 'Base' se haya agregado a un contenedor. En el código que nos mostró, 'Base' nunca se agrega a un contenedor. – Jeffrey

+0

Acabo de agregar el código base, ¿sería mejor si lo coloco todo en una clase? – grimrader22

3

En mi experiencia con este error y con el código que le escribe falta una función de marco.

Añadir donde sus marcos son (por ejemplo: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);) y añadir la función frame.add(game);

En este ejemplo, el mío es Display game = new Display(); pero dependiendo de lo que su variable para la nueva pantalla es, podría variar.

Cuestiones relacionadas