我想知道创建启动画面的最佳方法是什么(当你开始游戏时,公司徽标动画)。我在后效果中创建了一个.mp4启动画面,但无法找到在libgdx中显示它的方法。创建启动画面的最佳方法是什么?你可以使用.mp4文件并播放它吗?
答案 0 :(得分:6)
我不得不说@AkashBhave接受的答案是一种非常奇怪的制作闪屏的方式,并且可能不应该被接受为“最佳”方式。启动画面的目的是在游戏或应用程序在后台加载时暂时显示某些内容。如果您要加载大量资产,则可能需要长达10秒的时间才能在慢速设备上准备应用程序。接受的答案绝对没有提到异步加载资产,并且假设在继续使用“游戏代码”之前只有一个简单的计数器,可以假设这个启动画面只会在所有内容都已加载后显示,否则会出现不保证资产被加载,如果没有,它就会崩溃。
就我个人而言,我认为制作启动画面的“最佳”方式是尽可能快地显示,当点击应用程序打开它时,最好不到一秒钟。这样做的方法是使用AssetManager
仅加载显示启动画面所需的Asset
。然后,当您的启动画面显示/动画时,您告诉AssetManager
加载其余的核心组件。完成后,您将继续使用主应用程序。
我发布了一个答案,其中包含与此here相关的更多详细信息,并且libGDX Wiki上的AssetManager
提供了非常好的深入指南。
所以,这里的关键是assetManager.update()
,这有两件事。 1,它告诉AssetManager
加载.load()
项的队列,2,如果它已经完成则返回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)){..}
答案 1 :(得分:0)
有一种非常简单的方法可以在不创建新活动的情况下实现启动画面。为启动屏幕设置时间的方法是从首次启动(使用create()
)方法到当前时间的差异。直接在您的类中声明一个开始时间变量:
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网站将.mp4文件转换为.gif(动画图像文件)。然后,您可以使用this .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()
方法中。无论你的方法如何,希望这个答案有所帮助!