java - 实施图像按钮后相机不再工作 - 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);
,我不能再移动相机,但可以点击按钮。当我单击屏幕上的任意位置时,我也可以激活按钮的功能。
希望你能帮我解决这个问题!
解决方案
根据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
}
推荐阅读
- c++ - OpenMP 4.5 不会使用 target 指令卸载到 GPU
- arrays - 在 Swift 中创建具有两种变量类型的二维数组
- react-native - Flatlist 不会滚动;用额外空间渲染的单元格
- arrays - 返回 false 或数组的方法仅测试为 false 或 true
- java - Java Util 可选代码到 Guava 可选映射和过滤器
- angular - 使用 Angular 7 中的标头重定向到外部 url
- excel - TEXTJOIN 输出的逆序
- view - SwiftUI 中的条件视图无法编译
- javascript - Three.js - 最后一堆点没有被渲染
- java - 为什么将 0112 转换为 74?