Another shorter solution to the Nifty Overlay
Nifty and Slick User Tobse pointed out that you can use the NiftyGameState to create overlays too.
I like his version because it is shorter and much of the details of how the integration with Nifty works (calling render and forwarding input events to Nifty) are hidden from you. However the class NiftyGameState has been designed as a base class for a real Nifty GUI State and was not really planned for overlay rendering.
So I think although both versions work there is still something missing (in both versions). I like the idea of hidding the details on one hand but I’m not sure if using the NiftyGameState is really the way to achieve this.
What do you think?
Click the “Read More” link to see the short version of TestState that Tobse wrote and which is less code than my initial version
package tests; import org.newdawn.slick.*; import org.newdawn.slick.state.*; import de.lessvoid.nifty.*; import de.lessvoid.nifty.effects.EffectEventId; import de.lessvoid.nifty.elements.Element; import de.lessvoid.nifty.screen.*; import de.lessvoid.nifty.slick.NiftyGameState; /** * This is the original TestState1 from slick tests extended to a nifty gui overlay. This only * implements from ScreenController because we have a quit() onClick action definied in the * nifty xml file that is handled in here to quit the demo. * * @author void */ public class TestState2 extends BasicGameState implements ScreenController { public static final int ID = 1; private GameContainer container; private Font font; private Color currentColor; private Nifty nifty; private NiftyGameState niftyGameState; @Override public int getID() { return ID; } public void init(GameContainer container, StateBasedGame game) throws SlickException { this.container = container; font = new AngelCodeFont("menu.fnt", "menu.png"); currentColor = Color.white; niftyGameState = new NiftyGameState(2); niftyGameState.fromXml("tests/overlay.xml", this); container.getInput().addListener(niftyGameState); niftyGameState.init(container, game); nifty = niftyGameState.getNifty(); } public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { g.setFont(font); g.setColor(currentColor); g.drawString("State Based Game Test", 100, 100); g.drawString("1-3 will switch between colors", 100, 300); g.drawString("(this is all slick rendering!)", 100, 400); g.drawString("and this is more slick text", 360, 650); g.drawString("below (!) a nifty-gui overlay", 360, 700); niftyGameState.render(container, game, g); } public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException { } @Override public void enter(GameContainer container, StateBasedGame game) throws SlickException { niftyGameState.enter(container, game); } @Override public void keyReleased(int key, char c) { if (key == Input.KEY_1) { currentColor = Color.red; getElement("red").startEffect(EffectEventId.onCustom); } if (key == Input.KEY_2) { currentColor = Color.green; getElement("green").startEffect(EffectEventId.onCustom); } if (key == Input.KEY_3) { currentColor = Color.blue; getElement("blue").startEffect(EffectEventId.onCustom); } } private Element getElement(final String id) { return nifty.getCurrentScreen().findElementByName(id); } public void bind(Nifty nifty, Screen screen) {} public void onEndScreen() {} public void onStartScreen() {} public void quit() { nifty.getCurrentScreen().endScreen(new EndNotify() { public void perform() { container.exit(); } }); } }
void
September 14th, 20096:36 pm at
Thank both of you for the alternative solution!
September 17th, 200910:54 pm at
I use something like that in my project:
public class Test extends NiftyGameState implements ScreenController {
private GameContainer container;
private Font font;
private Color currentColor;
public Test() {
super(1);
}
public void init(GameContainer container, StateBasedGame game) throws SlickException {
this.init(container, game);
this.fromXml(”tests/overlay.xml”, this);
this.container = container;
font = new AngelCodeFont(”menu.fnt”, “menu.png”);
currentColor = Color.white;
}
public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException {
g.setFont(font);
g.setColor(currentColor);
g.drawString(”State Based Game Test”, 100, 100);
g.drawString(”1-3 will switch between colors”, 100, 300);
g.drawString(”(this is all slick rendering!)”, 100, 400);
g.drawString(”and this is more slick text”, 360, 650);
g.drawString(”below (!) a nifty-gui overlay”, 360, 700);
super.render(container, game, g);
}
public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException {
super.update(container, game, delta);
}
@Override
public void keyReleased(int key, char c) {
if (key == Input.KEY_1) {
currentColor = Color.red;
getElement(”red”).startEffect(EffectEventId.onCustom);
}
if (key == Input.KEY_2) {
currentColor = Color.green;
getElement(”green”).startEffect(EffectEventId.onCustom);
}
if (key == Input.KEY_3) {
currentColor = Color.blue;
getElement(”blue”).startEffect(EffectEventId.onCustom);
}
}
private Element getElement(final String id) {
return nifty.getCurrentScreen().findElementByName(id);
}
public void bind(Nifty nifty, Screen screen) {}
public void onEndScreen() {}
public void onStartScreen() {}
public void quit() {
nifty.getCurrentScreen().endScreen(new EndNotify() {
public void perform() {
container.exit();
}
});
}
}
January 9th, 20108:28 pm at
Hi
I need Slick with Nifty. My problem is to switch between different gamestates.
This code doesen’t work. The nifty gui doesen’t work anymore, if I switch back.
” public void goBack() {
nifty.getCurrentScreen().endScreen(new EndNotify() {
public void perform() {
game.enterState(2);
}
});
}”