对于libGDX里的 TextureAtlas.findRegions() ,返回的是一个 Array<AtlasRegion> 类型的数组。,但是返回的是一个按什么要求的数组呢?
下面是官方代码
*Returns all regions with the specified name, ordered by smallest to largest index.
This method uses string comparison to find the regions,
so the result should be cached rather than calling this method multiple times.
public Array<AtlasRegion> findRegions (String name) {
Array<AtlasRegion> matched = new Array(AtlasRegion.class);
for (int i = 0, n = regions.size; i < n; i++) {
AtlasRegion region = regions.get(i);
if (region.name.equals(name)) matched.add(new AtlasRegion(region));
}
return matched;
}
官方的说明是返回特定名称并从小到大排序的所有区域,并且此方法使用字符串比较来查找区域。然后很多文章表示返回的是“前缀相同的所有区域”,让人以为像 “Aa.png”“Ab.png”“Ac.png” 这种格式命名图片是可以的,事实上不行,这种说法是有问题的。
真实情况
官方的代码说明里也没有提到前缀,而且看这个函数的代码里也发现了就只是比对了输入字符串和区域名称是否相同,相同就加入数组,很显然它没有比对字符前缀。那问题出在哪呢?
打包好的 .atlas 文件里面每个图片都有一项属性 index ,你会发现你文件里的图片名称如果没有一样的,那这些索引默认是 -1 ,如果你的图片名称有一样,那这些索引值就会从 0 开始计数。
SUsoundL
rotate: false
xy: 663, 10
size: 48, 48
orig: 48, 48
offset: 0, 0
index: -1
transButton
rotate: false
xy: 749, 174
size: 80, 80
orig: 80, 80
offset: 0, 0
index: 0
transButton
rotate: false
xy: 484, 35
size: 80, 80
orig: 80, 80
offset: 0, 0
index: 1
有了这些索引值,就可以使用 TextureAtlas.findRegions() 来全部获取了,比如获取上面的 transButton 。获取后,图片在数组中的位置和上面的索引一样。
atlas.findRegions(“transButton”);
如何使用
要求 .atlas 文件里图片名称一样才能使用TextureAtlas.findRegions(),那这不是太鸡肋?事实上 AtlasRegion的官方说明给了我们答案。
/** The name of the original image file, without the file's extension.<br>
* If the name ends with an underscore followed by only numbers, that part is excluded: underscores denote special
* instructions to the texture packer. */
public String name;
name是图片的名字,且不包括拓展名。如果名称以下划线结尾,后跟数字,则该部分被排除在外:下划线表示对纹理包装器的特殊说明。
意思是从图片打包TexurePacker起,如果你想让一组相关图片在之后被一起调用,就按 “文件名_数字” 的格式来命名图片,_数字 会被当成特殊说明(索引) 来处理,然后再调用 TextureAtlas.findRegions() 就可以全部获取了。
数字要大于等于0,可以不连续。(数字是几,index属性就是几。获取时按索引从小到大获取)
A_0.png
A_1.png
B_1.png
B_4.png
获取时只使用 A作为名称就能获取全部A了,B也同理
补充
如果你的图片已经打包好了,而且很多,你也懒得再重新修改这些图片的命名,那么我建议你直接在生成的 .atlas 文件里修改图片名和索引index。
例如:Aa,索引-1; Ab,索引-1; Ac,索引-1 …
直接把名称后缀a,b,c删了,都改成A。然后索引按顺序0,1,2…
之后如果你忘了图片索引对应哪张图片,你可以看你修改前的.atlas文件(所以需要做好备份),或者可以看你图片文件夹里的图片顺序,选择按名称查看就行(图片文件夹不要轻易改动就行,不然就乱了)。