我是LibGDX的初学者,我们目前以4人为一组制作Checkers游戏。这是一个学校的项目。 我们阻止了棋子的移动,但这不是问题。 我们有一个架构MVC。 在游戏屏幕上,我们有一个棋子的棋盘游戏。我们无法显示一个棋子,而在其他屏幕上则很容易。 我可以让它出现在游戏板上,但它不可点击。当我添加
stage.getViewport ().update (width, height, true)
按钮出现在游戏板外但不可点击,游戏板也会缩放。
这是各种类的link
问题出在班级GameScreen
上。当我点击位于课程JouerIA
或JouerJoueur
的游戏时,我会执行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();
}
}
答案 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()方法中,以便只进行一次实例化。
希望这有帮助 - 如果您需要进一步澄清,请告诉我。