TextButton没有响应libGDX上的InputListener?

时间:2015-08-07 06:34:38

标签: java android libgdx touch

我能够绘制我的按钮,但是当我点击/"触摸" 没有任何反应他们,我不知道我做错了什么。有人可以帮忙吗?不应该将textButtonStyle更改为" ToothButton"什么时候触摸?我不应该为Android应用程序使用InputListener吗?

MainMenuButtons.java

public class MainMenuButtons extends Stage {

Stage buttons;
MMButton startButton, optionButton;

public MainMenuButtons(Viewport viewport) {

    startButton = new MMButton(634,550, "Start");
    optionButton = new MMButton(634,450, "Options");

    buttons = new Stage(viewport);

    buttons.addActor(startButton);
    buttons.addActor(optionButton);
    Gdx.input.setInputProcessor(this);
}

MMButton.java(主菜单按钮)

public class MMButton extends Actor{
    TextButton button;
    TextButton.TextButtonStyle textButtonStyle;
    BitmapFont font;
    Skin skin;
    TextureAtlas buttonAtlas;


    public MMButton(int x, int y, String name) {
        font = new BitmapFont();
        skin = new Skin();

        buttonAtlas = new TextureAtlas(Gdx.files.internal("menuButton.atlas"));
        skin.addRegions(buttonAtlas);

        textButtonStyle = new TextButton.TextButtonStyle();
        textButtonStyle.font = font;
        textButtonStyle.up = skin.newDrawable("ToothButtonUp");
        textButtonStyle.down = skin.newDrawable("ToothButton");

        button = new TextButton(name, textButtonStyle);
        button.setBounds(x, y, 246, 90);
        button.setTouchable(Touchable.enabled);


        button.addListener(new InputListener() {
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                System.out.println("down");
                return true;
            }
            public void touchUp(InputEvent event, float x, float y, int pointer, int button ) {
                super.touchUp( event, x, y, pointer, button );
            }
        });
    }

MainMenuScreen.java(我很抱歉所有的代码我真的只想解决这个问题!):(

OrthoCamera是我上网的课程,简化了相机的使用。

公共类MainMenuScreen扩展了屏幕{

private OrthoCamera camera;
MainMenuButtons buttons;

@Override
public void create() {
    camera = new OrthoCamera();
    buttons = new MainMenuButtons(new ScreenViewport());
}
@Override
public void update() {
    camera.update();
    buttons.draw();
}
@Override
public void render(SpriteBatch batch) {
    batch.setProjectionMatrix(camera.combined);
    buttons.draw();
}
@Override
public void resize(int width, int height) {
    camera.resize();
    buttons.getViewport().update(width,height,true);

}

2 个答案:

答案 0 :(得分:1)

您的问题在于MainMenuButtons类。它有两个阶段。一个(按钮)添加了按钮actor,另一个(this)被设置为输入处理器。那不好。

有两种解决方案。

<强>要么...

替换此行...

Gdx.input.setInputProcessor(this);

有了......

Gdx.input.setInputProcessor(buttons);

并且不要再费力了。

或(如果你真的想扩展舞台)......

完全删除按钮变量,并替换这些行......

buttons.addActor(startButton);
buttons.addActor(optionButton);

有了......

addActor(startButton);
addActor(optionButton);

答案 1 :(得分:1)

我看到一些问题。

  1. 你在舞台上有一个舞台。内层有你的按钮,但它没有设置为输入处理器。移除内部舞台并直接使用外部舞台。或者,如果您尝试在此处组织代码,请使您的MainMenuButtons类扩展Stage(并为其提供getStage()方法,以便游戏类可以调用act和{ {1}}就可以了。

  2. 您永远不会在舞台上致电draw,因此不会对任何事情做出回应或采取任何行动。

  3. 您的MMButton类包含一个永远不会添加到舞台的内部Button实例,因此内部Button永远不会接收触摸事件,即使它有一个侦听器。您可以使MMButton类扩展Group而不是Actor,并通过act将内部Button添加到它。但我认为你在这里重新发明轮子。当您可以直接使用现有的TextButton类时,您不需要MMButton类 - 它本身就是Actor。从我所看到的,MMButton是一个冗余的包装器。

  4. 旁注:不建议为每个按钮使用单独的纹理图集和字体。纹理图集旨在由许多对象共享以利用精灵批处理。