更改屏幕 libgdx,无法正常工作

Change screen libgdx, not working

只是想知道您如何在 libgdx 中更改屏幕(屏幕实现屏幕)。我尝试将其设置为在 phone 上的屏幕点击或在电脑中按下 space 时更改屏幕,但游戏根本没有任何响应。有什么想法吗?

游戏class:

package com.kapres.bounce;

import com.badlogic.gdx.Game;

/**
* Created by KnutAndre on 12/20/2016.
*/

public class BounceGame extends Game {
@Override
 public void create() {
    showMenuScreen();
 }

 public void showMenuScreen(){
    setScreen(new MenuScreen(this));
 }

 public void showGameScreen(){
    setScreen(new GameScreen());
 }
}

菜单屏幕:

package com.kapres.bounce;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.utils.viewport.FitViewport;

/**
* Created by KnutAndre on 12/26/2016.
*/

public class MenuScreen extends InputAdapter implements Screen {

BounceGame game;

ShapeRenderer renderer;
FitViewport menuViewport;

public MenuScreen(BounceGame game) {this.game = game;}

@Override
public void show() {
    renderer = new ShapeRenderer();
    menuViewport = new FitViewport(Constants.WORLD_WIDTH,   Constants.WORLD_HEIGTH);
    renderer.setAutoShapeType(true);
}

@Override
public void render(float delta) {
    menuViewport.apply(true);

    Gdx.gl.glClearColor(Constants.BACKGROUND_COLOR.r, Constants.BACKGROUND_COLOR.g, Constants.BACKGROUND_COLOR.b, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.setProjectionMatrix(menuViewport.getCamera().combined);

    renderer.begin();
    renderer.set(ShapeRenderer.ShapeType.Filled);
    renderer.setColor(Color.GREEN);
    renderer.circle(Constants.WORLD_WIDTH/2, Constants.WORLD_HEIGTH/2, Constants.START_BUTTON_RADIUS, 50);
    renderer.end();
}

@Override

public void resize(int width, int height) {
    menuViewport.update(width, height, true);
   // menuViewport.getCamera().position.set(Constants.WORLD_WIDTH/2, Constants.WORLD_HEIGTH/2);
}

@Override
public void pause() {

}

@Override
public void resume() {

}

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

@Override
public void dispose() {
    renderer.dispose();
}

@Override
public boolean keyDown(int keyCode) {
    if (keyCode == Input.Keys.SPACE){
        game.showGameScreen();
    }
    return true;
}

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button){
    game.showGameScreen();
    return true;
}

}

游戏画面:

package com.kapres.bounce;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.utils.viewport.FitViewport;


/**
* Created by KnutAndre on 12/20/2016.
*/

public class GameScreen implements Screen{

ShapeRenderer renderer;
FitViewport gameViewport;
Ball ball;

@Override
public void show() {
    renderer = new ShapeRenderer();
    renderer.setAutoShapeType(true);
    gameViewport = new FitViewport(Constants.WORLD_WIDTH, Constants.WORLD_HEIGTH);
    ball = new Ball(gameViewport);
    Gdx.input.setInputProcessor(ball);
}

@Override
public void render(float delta) {
    gameViewport.apply(true);

    Gdx.gl.glClearColor(Constants.BACKGROUND_COLOR.r, Constants.BACKGROUND_COLOR.g, Constants.BACKGROUND_COLOR.b, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.setProjectionMatrix(gameViewport.getCamera().combined);

    renderer.begin();
    ball.render(renderer, delta);
    renderer.end();
}

@Override
public void resize(int width, int height) {
    gameViewport.update(width, height, true);
    ball.init();
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    renderer.dispose();
}
}

不要忘记在 BounceGame class 的 render() 方法中调用 super.render()(它不会出现在您的代码片段中),例如:

@Override
public void render() {
    super.render();
    if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) {
        Gdx.app.exit();
    }
}

如果它不为 null(例如,之前调用了 setScreen(new MainScreen()) 方法),它会呈现屏幕。来自 superclass Game:

render() 方法
@Override
public void render () {
    if (screen != null) screen.render(Gdx.graphics.getDeltaTime());
}

您似乎忘记设置输入处理器

Gdx.input.setInputProcessor(var);

您应该在MenuScreen show() 方法中调用此方法。这样引擎就会知道你的输入处理器*。

代码如下所示:

public class MenuScreen extends InputAdapter implements Screen {

    ...

    @Override
    public void show() {
        Gdx.input.setInputProcessor(this);
        ...
    }

    ...
}

* InputAdapter 只是实现 InputProcessor 接口的 class。

还有一个名为 InputMultiplexer 的 class,以防您同时需要多个输入处理器。

文档:

InputProcessor

InputAdapter

InputMultiplexer