Libgdx |如何创建启动画面?

Libgdx | How to create a splash screen?

我想知道创建启动画面的最佳方法是什么(当您开始游戏时,公司徽标会动画化)。我在 After Effects 中创建了一个 .mp4 启动画面,但找不到在 libgdx 中显示它的方法。创建启动画面的最佳方法是什么?您可以使用 .mp4 文件并播放吗?

有一种非常简单的方法可以在不创建新 activity 的情况下实现启动画面。为您的启动画面设置时间的方法是从您的应用程序首次启动(在create())方法中的时间到当前时间。直接在 class:

中声明开始时间变量
long startTime;

您可以使用 TimeUtils.millis() 获取经过的时间。将此代码放入您的 create() 方法中,如下所示:

@Override
public void create() {
    // Initialize all your other variables here
    startTime = TimeUtils.millis();
}

然后在您的 render() 方法(一直是 运行)中,添加代码以检查经过的时间。这是一个例子:

@Override
public void render() {
    if(TimeUtils.millis() - startTime != 10000) {
        // 10 seconds haven't passed yet
        batch.begin();
        // Creates a white background
        Gdx.gl.glClearColor(1f, 1f, 1f, 1);
        // Draw your animation here
        batch.end();
    } else {
        // Put real game code here
    }
}

上面的代码基本上是检查 10 秒是否过去了。如果是这样,它会显示您的动画。如果没有,请在屏幕加载后放置所有常规代码。

不幸的是,没有直接的方法在 Libgdx 中显示 .mp4 文件。这可能是您的应用程序的问题。一种解决方案是使用 this website. You can then extract all those frames to many image files using this .gif 拆分器将 .mp4 文件转换为 .gif(动画图像文件)。如果您有其他方法从视频中提取帧,请使用该方法。一旦你这样做了,循环遍历所有这些图像来创建你的动画。以下是您可以执行的操作:

Texture[] textures = new Texture[NUMBER_OF_FRAMES];
for(Texture t : textures) {
    batch.draw(t,
            Gdx.graphics.getWidth() / 2 - t.getWidth()/2,
            Gdx.graphics.getHeight() / 2 - t.getHeight()/2);
}

当然,您始终可以只使用一张静态图像,这样更容易显示,并将其放入您的 render() 方法中。不管你的方法如何,希望这个答案对你有所帮助!

我不得不说@AkashBhave 接受的答案是制作启动画面的一种非常奇怪的方式,可能不应该被接受为 "best" 的方式。启动画面的目的是在游戏或应用程序在后台加载时临时显示一些内容。如果您有大量资产要加载,您可能需要最多 10 秒的时间来在慢速设备上准备应用程序。接受的答案完全没有提到异步加载资产,并且考虑到在继续 "game code" 之前只有一个简单的计数器,可以假设这个闪屏只会在所有内容都已经加载后显示,否则会有不能保证资产已加载,否则它只会崩溃。

我个人认为"best"制作启动画面的方法是让它显示得尽可能快,最好在点击应用程序打开它时少于一秒钟。这样做的方法是使用 AssetManager 仅加载显示启动画面所需的 Asset。然后,当您的初始屏幕为 displaying/animating 时,您告诉 AssetManager 加载其余的核心组件。完成后,您将继续您的主应用程序。

我发布了一个答案,其中包含与此相关的更多详细信息here, and there is a pretty good in-depth guide on the AssetManager on the libGDX Wiki

所以,这里的关键是 assetManager.update(),它做了两件事。 1,它告诉 AssetManager 加载 .load() 项的队列,以及 2,它 returns true 如果它已经完成。因此,如果您还想确保启动画面显示一定时间,您可以这样做;

public void render(float delta){
    //code to render splash here

    //check if assets are loaded and time greater than 10 seconds
    if(assetManager.update() && TimeUtils.timeSinceMillis(startTime) > 10000){
        app.setScreen(new MainScreen());
    }
}

或者,如果你确实有 libGDX Animation,你会做类似的事情;

 if(assetManager.update() && animation.isAnimationFinished(startTime)){..}