​

前言

在前面五章中 我们完整介绍了如何搭建libGDX开发环境和如何运行项目,以及项目中的模块作用。又通过加载资源篇、图形渲染篇和屏幕触摸、鼠标及键盘监听实现精灵移动,基本上涵盖了libGDX资源管理、图形渲染、音效播放以及屏幕触摸、鼠标及键盘等输入设备监听相关的api内容,大家已经基本了解如何使用libGDX开发个简单的小游戏了。

那么在本章中,我们将扩展之前文章中制作的简单游戏“Drop” 。给这个小游戏添加一个菜单屏幕和一些功能,以使这款游戏的功能更加全面。

当然了,扩展的过程中也会涉及一些 libGDX 中更高级的api。

Screen接口

屏幕是任何具有图形界面游戏的基础。Screens 包含许多从 ApplicationListener 对象使用的方法,并包括几个新方法:show和hide,它们分别在 Screen 获得或失去焦点时调用。屏幕负责处理(即处理和渲染)游戏的菜单屏幕、设置屏幕、游戏屏幕等。

游戏入口类实现

Game 类负责处理多个屏幕并为此提供一些辅助方法,以及可供使用的 ApplicationListener 的实现。Screen 和 Game 对象一起用于为游戏创建简单且强大的基础结构。

我们从创建一个 Game 对象开始,它的create()方法就是我们游戏的入口。见下面这段代码:

package com.badlogic.drop;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Drop extends Game {

public SpriteBatch batch;
public BitmapFont font;

public void create() {
batch = new SpriteBatch();
font = new BitmapFont(); // use libGDX's default Arial font
this.setScreen(new MainMenuScreen(this));
}

public void render() {
super.render(); // important!
}

public void dispose() {
batch.dispose();
font.dispose();
}

}

我们通过实例化 SpriteBatch 和 BitmapFont 来启动应用程序。创建多个可以共享的对象是一种不好的做法。SpriteBatch 对象用于将对象渲染到屏幕上(例如纹理);并且 BitmapFont 对象与 SpriteBatch 一起用于将文本展现到屏幕上。

接下来,我们将游戏的屏幕设置为一个MainMenuScreen对象,并将 Drop 实例作为其第一个也是唯一的参数。

一个常见的错误:如果忘记调用Game的super.render()实现。如果没有调用create()这个方法,则Game 类中设置的 Screen屏幕将不会被渲染!

构建主菜单屏幕

package com.badlogic.drop;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.OrthographicCamera;

public class MainMenuScreen implements Screen {

final Drop game;

OrthographicCamera camera;

public MainMenuScreen(final Drop game) {
this.game = game;

camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);
}

//...Rest of class omitted for succinctness.
}

在此代码片段中,我们为MainMenuScreen实现 Screen 接口,并且创建了构造函数。Screen 接口不提供任何类型的create()方法,因此我们使用构造函数来创建。游戏所需的构造函数的唯一参数是Drop实例,以便我们可以在需要的时候调用这个方法和字段。

渲染主菜单界面

下面,让我们最后再实现一下MainMenuScreen中的render(float)方法:

public class MainMenuScreen implements Screen {
final Drop game;

OrthographicCamera camera;

public MainMenuScreen(final Drop game) {
this.game = game;

camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);
}

@Override
public void render(float delta) {
ScreenUtils.clear(0, 0, 0.2f, 1);

camera.update();
game.batch.setProjectionMatrix(camera.combined);

game.batch.begin();
game.font.draw(game.batch, "Welcome to Drop!!! ", 100, 150);
game.font.draw(game.batch, "Tap anywhere to begin!", 100, 100);
game.batch.end();

if (Gdx.input.isTouched()) {
game.setScreen(new GameScreen(game));
dispose();
}
}

// Rest of class still omitted...
}

这里的代码很简单,通过调用游戏的 SpriteBatch 和 BitmapFont 来实现将文本渲染到屏幕的方式game.font.draw(SpriteBatch, String, float, float)。libGDX 带有预制字体: Arial,因此我们使用默认构造函数就可以使用字体。

然后我们检查屏幕是否被触摸,如果有,将游戏屏幕设置为一个 GameScreen 实例,然后处理 MainMenuScreen 的当前实例。MainMenuScreen 中需要实现的其余方法留空,因此我将继续省略它们(该类中没有任何可处理的内容)。

结语

到这里为止,我们已经完善了游戏的入口并增加了一个主菜单界面,那么下一章,我们将本章与游戏整合起来形成带有完整操作流程看起来像那么回事的小游戏。

如果觉得博主写的还不错,欢迎“关注、收藏、点赞”一键三连!