2010-01-27 68 views
0

我在舞臺上有一個Sprites數組,並且想要現在限制它們的矩形。我可以做一個循環並檢查每個元素的getBounds(),但這可能在計算上很昂貴。有沒有更好的方法來做到這一點?圍繞一組DisplayObject計算邊界框的最佳方法是什麼?

+0

多少的精靈,我們談論?幾十,幾百? – grapefrukt 2010-01-27 15:34:53

+0

現在它沒有那麼多(所以我可以循環每一個,找到他們的X/Y/W/H,並使用這些),但我正在尋找一個優雅的解決方案。我相信像碰撞檢測算法這樣的人可能會有東西可以使用 – Arpit 2010-01-27 22:28:44

回答

1

你可以把它們全部放入一個Sprite中,並獲得該Sprite的邊界框。

+0

是的,但那不是一個選項。希望有一些涉及bitmapData等技巧來做到這一點。 – Arpit 2010-01-27 22:27:06

+0

暫時如何? 如果沒有,我能想到的唯一的「優雅」解決方案就是循環遍歷它們等等。 另一種方法是將它們繪製成位圖數據並使用getColorBounds,但它可能比循環更慢更髒;) – Cay 2010-02-01 16:33:53

0

通過維護兩個數組,一個用於像素行,另一個用於像素列,您可以隨着時間的推移擴展此操作的負載,因此對於800x600階段,您將有一個800個元素的xBounds數組,一個由600個元素組成的yBounds數組。

每個數組的每個元素都是一個引用數組,該引用對所有具有落在該像素上的邊界的精靈(如果沒有使用該列/行,則爲null)。所以,每個精靈在每個數組中都會有兩個條目;一個用於最小x界限,一個用於最大如果您移動,調整大小,旋轉或以其他方式更改精靈的邊界,則必須通過從兩個列表中刪除最小值和最大值的舊值並添加它們來更新這些列表在新的職位上。

這樣,屏幕上所有精靈的總界限就是這兩個數組中每個數組中最低和最高的使用索引。

對於額外的速度,你很可能也想存儲x和y的最小值和最大值,並且只有在精靈動作改變它們時才更改它們。所以,如果一個精靈被放置在最小值或最大值以上,你可以用一個簡單的賦值來更新新的最小值或最大值;並且如果精靈是當前最小列的數組中唯一的元素,並且移動得更高,那麼您將從舊分鐘開始循環,直到精靈的新位置,並將新分鐘設置爲第一個佔用數組元素(和最大列相同但相反)。

使用數組時,此解決方案將使用幾kb的內存,偶爾需要循環部分數組。更理想的情況是,你可以用一個「排序列表」類替換數組:可能不值得開發者/維護者花費額外的複雜時間,但使用某種形式的自平衡二叉樹可能會增加一點速度並節省一點內存,如果你有很多精靈,那麼這很重要,經常移動,大屏幕,慢CPU和小內存。

無論哪種方式,請務必處理數組爲空的情況,因爲沒有精靈顯示。

相關問題