2010-07-07 59 views
1

我知道有人爲此創建課程(即http://coreyoneil.com/portfolio/index.php?project=5)。但我想學習如何自己做,所以我可以按照自己需要的方式創建我需要的一切。Actionscript 3像素完美碰撞。如何? (學習目的)

我已閱讀關於BitMap和BitMapData。我應該可以將MovieClip拖放到BitMap上,然後我可以循環查找碰撞的像素。然而,這是奇怪的和混淆處理偏移量。它接縫像MyBitMap.rect總是x = 0和y = 0 ...我無法縫合找到東西的原始位置...

我想先做一個hitTestObject,然後如果這是肯定的,我會調查像素碰撞的影片剪輯矩形之間的交集。 但後來也有一個問題(影片剪輯的旋轉)...

...我在這裏需要一些啓示如何做到這一點。 請任何幫助,將不勝感激。

回答

0

我設法做到這畢竟,我已經寫了我的類碰撞檢測,碰撞角度和其他附加功能。

最容易混淆的過程可能是爲比較正確對齊位圖。當將一個movieclip繪製成一個BitmapData時,如果我們在addChild()對應的位圖上看到它的一部分是不可見的。它看起來只是從中心向右和向下拉,使得頂部和左邊的部分不再受到牽引。解決方案是在繪製方法的第二個參數中給出一個變換矩陣,它將位圖對齊並使其全部被繪製。

這是我的類中的函數的例子創建位圖進行比較:

static public function createAlignedBitmap(mc: MovieClip, mc_rect: Rectangle): BitmapData{ 
       var mc_offset: Matrix; 
       var mc_bmd: BitmapData; 

       mc_offset = mc.transform.matrix; 
       mc_offset.tx = mc.x - mc_rect.x; 
       mc_offset.ty = mc.y - mc_rect.y; 
       mc_bmd = new BitmapData(mc_rect.width, mc_rect.height, true, 0); 
       mc_bmd.draw(mc, mc_offset); 

       return mc_bmd; 
} 

爲了使用它,如果你是在時間軸上,你這樣做:

className.createAlignedBitmap(myMovieClip, myMovieClip.getBounds(this)) 

注意使用返回嵌入了影片剪輯的矩形的getBounds。這允許計算偏移矩陣。

這種方法頗爲相似,就在這裏顯示http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

通過的方式,如果這是你的一個有意思的事情,檢查我的,我會後稍等片刻,等問題。

1

如果你使用透明的BitmapData對象,你可以使用BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean

您必須從全局座標轉換爲本地BitmapData座標,如果座標旋轉將需要一些數學運算。這是很容易實現(查找仿射變換更多信息有關維基):

var coordTransform:Matrix = new Matrix(); 

coordTransform.rotate(rotationRadians); 
coordTransform.translate(x, y); 

coordTransform.transformPoint(/* your point */); 
+0

我不想簡單地測試它們是否碰撞。我想學習如何手動完成,因爲我知道,我需要找到諸如碰撞角度等信息,而這些信息並不是由您提到的函數返回的。 但..在你的代碼中,你是在談論改變位圖中的所有像素位置使用旋轉矩陣?是嗎? – jmacedo 2010-07-07 18:06:34

+0

碰撞角度?你能否詳細說明(即它們相撞的地方的正切)。手動完成此操作的方法是遍歷一個位圖的每個像素,並查看它是否正在觸摸另一個位圖的像素。然後,如果任何像素觸及另一個像素,則位圖會在某處重疊。現在您應該使用一些啓發式方法來限制您測試的像素,因爲該方法極其低效。 – Mahir 2010-07-07 18:26:38

+0

座標變換是在你的位圖旋轉的情況下給出的。 例如:您的bmd是一個20x20像素的正方形,其左上角位於(0,0)處。順時針旋轉45度使其成爲菱形(再次左上角爲(0,0))。如果你想看看舞臺位置(0,25)是否觸及bmd(它是),那麼你不能用(0,25)擊中Test,因爲hitTest測量相對於bmd的位置。您需要將該位置轉換爲(25/sqrt(2),25/sqrt(2)),這是我示例中的代碼的意思。 – Mahir 2010-07-07 18:32:57

1

經典閃光燈像素完美碰撞檢測基準是這個Grant Skinner's article。它是AS2,但是AS3的邏輯是相同的(如果你有一點google,有些端口可用)。

如果我沒有記錯,只要這兩個測試對象具有相同的父對象,但這個可以修復,這個特定的實現就可以工作。

關於BitmapData xy的值,我理解它可能會令人困惑;然而,它的工作方式對我來說很有意義。 BitmapData就是這個名稱的意思:像素數據。它不是一個顯示對象,不能在顯示列表中;所以如果你仔細想想,xy與0不一樣是沒有意義的。處理這個問題的最簡單方法可能是存儲源對象(您從中繪製的顯示對象)的偏移量並將其轉換爲全局座標空間,以便您可以比較任何對象,而不管它們在顯示列表中的位置是什麼(使用類似var globalPoint:Point = source.parent.localToGlobal(new Point(source.x,source.y))

+0

我記得格蘭特斯金納的方法只有正確工作,如果兩個對象都是舞臺的直接孩子。 – Cameron 2010-07-08 12:50:49

1

我以前使用的特洛伊·吉爾伯特像素完美碰撞檢測類別(改編自安德烈·米歇爾,格蘭特斯金納和Boulevart),它的作品真的很好(處理旋轉,不同的父母等):

http://troygilbert.com/2007/06/pixel-perfect-collision-detection-in-actionscript3/
http://troygilbert.com/2009/08/pixel-perfect-collision-detection-revisited/

,並從那裏,他也與這個項目(我沒有用,但看起來真是令人印象深刻):

http://www.coreyoneil.com/portfolio/index.php?project=5