SLICK2D游戏状态未注册。

3

我有一个名为“I hate Christmas”的slick2d Java游戏。游戏不允许我过渡到下一个状态。它显示No game state registered with id of 1. 当我在Game.java中运行完全相同的代码时,它可以正常工作。以下是我的代码:

Game.java

package com.hurricane996.IHateChristmas;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.SlickException;

import org.newdawn.slick.state.GameState;
import org.newdawn.slick.state.StateBasedGame;


public class Game extends StateBasedGame{
public static String name="I Hate Christmas";
public static Game instance=new Game(name);

public static final int MAIN_MENU=0;
public static final int GAME=1;
public Game(String name) {
    // TODO Auto-generated constructor stub
    super(name);
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try{
        AppGameContainer agc=new AppGameContainer(new Game("Simple Slick Game"));
        agc.setDisplayMode(640, 480, false);
        agc.setShowFPS(false);
        agc.start();
    }catch(Exception e){
        Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, e);
    }

}






@Override
public void initStatesList(GameContainer arg0) throws SlickException {
    // TODO Auto-generated method stub
    this.addState( (GameState) new MainMenu());
    this.addState( (GameState) new GameScreen());
    this.enterState(GAME);
    this.enterState(MAIN_MENU);
}

}

MainMenu.java

package com.hurricane996.IHateChristmas;

import java.awt.Font;

import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.TrueTypeFont;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.state.GameState;
import org.newdawn.slick.state.StateBasedGame;

public class MainMenu implements GameState {
Font font = new Font("Verdana", Font.BOLD, 32);
TrueTypeFont ttf = new TrueTypeFont(font, true);
public MainMenu() {
    // TODO Auto-generated constructor stub
}

@Override
public void mouseClicked(int button, int x, int y, int arg3) {
        Game.instance.enterState(Game.GAME);


}

@Override
public void mouseDragged(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

@Override
public void mouseMoved(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(int arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(int arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}

@Override
public void mouseWheelMoved(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void inputEnded() {
    // TODO Auto-generated method stub

}

@Override
public void inputStarted() {
    // TODO Auto-generated method stub

}

@Override
public boolean isAcceptingInput() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public void setInput(Input arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyPressed(int arg0, char arg1) {
    // TODO Auto-generated method stub

}

@Override
public void keyReleased(int arg0, char arg1) {
    // TODO Auto-generated method stub

}

@Override
public void controllerButtonPressed(int arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void controllerButtonReleased(int arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void controllerDownPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerDownReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerLeftPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerLeftReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerRightPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerRightReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerUpPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerUpReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void enter(GameContainer arg0, StateBasedGame arg1) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public int getID() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void init(GameContainer arg0, StateBasedGame arg1) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public void leave(GameContainer arg0, StateBasedGame arg1) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public void render(GameContainer arg0, StateBasedGame arg1, Graphics g) throws SlickException {
    // TODO Auto-generated method stub

    g.setBackground(Color.white);
    g.setColor(Color.black);
    Rectangle button=new Rectangle(640/2-20, 480/2-10, 40, 20);
    g.fill(button);
    g.draw(button);

    ttf.drawString(640/2-ttf.getWidth("I hate Christmas")/2,480/3,"I hate Christmas",Color.black);
    g.setColor(Color.white);
    g.drawString("Play",640/2-20 ,480/2-10);


}

@Override
public void update(GameContainer arg0, StateBasedGame arg1, int arg2) throws SlickException {
    // TODO Auto-generated method stub

}

}

GameScreen.java

package com.hurricane996.IHateChristmas;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.GameState;
import org.newdawn.slick.state.StateBasedGame;

public class GameScreen implements GameState {

public GameScreen() {
    // TODO Auto-generated constructor stub
}
@Override
public void mouseClicked(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

@Override
public void mouseDragged(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

@Override
public void mouseMoved(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(int arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(int arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}

@Override
public void mouseWheelMoved(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void inputEnded() {
    // TODO Auto-generated method stub

}

@Override
public void inputStarted() {
    // TODO Auto-generated method stub

}

@Override
public boolean isAcceptingInput() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public void setInput(Input arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyPressed(int arg0, char arg1) {
    // TODO Auto-generated method stub

}

@Override
public void keyReleased(int arg0, char arg1) {
    // TODO Auto-generated method stub

}

@Override
public void controllerButtonPressed(int arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void controllerButtonReleased(int arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void controllerDownPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerDownReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerLeftPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerLeftReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerRightPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerRightReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerUpPressed(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void controllerUpReleased(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void enter(GameContainer arg0, StateBasedGame arg1) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public int getID() {
    return 1;
}

@Override
public void init(GameContainer arg0, StateBasedGame arg1) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public void leave(GameContainer arg0, StateBasedGame arg1) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public void render(GameContainer arg0, StateBasedGame arg1, Graphics arg2) throws SlickException {
    // TODO Auto-generated method stub

}

@Override
public void update(GameContainer arg0, StateBasedGame arg1, int arg2) throws SlickException {
    // TODO Auto-generated method stub

}

}

追踪信息:
java.lang.RuntimeException: No game state registered with the ID: 1
at org.newdawn.slick.state.StateBasedGame.enterState(StateBasedGame.java:153)
at org.newdawn.slick.state.StateBasedGame.enterState(StateBasedGame.java:131)
at com.hurricane996.IHateChristmas.MainMenu.mouseClicked(MainMenu.java:21)
at org.newdawn.slick.state.StateBasedGame.mouseClicked(StateBasedGame.java:488)
at org.newdawn.slick.Input.fireMouseClicked(Input.java:1526)
at org.newdawn.slick.Input.considerDoubleClick(Input.java:1111)
at org.newdawn.slick.Input.poll(Input.java:1233)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:641)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at com.hurricane996.IHateChristmas.Game.main(Game.java:31)

错误来自于MainMenu.mouseClick方法? - RPresle
1个回答

1
你的静态Game实例与在主方法中创建的不相等。你创建了两个Game实例,尝试使用那个没有初始化状态的实例。
你不能这样做:
public static Game instance = new Game(name);

and this:

AppGameContainer agc = new AppGameContainer(new Game("Simple Slick Game"));

请执行以下操作:
AppGameContainer agc = new AppGameContainer(instance);

当您调用click方法时,它使用一个没有状态的游戏实例,因为在创建游戏实例时未初始化状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接