当前位置: 首页 > 知识库问答 >
问题:

Libgdx:手机的后退按钮在屏幕之间继续

须捷
2023-03-14

我有三个类实现了LibGdx屏幕类:

主菜单屏幕,关卡选择屏幕,游戏屏幕

现在我有Main MenuScreen的setCatchBackKey设置为false,所以游戏将只退出后按。

LevelSelectScreen和GameScreen已将setCatchBackKey设置为true。

在GameScreen的渲染功能中,我有:

@Override
public void render(float delta)
{
    gameTime = delta;

    if (Gdx.input.isKeyPressed(Keys.BACK))
       new LevelSelectScreen(game);

    ...
}

它将屏幕设置为显示level select,并且在LevelSelectScreens的渲染功能中,我有:

@Override
public void render(float delta)
{
    if (Gdx.input.isKeyPressed(Keys.BACK))
        new MainMenuScreen(game);

    Update();
    Draw();
} //end render

我遇到的问题是,当我按下游戏屏幕时,水平选择屏幕会闪烁到屏幕上一会儿,然后直接回到主菜单屏幕。

我想我可以设置一些变量来检查屏幕初始化时是否已经返回,但我只是好奇LibGdx中是否已经包含了一些“神奇”的函数,或者只是代码结构也可以解决这个问题。

共有3个答案

尉迟清野
2023-03-14

我使用一个活动类,它为我拥有的每个屏幕扩展了“Android应用”类,例如LevelSelect活动、Main Menu活动和游戏活动。在每个类中,都有一个“屏幕”扩展类对象,就像你拥有的类一样,控制暂停、恢复和后键按下等事件是活动类的职责,而不是屏幕类的职责。当需要返回时,只需调用例如GameActive类中的“完成()”方法。它会自动转到SseltLevelActive。

严瑞
2023-03-14

而不是使用Gdx。输入isKeyPressed(int)您可以实现InputProcessor接口。

InputProcessor的文档:http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/InputProcessor.html

不要忘记注册InputProcessor,以便它接收输入事件,使用:Gdx。输入设置InputProcessor(InputProcessor);

对于这种特殊情况,请使用keyDown。

穆城
2023-03-14

首先,扩展舞台类,如下所示:

public static class MyStage extends Stage{
    public MyStage(float width, float height, boolean keepAspectRatio, SpriteBatch batch){
        super(width, height, keepAspectRatio, batch);
    }       
    @Override
    public boolean keyDown(int keyCode) {
        if(keyCode==Keys.BACK||keyCode==Keys.MENU){
            if(getHardKeyListener()!=null)
                getHardKeyListener().onHardKey(keyCode, 1);
        }           
        return super.keyDown(keyCode);
    }
    @Override
    public boolean keyUp(int keyCode) {
        if(keyCode==Keys.BACK||keyCode==Keys.MENU){
            if(getHardKeyListener()!=null)
                getHardKeyListener().onHardKey(keyCode, 0);
        }
        return super.keyUp(keyCode);
    }   

    /*********************Hard key listener***********************/
    public interface OnHardKeyListener{
        /**
         * Happens when user press hard key 
         * @param keyCode Back or Menu key (keyCode one of the constants in Input.Keys)
         * @param state 1 - key down, 0 - key up  
         */
        public abstract void onHardKey(int keyCode, int state);
    }
    private OnHardKeyListener _HardKeyListener = null;  
    public void setHardKeyListener(OnHardKeyListener HardKeyListener) {
        _HardKeyListener = HardKeyListener;
    }       
    public OnHardKeyListener getHardKeyListener() {
        return _HardKeyListener;
    }
}

然后在你的Screen类中:

protected final MyStage stage;
public YourScreen(Game game)
{
    this.game = game;   
    stage = new MyStage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true, game.spriteBatch);                    

    Gdx.input.setInputProcessor(stage);  
    //prevents the app from being pause...      
    Gdx.input.setCatchBackKey(true);
    Gdx.input.setCatchMenuKey(true);

    //Sets hard key listener...
    stage.setHardKeyListener(new OnHardKeyListener() {          
        @Override
        public void onHardKey(int keyCode, int state) {
            if(keyCode==Keys.BACK && state==1){
                //do something      
            }       
        }
    });
}

希望它能帮助你或其他正在寻找这些东西的人。

 类似资料:
  • 我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有

  • 问题内容: 大家好,我仍在从事这个libgdx项目的工作,我试图找出将屏幕切换到游戏屏幕的最佳方法。现在,当单击一个按钮时,我需要它来切换到游戏屏幕。我已经看到了一些扩展游戏类的实现方式,但是我不确定这里最好的方法是什么。如果您看到一些可以改进的代码,请告诉我。 这是主要的应用程序类: 问题答案: 这就是我始终执行屏幕切换的方式: 首先,主类需要扩展Game(From ),然后您需要具有一个新的t

  • 大家好,我仍然在做这个libgdx项目,我正在努力找出最好的方法来改变我的游戏屏幕现在,当一个按钮被点击时,我需要它转换到游戏屏幕。我见过一些扩展game类的实现,但我不确定从这里开始最好的方法是什么。如果你看到一些可以改进的代码,请让我知道。 以下是主要的应用程序类:

  • 我试图改变Libgdx屏幕之间的动画。我想写我的自定义动画(淡入淡出等)。有人能给我个线索吗?我似乎在Libgdx代码中找不到转换的实现。

  • 我在 Libgdx 游戏上的触摸接收器有问题。 在我的玩家主页上,我有这个: 当我运行我的游戏时,除了触摸监听器有时工作正常,但是在触摸几秒钟后。 Gdx.app.log(“已点击”、“已触摸”);通过触摸发射。 但是Gdx.app.log("点击了","很棒");或者Gdx.app.log("Clicked "," nooooooooooo ");我必须执行长按,直到触摸被触发。 谢谢 我添加了

  • 多亏了我在这个论坛上解决其他问题的帮助,我成功地推进了我的项目,但另一个障碍出现在我的道路上。 我有麻烦在libgdx java实现多个屏幕。我想知道如何实现多个屏幕(一个用于主菜单,一个用于播放,一个用于加载屏幕,...)。 关于我应该如何构造我的屏幕类的一个例子或一些解释将非常有帮助。我试着实现我自己的屏幕管理器,但不太顺利...还有一些关于我应该如何处理屏幕的提示,因为每次从主菜单到播放或选