如何暂停游戏以处理用户输入

时间:2015-03-26 17:05:03

标签: java libgdx scene2d

我很多天都没有找到一个问题,我正面临一个问题。

在代码中,我不会把所有代码都放在一起,因为它只会使问题复杂化。

我有一个渲染每个帧的游戏类。

    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;
}

当我放入while循环时:

  • 屏幕不会从游戏更改为PauseScreen。
  • 循环运行而不停止
  • 屏幕块

但是当我删除while循环时,屏幕会切换到PauseScreen,但方法完成后无需等待用户选择选项。

修改 我试图避免使用另一个屏幕,即使我使用窗口屏幕块

1 个答案:

答案 0 :(得分:0)

你可以使用一个单独的屏幕,我不完全知道你的代码结构但是如果你试图从一个&#34; pop up&#34;那么你可以从概念上做到这一点。或者&#34;暂停屏幕&#34;或者那种性质的东西。

你的游戏画面内部有一个布尔值,当你的&#34;弹出&#34;显示,例如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 SuperJumper演示

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

回复您的修改

你的代码没有改变的原因是因为你有一个while循环打印到Gdx日志,直到输入,所以你的代码卡在那个while循环中。

如果你想走这条路,你可以设置一个“暂停”。将游戏画面中的变量设置为true,然后将屏幕设置为暂停屏幕。在游戏屏幕更新逻辑内部,告诉它在暂停时不要更新。

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