使用libgdx在Android应用中加载图像

3
我已经学习了一个通过捕捉桶中雨滴创建简单的libgdx游戏的好教程。我想学习更多关于使用图像的知识,所以我试着用一个婴儿代替了雨滴。

Cute Baby!

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

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

如何加载任意大小的图像?
3个回答

5
在加载图片之前,先编写以下代码..
Texture.setEnforcePotImages(false); 

如果您不想创建纹理图集,那么在应用程序监听器的create函数中完成此操作是最简单的方法。


这是一个很好的快捷方式,谢谢。当然,使用纹理图集也有性能上的好处。 - Don Kirkby
1
@DonKirkby 嗨,纹理图集有很多好处,但有时候这也很方便...我们可以使用它来代替为单个图像制作纹理图集。 - Vikalp Jain

0
一些阅读引导我了解了TextureAtlas 和 TexturePacker的描述,它们将一堆小图像组合成一个大图像。这使得它们更快地加载和绘制。正如Vikalp所说的那样, 如果您不关心性能差异,您也可以禁用有关图像尺寸的规则。
Texture.setEnforcePotImages(false); 

您可以在Udacity的HTML5游戏课程中了解更多关于游戏图集(game atlases)的知识。

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

我发布了一个示例项目,它使用了Bucket和Raindrop教程的示例代码,并转而使用了TextureAtlas。现在,我先装载图集,然后再从图集装载图片。

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

我发现一个问题是在HTML项目中图片无法加载。后来我发现可以通过将所有图片放入子文件夹来解决这个问题。

我创建了一个新项目来保存TexturePacker和之后想要添加的任何单元测试。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
    }
}

0
你也可以将图片(左上角)放入一个128x128的纹理中: 据我所知,使用非二次幂纹理会更慢,占用更多VRAM。由于GPU的架构和OpenGL中纹理绑定的“缓慢”处理,建议将同时使用的图像放入一个大的二次幂纹理中,并将它们作为该纹理的区域来加速应用程序。 使用和获取纹理的方法如下:
Texture texture = Gdx.files.internal("data/yourtexture.png");
TextureRegion region = new TextureRegion(texture, 0, 0, 60, 83);

用于绘制类似以下内容的代码:

batch.draw(region, positionX, positionY);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接