我在舞台上有一个Sprite的数组,现在想要绑定它们的矩形。我可以做一个循环并检查每个元素的getBounds(),但这可能是计算上昂贵的。有没有更好的方法呢?
答案 0 :(得分:1)
你可以将它们全部放在Sprite中,然后获取该sprite的边界框。
答案 1 :(得分:0)
您可以通过维护另外两个阵列(一个用于像素行,一个用于像素列)来扩展此操作的负载,因此对于800x600阶段,您将拥有一个包含800个元素的xBounds数组,以及yBounds包含600个元素的数组。
每个数组的每个元素都是对所有精灵的引用数组,这些精灵具有落在该像素上的边界(如果没有使用该列/行,则为null)。因此,每个精灵在每个数组中都有两个条目;一个用于min x bound,一个用于max。
无论何时移动,调整大小,旋转或以其他方式更改精灵的边界,您都必须通过从两个列表中删除旧值min和max来更新这些列表,并将它们添加到在新职位上。
这样,屏幕上所有精灵的整体界限就是这两个数组中每个数组中最低和最高使用的索引。
对于额外的速度,您很可能还想存储x和y的最小值和最大值,并且只有在精灵操作改变它们时才更改它们。因此,如果精灵位于最小值或最大值以下,您可以通过简单赋值给新的最小值或最大值来更新值;如果精灵是当前最小列的数组中唯一的元素,并且被移动到更高的位置,那么你将从旧的min循环到精灵的新位置,并将新的min设置为第一个被占用的数组元素(和最大列相同但相反)。
使用数组,此解决方案将使用几个kb的内存,偶尔需要循环部分数组。更优化的是,您可以使用“排序列表”类替换数组:可能不值得开发人员/维护者时间来获得额外的复杂性,但使用某种形式的自平衡二叉树可能会增加一点速度并节省一些内存,如果你有很多精灵,经常移动,大屏幕,慢速CPU和很少的记忆,这可能很重要。
无论哪种方式,请务必处理数组为空的情况,因为没有显示精灵。
答案 2 :(得分:0)
var child:DisplayObject = ...
var parent:DisplayObject = new Sprite(); // should be the parent object.
var bounds:Rectangle = child.getBounds(parent)