2013-05-30 63 views
0

我遇到了一個我正在做的遊戲的問題。我基本上有地圖中的對象,如果他們碰撞牆壁(然後做一些事情),我必須檢查它們中的每一個。自從與AS2一起工作以來,我就以同樣的方式考慮過:我只繪製了一幅只有牆壁的圖片,因此只有矩形,其間的所有內容都是透明的(例如不存在,然後是地板)。在AS2中,我把圖像放在屏幕上,我們稱之爲牆壁,然後對每個物體進行hitTest測試。例如,對象實際上是在圖像上,因爲透明部分是其中的一部分,但該功能僅在可見部分進行測試,對牆壁進行測試。所以它工作。AS3中的高效碰撞檢測

現在在AS3中沒有HitTest,但是我使用了hitTestObject,而我的例子是wall.hitTestObject(object)。問題是這個功能就好像它沒有看到透明膠片一樣,而不接觸牆壁的物體與它們碰撞!

我發現PixelPerfectCollisionDetection實際上解決了這個問題,但它是巨大而沉重的,所以在我的情況下,有太多的對象要在每一幀測試(至少60),遊戲變慢了很多!

我需要的是像hitTestObject這樣的功能(我不需要很多的準確性!)來照顧圖像的透明部分。

我該怎麼辦?

+0

在AS3中有高性能物理庫,您可以像Box2D一樣使用。 – Marty

+0

您可以嘗試優化碰撞檢測 - 例如:在使用(慢速)hitTestObject之前,檢查2個對象是否在彼此的適當距離內。 – 2013-05-30 22:45:45

回答

2

正如在評論中提到的,物理/遊戲庫將爲您提供內置的代碼,並且應該可以開箱即用。

但是,如果你想自己構建它,甚至引入你自己的優化,第一步(這是非常便宜的)是使用DisplayObject.getBoundsRectangle.intersects的完全內置功能來檢查邊界衝突(儘管你必須這樣做在一致的座標空間中,即舞臺):

if (obj1.getBounds(stage).intersects(obj2.getBounds(stage)) { 
    // Cheap bounds intersection is true, now do pixel-perfect detection... 
} 

然後,如果邊界檢查爲真,則執行像素完美的碰撞檢測。

看來BitmapData.hitTest是您最好的選擇 - 請參閱blog post by Mike Chambers

在此方法之前,如果您對整齊的技術感興趣,可以使用Grant Skinner在his blog中概述的方法。這是一個非常聰明的算法,它使用內置的位圖例程(又快又快),創建一個只與重疊區域一樣大的BitmapData(或者甚至縮小它),並將兩個對象繪製到位圖數據的特定通道中,然後使用BitmapData.getColorBoundsRect()來確定是否有任何像素觸摸。我猜BitmapData.hitTest比較快,但比較起來很有趣。

+0

它的工作!它比pixelperfect更快! – Maloooo

1

我遇到了同樣的問題,說實話,我發現簡單的方法來擺脫這只是爲衝突生成一個「掩模」層。您始終可以將其置於您的背景下,使其不顯示,或更改透明膠片和任何其他內容。在Flash中執行此操作,在用矩形(或任何其他)碰撞時「覆蓋」後,只需全選它們並製作一個影片剪輯。

我猜你已經在Flash中創建了這個符號,它顯然知道即使這個符號包含幾個單獨的圖形或其他東西,它也不只是一個圖像。

對我來說這工作得很好。