2013-04-27 33 views
1

我正在尝试做一个游戏的启动画面。我搜索了Google无济于事。我按照这个教程here,它为他工作。我的代码有点不同,但看起来有点像他的。这里是我的代码:我不能用slick2D解决这个问题Java

Game类:

import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 

public class Game extends StateBasedGame { 

public static final String gamename = "Life - Alpha"; 
public static int menu = 1; 
public static int play = 2; 
public static int splash = 0; 

public Game(String gamename) { 
    super(gamename); 
} 

public void initStatesList(GameContainer gc) throws SlickException { 
    this.getState(menu).init(gc, this); 
    this.getState(play).init(gc, this); 
    this.enterState(0); 
} 

public static void main(String[] args) { 

    AppGameContainer app; 
    try { 
     app = new AppGameContainer(new Game(gamename)); 
     app.setDisplayMode(800, 600, false); 
     app.start(); 
    } catch (SlickException e) { 
     e.printStackTrace(); 
    } 

    } 
} 

Menu类:

import org.lwjgl.input.Mouse; 
import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 

public class Menu extends BasicGameState { 

public Menu(int state) { 

} 

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException { 

} 

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException { 

    Image back = new Image("res/Back.png"); 
    g.drawImage(back, 0, 0); 

    Image panel = new Image("res/Panel.png"); 
    g.drawImage(panel, 240, 100); 

    Image logo = new Image("res/Life Alpha.png"); 
    g.drawImage(logo, 290, 130); 

    Image playButton = new Image("res/Play.png"); 
    g.drawImage(playButton, 330, 310); 

    Image exitButton = new Image("res/Exit.png"); 
    g.drawImage(exitButton, 330, 370); 

} 

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {  

    Input input = gc.getInput(); 
    int xpos = Mouse.getX(); 
    int ypos = Mouse.getY(); 

    if((xpos > 330 && xpos < 480) && (ypos > 250 && ypos < 290)) { 
     if(input.isMousePressed(0)) { 
      sbg.enterState(2); 
     } 
    } 
} 

public int getID() { 
    return 0; 
} 

} 

PLAY类:

import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 

public class Play extends BasicGameState { 

public Play(int state) { 

} 

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException { 

} 

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException { 

    Image back = new Image("res/Back.png"); 
    g.drawImage(back, 0, 0); 

    Image panel = new Image("res/Panel2.png"); 
    g.drawImage(panel, 170, 100); 

} 

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException { 

} 

public int getID() { 
    return 1; 
} 

} 

SplashScreen类:

import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.state.BasicGameState; 
import org.newdawn.slick.state.StateBasedGame; 

public class SplashScreen extends BasicGameState { 

Image splash; 

private int elapsedTime; 
private final int DELAY = 3000; 

public SplashScreen(int state) { 

} 

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException { 

    splash = new Image("res/SplashScreen.png"); 

} 

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException { 

    g.drawImage(splash, 0, 0); 

} 

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException { 

    elapsedTime += delta; 

    if(elapsedTime >= DELAY) { 

     sbg.enterState(1); 

    } 

} 

public int getID() { 
    return 0; 
} 

} 

我得到的错误是:

周六4月27日22时48分01秒EST 2013 INFO:油滑构建#274

周六4月27日22时48分01秒EST 2013 INFO:LWJGL版本:2.8.5

周六年04月27 22点48分01秒EST 2013 INFO:OriginalDisplayMode:1366 * 768×32 @ 60Hz的

星期六年04月27 22:48:0 1 EST 2013 INFO:TargetDisplayMode:800×600×0 @ 0Hz时

周六年04月27 22点48分01秒EST 2013 INFO:启动显示800×600

周六年04月27 22点48分01秒EST 2013 INFO:使用Java的PNG装载机=真

周六4月27日22时48分01秒EST 2013 INFO:控制器不提供

异常线程 “main” 显示java.lang.NullPointerException

在mms001.Game.initStatesList( Game.java:18)

在org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:164)

在org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:390)

在有机newdawn.slick.AppGameContainer.start(AppGameContainer.java:314)

在mms001.Game.main(Game.java:29)

+1

改为使用['SplashScreen'](http://docs.oracle.com/javase/7/docs/api/java/awt/SplashScreen.html)。 – 2013-04-27 12:54:28

+0

oops ...我在代码中发现了一些错误。我修正了它,但是现在'splash screen'完成显示后,它进入'play'状态,而不是'menu'。我不知道什么是错的! – Maquaree 2013-04-27 13:07:11

回答

3

它看起来像有可能是一对夫妇的问题在这里。

我注意到你的Menu类正在返回0,因为它是ID,所以是SplashScreen类。我敢打赌,如果您将Menu课程的getID更改为1,那将解决您问题的一部分。

class Menu... 
public int getID() { 
    return 1; 
} 

您还需要更新Play类的getID方法以及返回2。

class Play... 
public int getID() { 
    return 2; 
} 

一旦你这样做了,它们将匹配你的主类中定义的静态字段。

然后更新您的initStatesList方法来初始化splash并进入menu状态

public void initStatesList(GameContainer gc) throws SlickException { 
    this.getState(splash).init(gc, this); 
    this.getState(menu).init(gc, this); 
    this.getState(play).init(gc, this); 

    this.enterState(menu); 
} 

希望这有助于。

+0

谢谢你!有效!我不得不改变菜单getID()返回1,并发挥getID()返回2;谢谢你! – Maquaree 2013-04-27 13:22:10

+2

当你有机会时,请[接受](http://meta.stackexchange.com/a/65088/155831)这个答案。 – 2013-04-27 13:25:35