我是 LibGDX 的初学者,目前我们 4 人一组制作跳棋游戏。这是学校的一个项目。 我们阻止了棋子的移动,但这不是问题。 我们有一个架构 MVC。 在游戏屏幕上,我们有一个带有棋子的棋盘游戏。我们无法显示棋子,而在其他屏幕上这很容易。 我可以让它出现在游戏板上,但它不可点击。当我添加
stage.getViewport().update(宽度,高度,true)
该按钮出现在游戏板之外,但不可点击,并且游戏板已缩放。
这是一个link各个类别的
问题出在 GameScreen
类上。当我单击位于类 JouerIA
或 JouerJueur
上的播放时,我会执行 setScreen(GameScreen)
。
所以我只在此处粘贴 GameScreen
和 GameRenderer
。如果您需要更多代码来帮助我,我可以粘贴更多。
这是没有添加不同按钮的代码。
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();
}
}
最佳答案
欢迎来到 Stack Overflow!
简短的回答是您多次重置输入处理器,因此它不会从舞台获取输入。 Gdx.input.setInputProcessor()
一次只能处理一个输入处理器。如果您需要从多个源收集输入,您需要创建一个 [InputMultiplexer][1]
类,为其提供所有输入处理器(即 stage、GestureDetector 等),然后传递 InputMultiplexer
到 Gdx.input.setInputProcessor()
- 您可以在 libGDX wiki 上找到更多信息.
现在,如果您允许我批评您的表格,您可能还需要考虑其他一些事情:
首先:我是一个普通的 MVC 粉丝,但我建议,如果您将 GameScreen.java 类视为您的 View (毕竟,屏幕就是一个 View ),您可能会省去一些麻烦。然后可以将渲染代码放入 Screen 的 render() 方法中,并避免创建单独的 GameRenderer 类。在我的游戏中,我将所有设置代码都放在 Controller 中(想想应用程序 Controller ,而不是游戏板 Controller 或键盘 Controller ),然后每个屏幕都会获得对 Controller 和模型的引用。
第二:在渲染器中(如果您选择保留它),您需要避免在渲染方法中实例化新对象。在上面的代码中:
@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
对象 - 可能每秒60次!我强烈建议将这些代码行移至 show() 方法中,以便实例化仅完成一次。
希望这会有所帮助 - 如果您需要进一步说明,请告诉我。
关于java - 显示按钮 libgdx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41285202/