【问题标题】:Display button libgdx显示按钮 libgdx
【发布时间】:2016-12-22 14:17:47
【问题描述】:

我是 LibGDX 的初学者,我们目前以 4 人一组的方式制作跳棋游戏。这是学校的项目。 我们阻止了棋子的移动,但这不是问题。 我们有一个架构 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();
    }

}

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    欢迎来到 Stack Overflow!

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

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

    首先:我是 MVC 的忠实拥护者,但如果您将 GameScreen.java 类视为您的视图(毕竟,屏幕就是视图),我建议您可能会省去一些麻烦——您然后可以将渲染代码放入 Screen 的 render() 方法中,避免创建单独的 GameRenderer 类。在我的游戏中,我的所有设置代码都在控制器中(想想应用程序控制器,而不是游戏手柄控制器或键盘控制器),然后每个屏幕都获得对控制器和模型的引用。

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

    @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)));
    }
    

    这将在每次调用 render() 时创建一个新的 Plateau 对象、一个新的 GextureDetector 和一个新的 ControlPlateau 对象——可能每秒 6​​0 次!我强烈建议将这些代码行移到 show() 方法中,以便您的实例化只完成一次。

    希望对您有所帮助 - 如果您需要进一步说明,请告诉我。

    【讨论】:

    • 感谢您的回答!也许如果我们有时间(因为我们真的迟到了),我会修改你批评的内容。我有另一个问题。如果我选择保留渲染器,我必须将带有 InputMultiplexer 的按钮放在渲染器或 GameScreen 中?
    • 几乎-您将按钮放在舞台中,并将舞台放在 InputMultiplexer 中。您将在 GameScreen 中进行此映射。
    • 它不起作用。 :'( 对不起,我是法国人,不太擅长 libgdx。如果更简单,我可以直接将我的代码发送给您,以便您告诉我并解释问题。
    • 我又试了一次,我得到了: 没有修改的游戏:link 带有输入多路复用器的游戏:link 我们有按钮,但不能点击,棋盘更大
    • 单独的 InputMultiplexer 不会改变事物的呈现方式——它必须是您所做的其他更改之一。您的代码在某处在线吗?我不确定 StackOverflow 是否真的适合这种类型的讨论。
    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多