我已经通过nice tutorial创建了一个简单的libgdx游戏,可以在雨桶中捕捉雨滴。我想了解更多关于使用图像的信息,所以我尝试用婴儿替换雨滴。
当我尝试加载baby.png时,我收到以下错误:
com.badlogic.gdx.utils.GdxRuntimeException: Texture width and height must be
powers of two: 60x83
如何加载我想要的任何尺寸的图像?
答案 0 :(得分:5)
写..
Texture.setEnforcePotImages(false);
您可以在创建应用程序列表器功能时执行此操作如果您不想创建纹理图集,这是最简单的方法
答案 1 :(得分:0)
一点点的阅读让我得到了TextureAtlas and TexturePacker的描述,它将一堆小图像合并为一个大图像。这使得它们加载和绘制更快。如Vikalp says,如果您不关心性能差异,也可以禁用有关图像大小的规则。
Texture.setEnforcePotImages(false);
您可以在Udacity's HTML5 game class了解有关游戏地图集的更多信息。
要创建自己的地图集,可以先使用TexturePacker GUI,但我建议最终创建一个命令行项目来自动打包原始图像。
我发布了一个example project,它从存储桶和雨滴教程中获取示例代码,然后切换到使用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
}
}
答案 2 :(得分:0)
您还可以将图片(左上角)放入128x128纹理中: Afaik使用非二次幂的纹理更慢并且需要更多VRAM。由于GPU的架构和OpenGL中纹理绑定的“慢速”处理,我们总是建议将同时使用的图像放入一个大的pow-two纹理中并抓住它们作为此纹理的区域以加速你的应用程序。 使用和抓取您的纹理看起来像:
Texture texture = Gdx.files.internal("data/yourtexture.png");
TextureRegion region = new TextureRegion(texture, 0, 0, 60, 83);
用于绘制这样的东西:
batch.draw(region, positionX, positionY);