3

我已经完成了很好的教程,该教程创建了一个简单的 libgdx 游戏,在桶中捕捉雨滴。我想了解更多关于使用图像的知识,所以我尝试用婴儿代替雨滴。

可爱的宝宝!

当我尝试加载 baby.png 时,我收到以下错误:

com.badlogic.gdx.utils.GdxRuntimeException: Texture width and height must be 
powers of two: 60x83

如何加载我想要的任何大小的图像?

4

3 回答 3

5

在加载图像之前写..

Texture.setEnforcePotImages(false); 

您可以在应用程序侦听器的创建功能中执行此操作,如果您不想创建纹理图集,这是最简单的方法

于 2013-08-30T05:20:58.800 回答
0

您也可以将图片(左上角)放入 128x128 纹理中:Afaik 使用非二次幂纹理更慢,并且占用更多 VRAM。由于 GPU 的架构和 OpenGL 中对纹理绑定的“缓慢”处理,始终建议将同时使用的图像放入一个大的 pow-2 纹理中,并将它们作为该纹理的区域抓取,以加快您的速度。应用程序。纹理的使用和抓取如下所示:

Texture texture = Gdx.files.internal("data/yourtexture.png");
TextureRegion region = new TextureRegion(texture, 0, 0, 60, 83);

绘制这样的东西:

batch.draw(region, positionX, positionY);
于 2013-08-30T08:20:11.897 回答
0

一点阅读使我了解了TextureAtlas 和 TexturePacker的描述,它们将一堆小图像组合成一个大图像。这使它们更快地加载和绘制。正如Vikalp 所说,如果您不关心性能差异,也可以禁用有关图像大小的规则。

Texture.setEnforcePotImages(false); 

您可以在Udacity 的 HTML5 游戏课程中了解有关游戏图集的更多信息。

要创建自己的图集,可以从使用TexturePacker GUI开始,但我建议最终创建一个命令行项目来自动打包原始图像。

我发布了一个示例项目,该项目从桶和雨滴教程中获取示例代码,并切换到使用 TextureAtlas。现在,我加载图集,然后从图集中加载图像。

atlas = new TextureAtlas(Gdx.files.internal("atlas/plank.pack"));
dropImage = atlas.findRegion("images/baby");
bucketImage = atlas.findRegion("images/bucket");

我发现的一个错误是图像不会加载到 HTML 项目中。我发现您可以通过将所有图像放在子文件夹中来解决该错误。

我创建了一个新项目来保存 TexturePacker 和以后要添加的任何单元测试。纹理打包器如下所示:

package com.github.donkirkby.plank;

import com.badlogic.gdx.tools.imagepacker.TexturePacker2;

public class PlankPacker {
    public static void main (String[] args) throws Exception {
        TexturePacker2.process(
                "raw-assets",  // source folder
                "../plank-game-android/assets/atlas", // destination
                "plank.pack"); // data file
    }
}
于 2013-08-30T05:13:25.620 回答