Thanks for your reply. I’ve been trying to combine both (using keys as input handlers), but don’t get it working. I get a null pointer exception when I try to switch to another screen.
Here’s my code:
Main:
[java]
package mygame;
import com.jme3.app.SimpleApplication;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.Trigger;
import com.jme3.niftygui.NiftyJmeDisplay;
import com.jme3.renderer.RenderManager;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.screen.ScreenController;
public class Main extends SimpleApplication
implements ScreenController {
private Trigger feedback_trigger = new KeyTrigger(KeyInput.KEY_BACK);
private Trigger running_trigger = new KeyTrigger(KeyInput.KEY_RETURN);
private boolean isRunning = false; // starts at startscreen
private StartScreenState startScreenState;
private RunningScreenState runningScreenState;
private FeedbackScreenState feedbackScreenState;
public static SimpleApplication app;
private Nifty nifty;
private Screen screen;
public static void main(String[] args) {
app = new Main() {};
app.start();
}
@Override
public void simpleInitApp() {
setDisplayFps(false);
setDisplayStatView(false);
inputManager.addMapping("Feedback enter close", feedback_trigger);
inputManager.addListener(actionListener, new String[]{"Feedback enter close"});
inputManager.addMapping("Run evaluation", running_trigger);
inputManager.addListener(actionListener, new String[]{"Run evaluation"});
startScreenState = new StartScreenState(this);
runningScreenState = new RunningScreenState(this);
feedbackScreenState = new FeedbackScreenState(this);
NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay( assetManager,
inputManager,
audioRenderer,
guiViewPort);
// Create a new NiftyGUI object /
nifty = niftyDisplay.getNifty();
// register nifty screencontrollers
nifty.registerScreenController(startScreenState,
runningScreenState,
feedbackScreenState);
// Read your XML and initialize your custom ScreenController
nifty.addXml("Interface/fields.xml");
nifty.gotoScreen("start");
// attach the Nifty display to the gui view port as a processor
guiViewPort.addProcessor(niftyDisplay);
// disable the fly cam
flyCam.setDragToRotate(true);
}
//Nifty GUI ScreenControl methods
public void bind(Nifty nifty, Screen screen) {
this.nifty = nifty;
this.screen = screen;
}
private ActionListener actionListener = new ActionListener() {
public void onAction(String name, boolean isPressed, float tpf) {
if (name.equals("Run evaluation") && !isPressed) {
if (isRunning) {
stateManager.detach(runningScreenState);
stateManager.attach(startScreenState);
} else {
stateManager.detach(startScreenState);
stateManager.attach(runningScreenState);
}
// turn running on/off
isRunning = !isRunning;
} else if
(name.equals("Feedback enter close") && !isPressed && !isRunning) {
if (!isRunning && stateManager.hasState(startScreenState)) {
stateManager.detach(startScreenState);
stateManager.attach(feedbackScreenState);
} else if (!isRunning && stateManager.hasState(feedbackScreenState)) {
stateManager.detach(feedbackScreenState);
stateManager.attach(startScreenState);
}
}
};
};
@Override
public void simpleUpdate(float tpf) {
}
@Override
public void simpleRender(RenderManager rm) {
}
public void onStartScreen() {
}
public void onEndScreen() {
}
}
[/java]
StartScreenState (and similar for the other AppStates):
[java]
package mygame;
import com.jme3.app.Application;
import com.jme3.app.SimpleApplication;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.input.InputManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Node;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.screen.ScreenController;
public class StartScreenState extends AbstractAppState
implements ScreenController {
private ViewPort viewPort;
private Node rootNode;
private Node guiNode;
private AssetManager assetManager;
private InputManager inputManager;
private Node localRootNode = new Node(“Start Screen RootNode”);
private Node localGuiNode = new Node(“Start Screen GuiNode”);
private Nifty nifty;
private Screen screen;
private SimpleApplication app;
public StartScreenState(SimpleApplication app){
this.rootNode = app.getRootNode();
this.viewPort = app.getViewPort();
this.guiNode = app.getGuiNode();
this.assetManager = app.getAssetManager();
}
//Nifty GUI ScreenControl methods
public void bind(Nifty nifty, Screen screen) {
this.nifty = nifty;
this.screen = screen;
}
public void onStartScreen() { }
public void onEndScreen(){ }
@Override
public void initialize(AppStateManager stateManager, Application app) {
super.initialize(stateManager, app);
this.app=(SimpleApplication)app;
// Read your XML and initialize your custom ScreenController
nifty.gotoScreen("start");
BitmapFont guiFont = assetManager.loadFont(
"Interface/Fonts/Default.fnt");
BitmapText displaytext = new BitmapText(guiFont);
displaytext.setSize(guiFont.getCharSet().getRenderedSize());
displaytext.move( 10, displaytext.getLineHeight() + 20, 0);
displaytext.setText("Start screen.");
localGuiNode.attachChild(displaytext);
}
@Override
public void cleanup(){
super.cleanup();
}
/** jME3 AppState methods */
@Override
public void update(float tpf) {
/** jME update loop! */
}
@Override
public void stateAttached(AppStateManager stateManager) {
rootNode.attachChild(localRootNode);
guiNode.attachChild(localGuiNode);
}
@Override
public void stateDetached(AppStateManager stateManager) {
rootNode.detachChild(localRootNode);
guiNode.detachChild(localGuiNode);
}
}
[/java]
What is going wrong?