Как сбросить все входные события в jMonkey
Моя игра загружается в Android примерно минуту, пока не появится первый экран. До момента загрузки менеджер ввода jmonkey ставит в очередь все входные данные, что приводит к неприятному поведению (автоматическое нажатие кнопок), как только загружается мой первый изящный экран.
То же самое происходит, когда сцена загружается (что снова занимает некоторое время после нажатия соответствующей изящной кнопки). Это происходит несмотря на то, что я установил сопоставления и прослушиватели в последнем состоянии приложения, которое загружается.
Есть ли способ очистить весь предыдущий ввод, который я могу вызвать непосредственно до и после добавления слушателей в менеджер ввода?
Я не делаю много работы с update() и инициализирую мои appstates, но некоторые функции (reinitialize()), которые я вызываю в OnClick() nifty, загружают всю сцену и модели в декорации сцены, так что это занимает некоторое время. Вот псевдокод моего приложения
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
);
}
}
2 ответа
Если есть способ сделать это, он будет на InputManager
так что вы можете проверить API для этого. Ваша проблема может заключаться в том, что очередь на самом деле не является очередью, как вы думаете. Потенциально это не очередь входных событий, а очередь действий, предпринимаемых в ответ на события. Поскольку события не обрабатываются до тех пор, пока цикл обновления не запустит их, то, если цикл загрузки остановлен, они будут продолжать накапливаться.
Вы можете просто не добавлять прослушиватели, пока приложение не завершит загрузку, тогда любые события будут автоматически игнорироваться. Вы также можете попытаться разбить сцену при загрузке, используя собственную очередь или подобное, чтобы загружать вещи по очереди, не полностью останавливая систему.
Вы можете получить лучший ответ на этот вопрос, если попробуете форумы jME3. Там больше активных обезьян, чем здесь, включая людей с более детальным знанием системы ввода, чем я:)
Я думаю, что Тим Б сказал, что это ваша лучшая ставка.
Однако вы можете попробовать позвонить nifty.setIgnoreMouseEvents(true)
а также nifty.setIgnoreKeyboardEvents(true)
в какое-то подходящее время, чтобы отключить обработку любых событий, которые могут достичь Nifty, и включить ее позже.