【发布时间】:2018-02-02 05:19:00
【问题描述】:
我正在尝试从 TextureAtlas 获取纹理区域,但作为 Texture。
我试过了:
textureAtlas.findRegion("explosion").getTexture();
但它返回整个纹理图集图像。
对于我创建的类似于 Sprite 的类,我需要这个。我避免使用 Sprite,因为它无法满足我的需求。
我找到的所有答案都是针对 Sprite 类的。
【问题讨论】:
我正在尝试从 TextureAtlas 获取纹理区域,但作为 Texture。
我试过了:
textureAtlas.findRegion("explosion").getTexture();
但它返回整个纹理图集图像。
对于我创建的类似于 Sprite 的类,我需要这个。我避免使用 Sprite,因为它无法满足我的需求。
我找到的所有答案都是针对 Sprite 类的。
【问题讨论】:
您可能误解了Texture、TextureRegion 和TextureAtlas 的概念。没有简单的方法可以做你想做的事,这样做也没有任何意义。这样做首先会破坏使用TextureAtlas 的全部目的。
您可以将Texture 视为与磁盘上的图像文件的一对一映射。例如.png 文件。因此,基本上,对于您拥有的磁盘上的每个图像文件,您都可以拥有一个 Texture 实例。但是,如果磁盘上没有从中加载纹理的图像文件,则不能拥有 Texture 实例。 (严格来说,您可以在磁盘上创建一个没有文件的Texture 实例,例如可以说是内存中的文件,但这与您的问题无关)
TextureAtlas 用于将多个较小的图像组合成磁盘上的单个图像文件。这是使用例如完成的。 TexturePacker,这是一个工具,它使用多个图像作为磁盘上的文件作为输入,然后将其组合成磁盘上的单个图像文件。这样做是因为拥有一张(或几张)大图像比拥有许多小图像的性能要好得多。
所以,因为您使用的是TextureAtlas(这是一件好事),这意味着您在磁盘上只有一个图像文件。而且因为您在磁盘上只有一个图像文件,所以您也只有(并且需要)一个 Texture 实例。
您通常不应该直接使用Texture。相反,您应该使用TextureRegion。这只是一个在该纹理中指定Texture 以及特定区域(x、y、width 和height)的类。这正是您正在寻找的。你可以直接画一个TextureRegion,例如使用SpriteBatch。所以这是一种非常方便的指定图片的方式。
请注意,Sprite 类扩展了TextureRegion,只是添加了一些额外的便利属性。所以如果你有Sprite,那么你也有TextureRegion,如果你不需要额外的属性,你可以简单地忽略它们。
因此,如果您创建了一个需要在 TextureAtlas 中提供图像的类,并为此依赖 Texture,那么您的实现不正确。在这种情况下,您可以做的最好的事情是使用TextureRegion 而不是Texture 来修改该实现。
【讨论】: