2011-08-27 71 views
2

我正在使用Farseer 3.3和XNA。Farseer 3.3檢查未啓用的物體是否會發生碰撞(產卵)

我有一個問題,我只是無法解決一個很好的方法。

我有一種情況,有一個在它所有機體的離開工作做的事情有一個世界。

然後我有一個對象,多數民衆贊成體被設置爲不啓用,有檢查,如果身體目前正與任何碰撞的一個很好的方式?即要知道它是否應該是一個乾淨的產卵,我應該讓它啓用並將其設置爲動態?

在此先感謝。

回答

2

對於大家有沒有發現這個職位,同時試圖解決同樣的問題在這裏是我是如何做的到底。

在這個例子中,我用這個詞項代表包含體等類,這可能是您的播放器/子彈頭/不管。

在您的Item類中訂閱碰撞和分離事件上的物體。

 this.Body.OnCollision += Body_OnCollision; 
     this.Body.OnSeparation += Body_OnSeperation; 

然後設置該項目的成員來保存衝突和分離計數。

private int _canBePlacedCounter = 0;

在事件處理函數方法中,增加減少成員數。在下面的代碼中,對於我自己來說有額外的條件,我只想在項目被放入「世界」時執行這些操作。

private bool Body_OnCollision(Fixture fixturea, Fixture fixtureb, Contact contact) 
    { 
     if(this.IsBeingPlaced) 
     { 
      _canBePlacedCounter++; 
     } 

     return true; 
    } 

    private void Body_OnSeperation(Fixture fixturea, Fixture fixtureb) 
    { 
     if (this.IsBeingPlaced) 
     { 
      _canBePlacedCounter--; 
     } 
    } 

然後,我們可以設置一個簡單的公共財產(這真的應該是一個方法,如果我們想進入編碼標準,但這是沒有時間或地方)

public bool CanBeDropped 
    { 
     get 
     { 
      if (_canBePlacedCounter == 0) return true; 
      else return false; 
     } 
    } 

這樣做的原因實施是,我原本有一個布爾,我只要有一個事件就設定爲真或假。問題是......如果你的物品與物品A碰撞,然後與物品B碰撞,然後離開物品A,你會得到一個不碰撞的讀數。所以...使用這樣的計數器我們可以計數並計算出所有的碰撞和分離。相信我這個作品就像一種絕對的魅力。

希望它對外面的人有用。

更新:我發現這隻適用於基本的矩形。如果你進入機構與許多多邊形如從圖像自動生成它非常不可靠無論出於何種原因先知比它的碰撞事件,這意味着計數器往往不返回到0

+0

感謝您更新定期引發更少分離事件 – Jimmy