libGDX游戏开发之画面场景切换(二)
libGDX系列
,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm…国内用libgdx比较少,多数情况需要去官网和google找资料,相互学习的可以加我联系方式,仅限学习。
游戏开发需要切换各种场景,例如开始画面、游戏画面、gameover画面。
libGDX的字体样式默认不支持中文,需要自己创建。
Hiero工具下载地址:https://hub.fastgit.org/libgdx/libgdx/wiki/Hiero
创建游戏
import com.badlogic.gdx.Game;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
/**
* @author lingkang
* @date 2021/10/4 15:34
* @description 创建一个游戏 作为起点
*/
public class MyGame extends Game {
// 用于屏幕自适应的长宽
public static final int VIEW_WIDTH = 624;
public static final int VIEW_HEIGHT = 624;
// 用于此game特有,方便game回收管理
public SpriteBatch batch;
public BitmapFont font;
@Override
public void create() {
//游戏创建的一些准备放这里...
batch = new SpriteBatch();
font = new BitmapFont();
font.setColor(Color.RED);
// 进入欢迎页面
setScreen(new WelcomeScreen(this));
}
// 其他的一些方法
@Override
public void dispose() {
super.dispose();
// 防止内存泄露
batch.dispose();
font.dispose();
}
}
创建欢迎画面
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
/**
* @author lingkang
* @date 2021/10/4 15:35
* @description 欢迎页面
*/
public class WelcomeScreen implements Screen {
// 将游戏对象传入
private MyGame game;
// 画面自适应
private Viewport viewport;
// 类似 javafx 的 Stage 我们绘制的画面在它上面
private Stage stage;
public WelcomeScreen(MyGame game) {
this.game = game;
viewport = new FitViewport(MyGame.VIEW_WIDTH, MyGame.VIEW_HEIGHT, new OrthographicCamera());
// 下面我们用 Stage 固定方式绘制画面
stage = new Stage(viewport, game.batch);
// 字体样式 默认不支持中文,下面我就用英文了 https://hub.fastgit.org/libgdx/libgdx/wiki/Hiero
Label.LabelStyle font = new Label.LabelStyle(new BitmapFont(), Color.WHITE);
// 创建一个表格
Table table = new Table();
table.center();
table.setFillParent(true);
table.add(new Label("welcome", font)).expandX();
table.row();
table.add(new Label("Any click join game", font)).expandX().padTop(10f);
stage.addActor(table);
// 不同页面的帧率不同,有利于性能优化
Gdx.graphics.setForegroundFPS(3);
}
@Override
public void show() {
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// 使用类似 javafx 的绘制方式
stage.draw();
if (Gdx.input.isTouched()) {
game.setScreen(new GameScreen(game));
dispose();
}
}
// 其他实现方法
}
游戏战斗画面
/**
* @author lingkang
* @date 2021/10/4 17:20
* @description
*/
public class GameScreen implements Screen {
// 将游戏对象传入 方便操作
private MyGame game;
public GameScreen(MyGame game) {
this.game = game;
// 不同页面的帧率不同,有利于性能优化,这是游戏战斗页面,帧率调高
Gdx.graphics.setForegroundFPS(38);
}
@Override
public void show() {
}
@Override
public void render(float delta) {
ScreenUtils.clear(225, 225, 225, 1);
game.batch.begin();
game.font.draw(game.batch, "Welcome to Game Screen!!! ", 100, 150);
game.font.draw(game.batch, "Any click to game over", 100, 100);
game.batch.end();
if (Gdx.input.isTouched()) {
game.setScreen(new GameOverScreen(game));
dispose();
}
}
// 其他实现方法
}
游戏结束画面
/**
* @author lingkang
* @date 2021/10/4 17:20
* @description
*/
public class GameOverScreen implements Screen {
// 将游戏对象传入 方便操作
private MyGame game;
public GameOverScreen(MyGame game) {
this.game = game;
// 不同页面的帧率不同,有利于性能优化
Gdx.graphics.setForegroundFPS(3);
}
@Override
public void show() {
}
@Override
public void render(float delta) {
ScreenUtils.clear(225, 225, 225, 1);
game.batch.begin();
game.font.draw(game.batch, "Welcome to Game Over Screen!!! ", 100, 150);
game.font.draw(game.batch, "Any click to Welcome Screen", 100, 100);
game.batch.end();
if (Gdx.input.isTouched()) {
game.setScreen(new WelcomeScreen(game));
dispose();
}
}
}
效果如下:
层级区分官网也有例子:
https://libgdx.com/dev/simple-game-extended/