我有一个基于libGDX
的游戏,其中2 Stages
用于存储元素。有ImageButtons和Sprites。所有Sprites
都应该调用相同的函数,因此它们位于Stage
上,而ImageButtons
位于另一个Stage
上。
我使用MENU
按钮在听众之间进行切换。
@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();
}
});
因此,当调用其他函数时,我将侦听器设置为默认值,而不是主游戏函数。我想把它变成ToggleButton
,它可以在听众之间改变。这似乎很容易,但我不能为此目的使用第三种类型的听众。
问题是,在大多数新设备上,这不是任何MENU
按钮。
答案 0 :(得分:1)
新答案:
从您的评论中我假设您想要在两个阶段之间切换,而第三阶段始终处于活动状态。这里的关键是InputMultiplexer
可能有更好的方法来做到这一点,但我认为这样的事情应该有效:
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();
}
}