2015-03-26 1 views
0

У меня возникла проблема с многих дней, не найдя anwser.как приостановить игру для обработки пользовательского ввода

В коде я не буду размещать весь свой код, потому что это просто усложнит вопрос.

У меня есть класс игры, который визуализирует каждый кадр.

public class MyGame implements ApplicationListener { 

    @Override 
    public void render() { 
     //handling event 
     handleEvent(); 
     //update player position 
     updatePlayerPosition(); 
     //rendering the player using a batch 
     renderPlayer(); 

    } 

public void handleEvent(){ 
    //when the player prees on C i'm calling a method in another class 
    // when i do some processing 
    if (Gdx.input.isKeyPressed(Keys.C)) { 
     OtherClassForProcessing() ocp = new OtherClassForProcessing(); 
     ocp.process(); 
    } 
} 

    //in this method i have to ask the user to choose an option 
    //i have to think to stop running this method until the 
    // user choose  an option 
    //this method has to return a value 
    public static int displayChoice(List<Integer> ListOfInteger){ 
     return 0; 
    } 



} 


public Class OtherClassForProcessing(){ 
    public void process(){ 
    int value= MyGame.displayChoice() ; 
    } 

} 

Вопрос в том, как я могу попросить пользователя выбрать опцию в методе displayChoice.

Какой виджет будет выполнять эту работу.

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

Как я могу попросить программу остановиться, пока пользователь не выберет вариант.

Спасибо

, что я пытался это:

@Override 
public static int displayChoice(List<Integer> ListOfInteger){ 
    //i change the screen when i ask the user to choose from many options 
    setScreen(new PauseScreen()); 
    a wile loop hwo run until the user choose an option from the other screen 
    while(PauseScreen.notYetChoosen){ 
     Gdx.app.log("display message ", "the user not yet choose an ption"); 
    } 
    return PauseScreenValue; 
} 

Когда я поставил время цикла:

  • экран не изменяются от игры к PauseScreen.
  • вводного петля без останавливая
  • блок

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

EDIT я пытался избежать использования другого экрана unfortunantly даже когда я использовал окно, блок

+1

Вы можете добавить еще меньше кода, чтобы упростить вопрос, если вы использовали 'ApplicationAdapter' и удалили пустые переопределенные методы. Некоторые из нас смотрят на вопросы на наших телефонах - код прокрутки ужасен! –

+0

ok и я удалил пустой метод. спасибо – user3521250

ответ

0

экрана Вы можете использовать отдельный экран для этого, я не знаю структуру кода точно, но вот как вы можете сделать это концептуально, если вы пытаетесь получить входные данные из «всплывающего» или «пауза экрана» или чего-то подобного.

Внутри игрового экрана есть логическое значение, которое будет установлено, когда отображается «всплывающее окно», например isPaused, после чего вы можете использовать это логическое значение, чтобы пропустить логику игры, ожидая, пока экран примет вход.

Для более элегантного подхода вы можете использовать Game States, который может представлять, в каком состоянии находится ваша игра. Вы можете иметь состояние PLAYING, GETTING_INPUT и т. Д. Затем вы можете запускать логику игры в зависимости от того, в каком состоянии вы находитесь.

Пример:

public void update (float deltaTime) { 
     if (deltaTime > 0.1f) deltaTime = 0.1f; 

     switch (state) { 
     case GAME_READY: 
      updateReady(); 
      break; 
     case GAME_RUNNING: 
      updateRunning(deltaTime); 
      break; 
     case GAME_PAUSED: 
      updatePaused(); 
      break; 
     case GAME_LEVEL_END: 
      updateLevelEnd(); 
      break; 
     case GAME_OVER: 
      updateGameOver(); 
      break; 
     } 
    } 

Пример ИСТОЧНИК И ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: LIBGDX суперджампере Demo

https://github.com/libgdx/libgdx-demo-superjumper/blob/master/core/src/com/badlogicgames/superjumper/GameScreen.java

Ответ на ваш редактировать

Причина, по которой ваш код не меняется, заключается в том, что у вас есть временная печать в журнале Gdx до тех пор, пока не будет введен вход, чтобы ваш код застрял в этом цикле.

Если вы хотите пройти этот маршрут, вы можете установить переменную «пауза» на экране игры «Истина», а затем установить экран на экран паузы. Внутри вашей логики обновления игровых экранов скажите, чтобы она не обновлялась, если была приостановлена.

public void update() 
    { 
     if(!paused) 
     { 
      //game logic 
     } 
    } 
+0

Я думаю, что сделал то же самое, но это не сработало. Я отредактирую свой вопрос, чтобы показать вам мою попытку. – user3521250

+0

. Проверьте мое обновление для примера использования игровых состояний, это будет ваш лучший выбор, поскольку это официальный пример Libgdx , – chrissukhram

+0

см. Мое редактирование, чтобы объяснить, почему ваш код не работает – chrissukhram