我能够绘制我的按钮,但是当我点击/"触摸" 没有任何反应他们,我不知道我做错了什么。有人可以帮忙吗?不应该将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);
}
答案 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)
我看到一些问题。
你在舞台上有一个舞台。内层有你的按钮,但它没有设置为输入处理器。移除内部舞台并直接使用外部舞台。或者,如果您尝试在此处组织代码,请使您的MainMenuButtons类不扩展Stage(并为其提供getStage()
方法,以便游戏类可以调用act
和{ {1}}就可以了。
您永远不会在舞台上致电draw
,因此不会对任何事情做出回应或采取任何行动。
您的MMButton类包含一个永远不会添加到舞台的内部Button实例,因此内部Button永远不会接收触摸事件,即使它有一个侦听器。您可以使MMButton类扩展Group而不是Actor,并通过act
将内部Button添加到它。但我认为你在这里重新发明轮子。当您可以直接使用现有的TextButton类时,您不需要MMButton类 - 它本身就是Actor。从我所看到的,MMButton是一个冗余的包装器。
旁注:不建议为每个按钮使用单独的纹理图集和字体。纹理图集旨在由许多对象共享以利用精灵批处理。