我已经完成了很好的教程,该教程创建了一个简单的 libgdx 游戏,在桶中捕捉雨滴。我想了解更多关于使用图像的知识,所以我尝试用婴儿代替雨滴。
当我尝试加载 baby.png 时,我收到以下错误:
com.badlogic.gdx.utils.GdxRuntimeException: Texture width and height must be
powers of two: 60x83
如何加载我想要的任何大小的图像?
在加载图像之前写..
Texture.setEnforcePotImages(false);
您可以在应用程序侦听器的创建功能中执行此操作,如果您不想创建纹理图集,这是最简单的方法
您也可以将图片(左上角)放入 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);
一点阅读使我了解了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
}
}