Android 侦听器之间的libGDX更改

Android 侦听器之间的libGDX更改,android,menu,libgdx,listener,Android,Menu,Libgdx,Listener,我有一个基于libGDX的游戏,其中有两个stage用于存储元素。有图像按钮和精灵。所有精灵都应该调用相同的函数,因此它们位于阶段上,图像按钮位于另一个阶段。 我使用菜单按钮在监听器之间切换 @Override public boolean keyDown(int keycode) { if ((keycode == Keys.M) || (keycode == Keys.MENU)) { // some code } 已经有两个不同的阶段使用不同的按钮。我在keyDow

我有一个基于
libGDX
的游戏,其中有两个
stage
用于存储元素。有图像按钮和精灵。所有
精灵
都应该调用相同的函数,因此它们位于
阶段
上,
图像按钮
位于另一个
阶段
。 我使用
菜单
按钮在监听器之间切换

@Override
public boolean keyDown(int keycode) {
    if ((keycode == Keys.M) || (keycode == Keys.MENU)) {
       // some code
}
已经有两个不同的阶段使用不同的按钮。我在
keyDown
函数中在它们之间切换,如下所示。此功能位于
keyDown

ExitButton.addListener(new ClickListener() {
 @Override
   public void clicked(InputEvent event, float x, float y) {
   Gdx.input.setInputProcessor(dialog);
   pause();
   }
});
所以,当调用其他函数时,我将侦听器设置为默认值,而不是主游戏函数。我想让它像一个
切换按钮
,可以在监听器之间切换。这似乎很容易,但我不能使用第三种类型的侦听器来实现这一目的

问题是,在大多数较新的设备上,这不是任何
菜单按钮。

新答案:

根据您的评论,我假设您希望在两个阶段之间切换,而第三个阶段始终处于活动状态。这里的关键是
输入多路复用器
可能有一种更漂亮的方法来实现这一点,但我认为类似的方法应该可以:

public class ButtonTest implements Screen
{
    public class RedCircle extends Actor
    {
         //just a placeholder, your implementation would probably not use this
    }

    public class BlackCircle extends Actor
    {
        //just a placeholder, your implementation would probably not use this
    }

    InputMultiplexer plexer;
    Stage hudStage;
    Stage redStage;
    Stage blackStage;
    public ButtonTest(Skin skin,List<RedCircle> redCircles, List<BlackCircle> blackCircles)
    {
        hudStage = new Stage();
        redStage = new Stage();
        blackStage = new Stage();
        plexer = new InputMultiplexer();
        plexer.addProcessor(hudStage);
        final TextButton switchButton = new TextButton("switch",skin);
        switchButton.addListener(new ClickListener(){
            @Override
            public void clicked(InputEvent event, float x, float y)
            {
                if(switchButton.isChecked())
                {
                    plexer.removeProcessor(redStage);
                    plexer.addProcessor(blackStage);
                }
                else
                {
                    plexer.addProcessor(redStage);
                    plexer.removeProcessor(blackStage);
                }
                switchButton.setText("this button is clicked");
                super.clicked(event, x, y);
            }
        });

        for(RedCircle r : redCircles)
            redStage.addActor(r);

        for(BlackCircle b : blackCircles)
            blackStage.addActor(b);


        switchButton.setPosition(0.1f* Gdx.graphics.getWidth(),0.1f*Gdx.graphics.getHeight());
        hudStage.addActor(switchButton);
    }

    @Override
    public void show()
    {
        Gdx.input.setInputProcessor(plexer);

    }

    @Override
    public void render(float delta)
    {
        Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        hudStage.act();
        hudStage.draw();
        redStage.act();
        redStage.draw();
        blackStage.act();
        blackStage.draw();
    }

    @Override
    public void resize(int width, int height)
    {

    }

    @Override
    public void pause()
    {

    }

    @Override
    public void resume()
    {

    }

    @Override
    public void hide()
    {

    }

    @Override
    public void dispose()
    {
        redStage.dispose();
        blackStage.dispose();
        hudStage.dispose();
    }
}
公共类ButtonTest实现屏幕
{
公共类RedCircle扩展了Actor
{
//只是一个占位符,您的实现可能不会使用它
}
公共类BlackCircle扩展了Actor
{
//只是一个占位符,您的实现可能不会使用它
}
输入多路复用器;
阶段性阶段;
舞台红舞台;
舞台黑舞台;
公共按钮测试(皮肤、列表红圈、列表黑圈)
{
hudStage=新阶段();
redStage=新阶段();
blackStage=新阶段();
plexer=新的输入多路复用器();
plexer.addProcessor(hudStage);
最终文本按钮开关按钮=新文本按钮(“开关”,皮肤);
switchButton.addListener(新建ClickListener(){
@凌驾
已单击公共无效(InputEvent事件、浮点x、浮点y)
{
if(switchButton.isChecked())
{
plexer.removeProcessor(redStage);
plexer.addProcessor(blackStage);
}
其他的
{
plexer.addProcessor(redStage);
plexer.removeProcessor(blackStage);
}
switchButton.setText(“单击此按钮”);
超级点击(事件,x,y);
}
});
用于(红色圆圈r:红色圆圈)
redStage.addActor(r);
用于(黑圈b:黑圈)
黑舞台。附加演员(b);
switchButton.setPosition(0.1f*Gdx.graphics.getWidth(),0.1f*Gdx.graphics.getHeight());
hudStage.addActor(开关按钮);
}
@凌驾
公开展览(
{
Gdx.input.setInputProcessor(plexer);
}
@凌驾
公共无效渲染(浮动增量)
{
Gdx.gl.glClearColor(0.0f,0.0f,0.0f,0.0f);
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位);
hudStage.act();
hudStage.draw();
redStage.act();
redStage.draw();
blackStage.act();
blackStage.draw();
}
@凌驾
公共空心调整大小(整型宽度、整型高度)
{
}
@凌驾
公共空间暂停()
{
}
@凌驾
公众简历()
{
}
@凌驾
公共空间隐藏()
{
}
@凌驾
公共空间处置()
{
redStage.dispose();
blackStage.dispose();
hudStage.dispose();
}
}

您的问题是什么?@p.streef:如何将
菜单
按钮更改为另一个解决方案,因为此按钮是特定于设备的。您是否考虑过在屏幕上创建自己的按钮?是的,当然,但listener呢。当它被触摸时,如何检测。这没关系,但它如何解决我的问题呢?我已经用过皮了。我看不到解决方案,或者无法解释。问题是,我已经无法在侦听器之间切换。对于此切换功能,使用的是
菜单
按钮及其
按键
功能。更多详细信息:因此黑色形状使用一种侦听器,红色形状使用另一种类型的侦听器。黑色形状的侦听器是屏幕上的默认值,它可以通过菜单按钮切换到其他类型(如代码所示)。我想在没有菜单按钮的情况下切换。图:我想我现在明白你想要什么了,检查我的更新答案。多路输入。是的,听起来更棒!谢谢,我以前没用过这个!