这是我的代码
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.viewport.FitViewport;
public class MainMenuScreen extends SpaceInvaderScreen {
SpriteBatch batch;
TextureRegion background;
Stage stage;
TextButton playbutton;
float time = 0;
public MainMenuScreen(Game game){
super(game);
}
@Override
public void show(){
batch = new SpriteBatch();
batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
background = new TextureRegion(new Texture("data/cool.jpg"), 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
stage = new Stage(new FitViewport(1280, 1080));
Skin uiskin = new Skin(Gdx.files.internal("data/skin/uiskin.json"));
playbutton = new TextButton("Play", uiskin);
playbutton.setWidth(200);
playbutton.setHeight(100);
playbutton.setPosition(980, 620);
playbutton.setBounds(playbutton.getX(), playbutton.getY(), playbutton.getWidth(), playbutton.getHeight());
playbutton.addListener( new ClickListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
game.setScreen( new GameScreen(game));
return true;
};
});
stage.addActor(playbutton);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0.15f, 0.15f, 0.2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(background, 0, 0);
batch.end();
stage.act();
stage.draw();
time += delta;
}
@Override
public void hide(){
batch.dispose();
background.getTexture().dispose();
}
}
我不确定clicklistener为什么不能正常工作。我也尝试过使用touchDown方法,但它也不起作用。对不起,如果这听起来像一个愚蠢的问题,我对图书馆来说相当新鲜
答案 0 :(得分:0)
只需要尝试两件事:我可以看到你在show方法中构建了按钮。为什么?在显示任何内容之前,拥有一个设置方法并构建应用程序/游戏/整个布局的设置方法更有意义。但这只是一个黑暗的镜头,我不知道你正在使用的这个框架,我可能是非常错误的。
当您保留同一游戏的多个实例时,另一件可能会导致问题的事情!注意一次只构建一次游戏,然后传递那个单一的实例。为什么这很重要?因为可能存在您正在调用game.setScreen( new GameScreen(game));
但是在错误的实例上的情况!
请发布您的SpaceInvaderScreen
,以便调试它可能更容易。
无论如何,您是否尝试过调试touchDown
方法?它完全被召唤了吗?
还有两件事:ClickListener
是一个类。不是界面。因此,当您重写touchDown
方法时,您基本上绕过了超类中的父代码。
尝试调用作为触地得分方法的第一行:
super.touchDown(event, x, y, pointer, button);
ClickListener文档也说:
当返回true时,处理事件(...)这不会影响 在scene2d中传播事件,但会导致Stage事件方法 返回true,这将吃掉事件所以它不会被传递给 在舞台上申请。
所以你应该尝试返回false;