Hallo,
ich bin gerade dabei mit einem Tutorial eine Art 2D Spiele Engine zu bauen.
Ich habe den gesamten Code wie im Tutorial abgetippt, aber erhalte eine Exception:
Exception in thread "Thread-3" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3843)
at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3817)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4358)
at java.awt.Component.createBufferStrategy(Component.java:3699)
at java.awt.Canvas.createBufferStrategy(Canvas.java:166)
at java.awt.Component.createBufferStrategy(Component.java:3623)
at java.awt.Canvas.createBufferStrategy(Canvas.java:141)
at spritesheet.State.render(State.java:60)
at spritesheet.MenuState.render(MenuState.java:26)
at spritesheet.State.run(State.java:79)
at java.lang.Thread.run(Thread.java:680)
Das ganze Konstrukt ist relativ komplex deshalb ist es einiges an Code.
Main.java
State.java
MenuState.java
StateManager.java
Auf den InputHandler habe ich verzichtet, da er für das Problem unrelevant ist.
Das einzige, was ich anders gemacht habe als im Tutorial ist, dass ich den init(); Aufruf in der Main Klasse ganz oben im Konstruktor habe. Im Tutorial war er ganz unten, dann hat mein Code aber nicht funktioniert. (Wobei ich hier auch nicht weiß warum, da im Tutorial alles geklappt hat)
Ich hoffe mir kann jemand helfen.
Gruß skappler
ich bin gerade dabei mit einem Tutorial eine Art 2D Spiele Engine zu bauen.
Ich habe den gesamten Code wie im Tutorial abgetippt, aber erhalte eine Exception:
Exception in thread "Thread-3" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3843)
at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3817)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4358)
at java.awt.Component.createBufferStrategy(Component.java:3699)
at java.awt.Canvas.createBufferStrategy(Canvas.java:166)
at java.awt.Component.createBufferStrategy(Component.java:3623)
at java.awt.Canvas.createBufferStrategy(Canvas.java:141)
at spritesheet.State.render(State.java:60)
at spritesheet.MenuState.render(MenuState.java:26)
at spritesheet.State.run(State.java:79)
at java.lang.Thread.run(Thread.java:680)
Das ganze Konstrukt ist relativ komplex deshalb ist es einiges an Code.
Main.java
Java:
package spritesheet;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Main extends JFrame {
public static final int GAME_WIDTH = 800, GAME_HEIGHT = 600;
StateManager sm;
public Main(){
init();
setSize(GAME_WIDTH, GAME_HEIGHT);
setVisible(true);
setResizable(false);
setTitle("Canvas");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void init(){
sm = new StateManager(this);
sm.setCurrentState("MenuState");
sm.startCurrentState();
}
public static void main(String[] args) {
Main main = new Main();
}
}
State.java
Java:
package spritesheet;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
public class State extends Canvas implements Runnable {
public InputHandler inputManager;
private volatile boolean running = false;
private long ticks = 0;
public BufferedImage screen = new BufferedImage(Main.GAME_WIDTH, Main.GAME_HEIGHT, BufferedImage.TYPE_INT_RGB);
private Graphics2D g = screen.createGraphics();
public String name;
public State(String s){
name = s;
inputManager = new InputHandler(this);
setVisible(true);
}
public void start(){
if(!running){
running = true;
new Thread(this).start();
}
}
public void stop(){
if(running){
running = !running;
}
}
public Graphics2D getGraphics2D(){
return g;
}
public boolean isRunning() {
return running;
}
public long getTicks() {
return ticks;
}
public void render(){
BufferStrategy b = getBufferStrategy();
if(b == null){
createBufferStrategy(3);
return;
}
Graphics g = b.getDrawGraphics();
g.drawImage(screen, 0, 0, Main.GAME_WIDTH, Main.GAME_HEIGHT, this);
g.dispose();
b.show();
}
public void update(){
ticks++;
}
@Override
public void run() {
while(running){
update();
render();
}
}
}
MenuState.java
Java:
package spritesheet;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
public class MenuState extends State {
int x = 100, y = 100;
public MenuState(){
super("MenuState");
inputManager.addMapping("Up", KeyEvent.VK_UP);
inputManager.addMapping("Down", KeyEvent.VK_DOWN);
inputManager.addMapping("Left", KeyEvent.VK_LEFT);
inputManager.addMapping("Right", KeyEvent.VK_RIGHT);
}
@Override
public void render(){
Graphics2D g = getGraphics2D();
g.setColor(Color.red);
g.fillRect(x, y, 50, 50);
g.dispose();
super.render();
}
@Override
public void update(){
super.update();
if(inputManager.isPressed("Up"))
y--;
if(inputManager.isPressed("Down"))
y++;
if(inputManager.isPressed("Left"))
x--;
if(inputManager.isPressed("Right"))
x++;
}
}
StateManager.java
Java:
package spritesheet;
import java.util.ArrayList;
import javax.swing.JFrame;
public class StateManager {
private ArrayList<State> states;
private int currentState;
private JFrame gameFrame;
public StateManager(JFrame j){
gameFrame = j;
states = new ArrayList<State>();
initAllStates();
}
private void initAllStates(){
//TODO Add states
states.add(new MenuState());
}
public void startCurrentState(){
states.get(currentState).start();
gameFrame.add(states.get(currentState));
}
public void stopCurrentState(){
gameFrame.remove(states.get(currentState));
states.get(currentState).stop();
}
public void setCurrentState(String s){
for(int i = 0; i < states.size(); i++){
if(s.equals(states.get(i).name)){
currentState = i;
}
}
}
}
Auf den InputHandler habe ich verzichtet, da er für das Problem unrelevant ist.
Das einzige, was ich anders gemacht habe als im Tutorial ist, dass ich den init(); Aufruf in der Main Klasse ganz oben im Konstruktor habe. Im Tutorial war er ganz unten, dann hat mein Code aber nicht funktioniert. (Wobei ich hier auch nicht weiß warum, da im Tutorial alles geklappt hat)
Ich hoffe mir kann jemand helfen.
Gruß skappler