从texturepacker的纹理在LibGDX

use*_*458 4 java android textures libgdx texturepacker

尝试在(令人敬畏的)LibGDX框架中了解纹理包装,我需要帮助.

我想绑定一个纹理(根据网格,颜色和纹理),该纹理是从TexturePacker打包的TextureAtlas中提取的.纹理绑定到矩形网格.

我希望纹理(纹理的实例)基本上从打包文件中提取.

是否可以使用createsprite或findregion方法并以某种方式跳过文件句柄步骤?

另外:将上述方法与AssetManager结合使用时,应该记住哪些特殊内容?

谢谢你把我排除在外!

P.T*_*.T. 10

创建TextureRegion

首先,TextureAtlas通过指向描述图集的文本文件来创建对象(创建图集的工具将创建两个文件:图像和描述其内容的文本文件):

TextureAtlas myTextures = new TextureAtlas("images/packed.txt");
Run Code Online (Sandbox Code Playgroud)

然后你可以查看TextureRegion该地图集(即地图集的特定子纹理).该区域应该具有所使用的原始文件的基本名称(如果您遵循一些特殊的命名约定来创建纹理元素数组,则有更多细节和选项,但现在暂时关闭它):

TextureRegion region = myTextures.findRegion(fname);
Run Code Online (Sandbox Code Playgroud)

配置纹理网格

要在网格上绘制此纹理区域,您需要初始化Mesh对纹理坐标的支持:

Mesh myMesh = new Mesh(...,
                       new VertexAttribute(Usage.TextureCoordinates, 2, "y"));
Run Code Online (Sandbox Code Playgroud)

new VertexAttribute(Usage.TextureCoordinates, 2, ...)告诉libGDX,这个网格将有每个顶点的两个纹理坐标(传统上,这两个纹理坐标被称为uv).每个顶点可以有一堆不同的属性,但我将假设唯一的其他属性是Usage.Positionx,y,z空间坐标的3值.

现在,在定义网格(您传递给的数组)的浮点数组中,setVertices您需要设置x,y和z空间坐标加上u和每个顶点的v纹理坐标:

final int floatsPerVertex = 5; // 3 spatial +  2 texture
float[] meshData = new float[numVerticies * floatsPerVertex];
for (int i = 0; i < numVerticies; i++) {
   meshData[(i * floatsPerVertex) + 0] = ... ; // x coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 1] = ... ; // y coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 2] = ... ; // z coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 3] = ... ; // u texture coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 4] = ... ; // v texture coordinate of i'th vertex
}
myMesh.setVertices(meshData);
Run Code Online (Sandbox Code Playgroud)

你可以计算出正确的uv特定TextureRegion使用getU,getV,getU2,和getV2方法.请注意,纹理坐标在左上角有原点(u1,v1),y轴在"向下"点(OpenGL中的屏幕和空间坐标通常在左下角和y轴点有原点)上").它有点复杂,但非常灵活,因为它可以在纹理映射到网格上时翻转或拉伸或扭曲纹理.

由于纹理很大(例如512x512)并且特定区域是其中的一小部分(例如,在128x128处为20x20),实际上最终会给出网格纹理坐标,其仅利用整个512x512图像的20x20子集.

渲染纹理网格

最后,渲染时需要绑定图像,并在渲染之前启用纹理:

region.getTexture().bind();
Gdx.graphics.getGL10().glEnable(GL10.GL_TEXTURE_2D);
myMesh.render();
Gdx.graphics.getGL10().glDisable(GL10.GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

请注意,这比它应该效率低得多.纹理图集的部分好处是它应该包含许多可以一起渲染的区域,因此您只需要绑定一个纹理,然后从该一个绑定纹理渲染许多不同的纹理网格.

SpriteBatch支持用a定义的sprite,TextureRegionAssetManager支持加载和查找TextureAtlas作为第一类元素.