Ожидание сенсорного ввода без блокировки игрового потока

Я недавно разрабатывал игру для Android. Игра похожа на классические игры Pokemon (довольно сложная). У меня довольно много проблем. Тем не менее, мне сложно разрабатывать диалоговые окна (пишущая машинка), которые отображаются в нижней части экрана, когда кто-то говорит. Я застрял в ожидании ввода, не блокируя методы рендеринга и обновления (поскольку все они работают в одном потоке).

Это упрощенная версия моей игровой петли, описывающая структуру и то, что я делаю каждый кадр. Показанный метод обновления вызывается методом View # onDraw.

public static void update(Canvas canvas, GameView view){ //time operations (calculating delta etc.) long cTime = System.currentTimeMillis(); delta = cTime - time; time = cTime; globals.put("time", time); globals.put("delta", delta);//set vars for scripts camera.applyToCanvas(canvas);//apply camera matrix to canvas if(map != null)map.update(); if(battle != null)map.update(); Effect.updateAll();//update everything (game logic) render.load(canvas);//load the canvas into my custom render engine render();//call render method (shown below) view.invalidate();//reset view for redraw } public static void render(){ render.reset();//clears the canvas using canvas.setColor(Color.BLACK) if(map != null)map.draw(); if(battle != null)battle.draw(); if(dialog != null)dialog.draw(); if(gui != null)gui.draw(); //draw everything using the renderengine } 

Как вы можете видеть, эти операции обновляют все игровые компоненты (карта, битвы, guis и т. Д.), А затем отображают их на экран. Посмотрев на код, ясно, что я выполняю эти операции в одном потоке, поэтому этот поток, очевидно, не может быть заблокирован (иначе игра просто остановится).

Вот где моя проблема. Я использую в игре gui несколько кнопок. Эти кнопки назначаются 8 целым числам (0-8), а при нажатии кнопки «вверх», например, входные данные передаются в игру в существующий диалог или битву или что-то в этом нуждается. Эти кнопки полагаются на события касания основной активности, где MotionEvent, который в результате запуска игрового цикла из метода onDraw, настраивается на тот же поток, что и сама игра. Вот как я обрабатываю диалоги:

  1. Я использую javascript (парсер носорога) следующим образом (передача объекта диалога в скрипт в диалоге переменных): var d = dialog.show («Привет! Как вы»);

  2. Чтобы получить вход, я вызываю метод getInput, который принимает в диалоговом окне, и до 4 строк в качестве параметров выбора. Предполагается, что этот метод возвращает целочисленное значение. Это можно вызвать через скрипт следующим образом: var response = dialog.getInput(d, "I'm fine, thank you!", "Who wants to know.");

  3. Метод getInput в моем классе Dialog следующий:

     public static int getInput(Dialog d, String... args){ d.waitingForInput = true; d.lastInput = -1; while(d.waitingForInput || d.lastInput == -1){ //render options //main thread is obviously blocked here. } return d.getLastInput();//returns the d.lastInput and resets waitingForInput and lastInput. The script can then use this value to decide what to do. } 

Теперь мой главный вопрос: как запустить этот метод, не блокируя поток рендеринга и обновления. Более конкретно, установка значения d.lastInput и d.waitingForInput, когда пользователь коснется определенной области экрана (где кнопка выбора gui).

Если есть какие-то сомнения относительно того, что я пытаюсь задать в этом вопросе, пожалуйста, оставьте комментарий, поскольку я очень устал и потратил некоторое время, пытаясь решить это.

РЕДАКТИРОВАТЬ:

Я думал о запуске ввода в отдельном потоке, но это все равно приведет к блокировке других методов ввода (например, изменение выбранного параметра в диалоговом окне).

Если вы не хотите останавливать потоки, и вы уже на полпути

Метод1: используйте ConcurrentLinkedQueue, ArrayBlockingQueue и его семейства как статическую переменную и помещайте в нее свои значения.

Метод 2: вы можете использовать сокеты TCP / UDP с помощью адаптера localhost, например системы очереди сообщений, и пытаться получить эти значения с помощью той же технологии ConcurrentLinkedQueue, ArrayBlockingQueue

Попробуйте указать исходные коды исходных кодов open source java и определить, как они это сделали или вы можете использовать эти игровые движки, такие как «jMonkeyEngine» «LWJGL» … и т. Д.

Я решил подойти к этому через форму обработчиков событий. Когда требуемый ввод не работает, указанный скрипт запускается в игре.

Intereting Posts
Как добавить физическое Android-устройство в Visual Studio 2015 Preview Как справиться с развертыванием мобильных приложений на платформе с белой маркировкой? Как исправить ошибку «Ошибка создания окончательного архива: дублировать запись: AndroidManifest.xml» Где метаданные android.max_aspect отличаются? Отправить форму с данными POST в приложении для Android Как отобразить 3 фрагмента внутри PageViewer Xamarin.Android сборки / развертывания очень медленно. Как ускорить их? Android: невозможно уничтожить активность Как включить XEP-0199 в Smack? Когда следует использовать каждый из разных типов сообщений для Android? Как заменить эллипсы на fade / fading edge в textview в Android sdk? Как запустить файл apk онлайн? Прокрутка текста в андроиде Является ли библиотека Java.util.concurrent лучше при выполнении каких-либо задач над стандартным Android AsyncTask Почему моя служба всегда привязывается к ipv6 localhost вместо ipv4?