libGDX游戏开发之画面场景和画面自适应(二)

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/

posted @ 2022-09-16 00:08  凌康  阅读(134)  评论(0编辑  收藏  举报