更改屏幕 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,以防您同时需要多个输入处理器。
文档:
只是想知道您如何在 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,以防您同时需要多个输入处理器。
文档: