关于libGDX里TextureAtlas.findRegions()的一些注意点及一些错误说法纠正

libGDX的TextureAtlas.findRegions()方法返回按名称匹配并按索引从小到大排序的AtlasRegion数组。该方法基于字符串比较,而非前缀匹配。关键在于.atlas文件中图片的index属性,相同的图片名称会分配从0开始的索引。若要按组获取相关图片,应使用名称_数字格式命名,数字对应于index。如果不方便修改图片命名,可以直接编辑.atlas文件调整名称和索引。
摘要由CSDN通过智能技术生成

对于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文件(所以需要做好备份),或者可以看你图片文件夹里的图片顺序,选择按名称查看就行(图片文件夹不要轻易改动就行,不然就乱了)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值