我設法做到這畢竟,我已經寫了我的類碰撞檢測,碰撞角度和其他附加功能。
最容易混淆的過程可能是爲比較正確對齊位圖。當將一個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/
通過的方式,如果這是你的一個有意思的事情,檢查我的,我會後稍等片刻,等問題。
我不想簡單地測試它們是否碰撞。我想學習如何手動完成,因爲我知道,我需要找到諸如碰撞角度等信息,而這些信息並不是由您提到的函數返回的。 但..在你的代碼中,你是在談論改變位圖中的所有像素位置使用旋轉矩陣?是嗎? – jmacedo 2010-07-07 18:06:34
碰撞角度?你能否詳細說明(即它們相撞的地方的正切)。手動完成此操作的方法是遍歷一個位圖的每個像素,並查看它是否正在觸摸另一個位圖的像素。然後,如果任何像素觸及另一個像素,則位圖會在某處重疊。現在您應該使用一些啓發式方法來限制您測試的像素,因爲該方法極其低效。 – Mahir 2010-07-07 18:26:38
座標變換是在你的位圖旋轉的情況下給出的。 例如:您的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