2011-11-11 37 views
0

我想創建一個函數,在該函數中我可以拖動一個影片剪輯,該影片剪輯會撞到舞臺上的其他影片剪輯而不與它們重疊。 (即,對象不能被拖動或通過其他動畫片段)。如何通過碰撞檢測拖動對象?

function dragHolder01(event:Event):void{ 
    if (mouseDownHolder01 == true) { 
     for(var m:int = 0;m<blockHolder.numChildren; m++){ 
      var hitBlock:DisplayObject = blockHolder.getChildAt(m); 
      if(movaHolder01.hitTestObject(hitBlock)){ 
       movaHolder01.x = movaHolder01x; 
       movaHolder01.y = movaHolder01y; 
       break; 
      } 
     } 
     movaHolder01.startDrag(); 
     movaHolder01x = movaHolder01.x; 
     movaHolder01y = movaHolder01.y; 
    } 
} 

我想我可能有一個概念上的解決方案,但我需要你的幫助。 我以爲也許我可以限制「startDrag」允許根據幀進度拖動,即玩家將無法拖動對象超過每個幀的一個像素(因此不能將對象拖到另一個由多於一個像素)。

有關如何做到這一點的任何想法?

+0

到目前爲止你有什麼嘗試,你有任何代碼顯示?什麼是你的文件的設置,你有一個可用的參考舞臺上的其他對象? – shanethehat

回答

0

你可能想看看一個物理引擎,如Box2D的:http://box2dflash.sourceforge.net/

+0

謝謝。恐怕這需要很長時間才能實現我現有的代碼。我只想使用一個執行此操作的函數。 – user1041249

2

拆分這個問題分成幾部分。正如我所看到的,這些部分是:

  • 對象是左鍵單擊,調用startDrag()並且已準備好enterFrame()偵聽器。
  • 在每個幀檢查拖動的對象和所需的場景對象之間的碰撞。
  • 假設你有碰撞。接下來呢 - 你如何處理?你可以將它放到原來的位置 - 這樣,物體就會卡在最輕微的接觸中。或者你可以通過某個矢量來移動碰撞的對象。它可能是從障礙物中心到碰撞物體中心的向量(如果它們都很小)。
  • 當左鍵釋放時,調用stopDrag()。

如果你喜歡的Box2D,還有其他步驟:

  • 把你的電影剪輯成物理形狀。不要問我如何 - 這不會是自動的。
  • 而不是startDrag()施加一些力量來拖動對象。鼠標光標從物體轉移的越多,力量就越大。 Box2D將自動解決碰撞和碰撞對象。

更新:如何存儲先前的位置

var positions:Dictionary = new Dictionary(); 
var clip:MovieClip = ...; //load your clip somehow 

//store position 
position[clip] = new Point(clip.x, clip.y); 

//read position 
var pos:Point = position[clip]; 

//update position - reuses Point objects to make things somewhat faster 
var pos:Point = position[clip]; 
pos.x = clip.x; 
pos.y = clip.y; 
//that's all, reference to Point is already in the Dictionary. 

還有其他方法。 MovieClip不是最終的類,所以它可以繼承和擴展與以前的位置。這也是動態的,這意味着你可以插入其上的數據:

clip.prevX = clip.x; //prevX will be created if not exist 
clip.prevY = clip.y; 
//move clip 
+0

這是完全正確的...我似乎可以得到第3部分。我有1(拖入enterFrame)和2(命中測試),但我似乎無法有效地將拖動的對象回到以前的位置。我怎樣才能在碰撞物體外面採樣? – user1041249

+0

要捕捉對象回來(最簡單的版本),存儲與剪輯相關聯的前一個位置(在帶有MovieClip鍵的Dictionary中,或者製作將包含MovieClip和額外數據的包裝類)或者基於碰撞對象的中心計算所述向量。你的物體有多大? – alxx

+0

對象大小各不相同。我的問題與存儲以前的位置完全相同......我不熟悉字典或包裝類。 – user1041249

1

如果你想物理行爲(即事情彈跳時命中),不要自己實現,並使用物理引擎,如Box2D的。他們有幾個MouseDragged對象的例子(參見Test類http://box2dflash.svn.sourceforge.net/viewvc/box2dflash/Examples/TestBed/Test.as?revision=158&content-type=text%2Fplain的MouseDrag)。你可以使用MovieClip.hitTest()作爲你的碰撞檢測,並驗證被拖動的對象(在鼠標位置),沒有碰到任何東西,如果有的話,你將它恢復到之前的位置。但請注意,鼠標可以在任何時間範圍內以任意速度移動,因此,如果鼠標移動得太快(可以執行固定大小的連續插值以避免此情況),拖動的對象可以通過另一個對象。

物理行爲和碰撞檢測是嚴重的數學和計算機問題,不應掉以輕心。如果你想要體面的碰撞和物理行爲,那麼熟悉一個物理引擎(已經被使用和測試並優化了很多次)要花費很多時間,而不是編寫自己的代碼來執行這種行爲。

如果你仍然不想使用物理引擎,請告訴我你的代碼,並且我可能會根據自己的喜好使用它(以一些計算時間爲代價)。