2016-02-10 3 views
3

У меня есть slick2d JavaGame под названием I hate Christmas. Игра не позволит мне перейти к следующему состоянию. Он говорит No game state registered with id of 1. Когда я запускаю тот же точный код в Game.java, он отлично работает. Вот мой код Game.javaSLICK2D Состояние игры не зарегистрировано

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 

} 

} 

Traceback:

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) 
+0

Ошибка исходит из метода MainMenu.mouseClick? – RPresle

+0

Да, да.() –

ответ

1

Ваш статический экземпляр Игра не равный тому, что созданный в основном методе. Вы создаете 2 экземпляра игры и пытаетесь использовать тот, у которого нет инициализированных состояний.

Вы не можете сделать это:

public static Game instance = new Game(name); 

и это:

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

ли это вместо:

AppGameContainer agc = new AppGameContainer(instance); 

Когда ваш метод щелчок называется, он использует игру экземпляр без состояний, поскольку состояния не инициализируются при создании экземпляра игры.

Смежные вопросы