显示按钮libgdx

时间:2016-12-22 14:17:48

标签: java libgdx

我是LibGDX的初学者,我们目前以4人为一组制作Checkers游戏。这是一个学校的项目。 我们阻止了棋子的移动,但这不是问题。 我们有一个架构MVC。 在游戏屏幕上,我们有一个棋子的棋盘游戏。我们无法显示一个棋子,而在其他屏幕上则很容易。 我可以让它出现在游戏板上,但它不可点击。当我添加

stage.getViewport ().update (width, height, true)

按钮出现在游戏板外但不可点击,游戏板也会缩放。

这是各种类的link

问题出在班级GameScreen上。当我点击位于课程JouerIAJouerJoueur的游戏时,我会执行setScreen(GameScreen)

所以我只在此处粘贴GameScreenGameRenderer。如果您需要更多代码来帮助我,我可以粘贴更多。

以下是没有添加不同按钮的代码。

GameScreen.java

public class GameScreen implements Screen {

private GameRenderer renderer;
public static String couleur1, couleur2, nom1, nom2;
Stage stage;
Skin skinneon;
OrthographicCamera camera;
TextButton menu;


@Override
public void render(float delta) {

    this.renderer.render(delta);

}

@Override
public void resize(int width, int height) {

    this.renderer.setSize(width, height);

}

@Override
public void show() {
    Plateau plateau;
    ControlPlateau controller;

    Assets.loadGame();

    plateau = new Plateau();
    plateau.ajoutPions();
    controller = new ControlPlateau(plateau);

    this.renderer = new GameRenderer(plateau, controller);
    this.renderer.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());


}

@Override
public void hide() {
    this.renderer.dispose();
    Assets.disposeGame();
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public void dispose() {

}

}

GameRenderer.java

public class GameRenderer implements Renderer {

    private final Stage stage = new Stage(new FitViewport(10, 10));
    private Table hud;

    protected ControlPlateau controller;


    public GameRenderer(Plateau plateau, ControlPlateau controller) {



    Gdx.input.setInputProcessor(this.stage);
    this.stage.addActor(plateau);
    this.controller = controller;



        /*addListener(new InputListener() {
            public void actionPerformed(InputEvent event) {
               controller.tap();
            }
        });*/
        }

        @Override
        public void render(float delta) {
         Plateau plateau = new Plateau();

         Gdx.gl.glClearColor(.3f, .3f, .4f, 1);
         Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
         this.stage.draw();
         Gdx.input.setInputProcessor(stage);
         Gdx.input.setInputProcessor(new GestureDetector(new ControlPlateau(plateau)));
    }

    @Override
    public void setSize(int width, int height) {
        this.stage.getViewport().update(width, height, false);
        Gdx.graphics.requestRendering();
    }

    @Override
    public void dispose() {
        this.stage.dispose();
    }

}

1 个答案:

答案 0 :(得分:1)

欢迎使用Stack Overflow!

简短的回答是您正在多次重置输入处理器,因此它无法从舞台获得输入。 Gdx.input.setInputProcessor()一次只能处理一个输入处理器。如果你需要从多个来源收集输入,你想创建一个[InputMultiplexer][1]类,给它所有输入处理器(即阶段,GestureDetector等),然后将InputMultiplexer传递给{{1你可以在libGDX wiki上找到更多信息。

现在,如果您允许我批评您的表格,您可能还需要考虑其他一些事项:

首先:我是一个天气好的MVC粉丝,但如果你认为你的GameScreen.java类是你的View(毕竟,屏幕是一个视图),我建议你可以省去一些麻烦 - 你然后可以将渲染代码放入Screen的render()方法中,避免创建单独的GameRenderer类。在我的游戏中,我在Controller中设置了所有设置代码(想想app控制器,而不是游戏手柄控制器或键盘控制器),然后每个屏幕都会获得对Controller和Model的引用。

第二:在渲染器中(如果选择保留它),您将希望避免在渲染方法中实例化新对象。在上面的代码中:

Gdx.input.setInputProcessor()

每次调用render()时,这将创建一个新的@Override public void render(float delta) { Plateau plateau = new Plateau(); Gdx.gl.glClearColor(.3f, .3f, .4f, 1); Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT); this.stage.draw(); Gdx.input.setInputProcessor(stage); Gdx.input.setInputProcessor(new GestureDetector(new ControlPlateau(plateau))); } 对象,一个新的Plateau和一个新的GextureDetector对象 - 可能每秒60次!我强烈建议将这些代码行移动到show()方法中,以便只进行一次实例化。

希望这有帮助 - 如果您需要进一步澄清,请告诉我。