How to flush all input events in jMonkey

随声附和 提交于 2019-12-25 04:28:36

问题


My game takes around a minute to load in android till the first screen appears. Till the time its loading, jmonkey’s input manager seems to queue all inputs which results in nasty behavior(automatic button clicks) as soon as my first nifty screen loads.

Same happens when the scene loads(which again takes a while on pressing the appropriate nifty button). This happens despite the fact that I set mappings and listeners in the last App State which loads.

Is there a way to flush all previous input which I can call just before and after adding listeners to input manager?

I dont do much work in update() and initialize of my appstates but some functions (reinitialize()) which I call on nifty's OnClick(), loads all the scene and models in the scene garph so it takes a while. Here is a pseudo code of my application

In Main.java {

// Nothing in SimpleUpdate()

// This app state contains
 stateManager.attach(new MainMenuAppState());
}
In MainMenuAppState.java  implements ScreenController  {

initialize() {
        niftyDisplay = new NiftyJmeDisplay(app.getAssetManager(), app.getInputManager(), app.getAudioRenderer(), app.getGuiViewPort());

        // Create a new nifty GUI object
        nifty = niftyDisplay.getNifty();
// attach a couple of more app states which also has nothing significant in update loop

// do some good computation
// attach 5 new APP STATES which does not have anything significant in update()

display the appropriate screen of nifty
}
onClick() {
 nifty.gotoScreen(“loadScreen”);

// appstate previously attached. they dont have anything significant in update.
// They have significant initialize methods.
app.enqueue(
            rgas.reInitialize(time,cameraLoc,cameraRot);
            maes.reInitialize(qId); // loads all the scene and models on screen
            nifty.gotoScreen(“hudScreen”);
            nifty.getScreen(“hudScreen”).findElementByName(“ConfirmModuleButton”).setFocus();
            ppes.reInitialize();   // this contains input mappings

);
}
}

回答1:


If there is a way to do this it will be on the InputManager so you could check out the API for that. Your problem may be though that the queue isn't really a queue in the way you are thinking. Potentially it is not a queue of input events but a queue of actions being taken in response to the events. Since events don't process until the update loop runs them then if the upload loop is stalled they will keep building up.

You could simply not add the listeners until the application has finished loading, then any events will get ignored automatically. You could also try breaking the scene loading up using a queue or similar of your own to load things a bit at a time while not completely stalling the system.

You may get a better response on this question if you try the jME3 forums. There are more monkeys active there than here including people with more detailed knowledge of the input system than me :)




回答2:


I guess what Tim B said is your best bet.

However you could try calling nifty.setIgnoreMouseEvents(true) and nifty.setIgnoreKeyboardEvents(true) at some appropriate time to shut-off handling of any events that might reach Nifty and enable it later again.



来源:https://stackoverflow.com/questions/22200159/how-to-flush-all-input-events-in-jmonkey

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!