首页 > 解决方案 > 实施图像按钮后相机不再工作 - Libgdx

问题描述

我正在开发一款适用于 Android 的游戏。我希望用户能够通过拖动手指向左侧和右侧“滚动”。到现在为止,这一切都很好。现在我正在尝试用一些按钮来实现 Gui。

它应该看起来像这样:
https ://i.stack.imgur.com/jf0uZ.png

代码:

public class MainGameScreen implements Screen, InputProcessor {
    Texture background, background_left, background_right;
    public SpriteBatch batch;
    //Graphical user interface
    private Stage GUIStage;
    private InputMultiplexer multiplexer;

//Camera
OrthographicCamera camera;
//Font
private BitmapFont font;
private String message = "Touch me";

//Buttons
private Stage button;
private Texture myTexture;
private TextureRegion myTextureRegion;
private TextureRegionDrawable myTexRegionDrawable;
private ImageButton imageButton;

public MainGameScreen (Trench_Warfare game) {
    this.game = game;
    batch = new SpriteBatch();
    button = new Stage();

    //GUI - Graphical user interface
    GUIStage = new Stage(new ScreenViewport());

    Image gui_background = new Image(new Texture("gui/GUI.png"));
    gui_background.setPosition(0,0);
    gui_background.setTouchable(Touchable.disabled);
    GUIStage.addActor(gui_background);

    //Buttons
    myTexture = new Texture(Gdx.files.internal("gui/button/paper_riflemen.png"));
    myTextureRegion = new TextureRegion(myTexture);
    myTexRegionDrawable = new TextureRegionDrawable(myTextureRegion);
    imageButton = new ImageButton(myTexRegionDrawable); //Set the button up
    button = new Stage(new ScreenViewport()); //Set up a stage for the ui;
    imageButton.isTouchable();
    imageButton.setBounds(0,500,194,200);
    button.addActor(imageButton); //Add the button to the stage to perform rendering and take input.

    //Font
    font = new BitmapFont();
    font.setColor(Color.BLACK);
    font.getData().scale(5);

    //Background
    background = new Texture("level1.png");
    background_left = new Texture("level1_seiten.png");
    background_right = new Texture("level1_seiten.png");

    //Camera
    camera = new OrthographicCamera(Gdx.graphics.getWidth()/*4000*/, Gdx.graphics.getHeight()/*2200*/);
    camera.update();
    camera.setToOrtho(false, Gdx.graphics.getWidth()*1.5f, Gdx.graphics.getHeight()*1.5f);

    button.addListener(new ClickListener(){
        @Override
        public void clicked(InputEvent event, float x, float y) {
            message = "Touch";
            event.handle();//the Stage will stop trying to handle this event
        }
    });

    InputMultiplexer multiplexer = new InputMultiplexer(button, this);
    multiplexer.addProcessor(button);
    multiplexer.addProcessor(this);
    Gdx.input.setInputProcessor(multiplexer);

}

相机运动发生在 " @Override touchDragged" 东西中。我想我不必在这里展示它。

我现在正在尝试实现这些按钮两天,但我无法让它们工作。问题就在底部:

InputMultiplexer multiplexer = new InputMultiplexer(this, button);       
Gdx.input.setInputProcessor(multiplexer);

按照这个顺序,我可以移动相机,但我不能触摸按钮。如果我写(...)(button, this);,我不能再移动相机,但可以点击按钮。当我单击屏幕上的任意位置时,我也可以激活按钮的功能。

希望你能帮我解决这个问题!

标签: javaandroidlibgdx

解决方案


根据LibGDX Wiki on Event-Handling with InputMultiplexer

InputMultiplexer 会将任何新事件交给添加到它的第一个 InputProcessor。如果该处理器从为处理事件而调用的方法返回 false,这表明该事件未被处理,并且多路复用器将把该事件交给链中的下一个处理器。通过这种机制,MyUiInputProcessor 可以处理属于其一个小部件的任何事件,并将任何其他事件传递给 MyGameInputProcessor。

可以通过将 InputAdapters 子类中覆盖方法的返回值设置为 false 来解决您的问题,这是一个示例:

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    [Some Logic]
    return false; // Input has not been processed, next processor in the multiplexer will try to handle this
}

推荐阅读