2010-04-07 98 views
0

我正在使用Box2d - Box2dx的XNA端口在C#中編寫XNA遊戲。Box2d:設置活動和不活動

樹木或殭屍等實體表示爲GameObjects。 GameObjectManager增加,並從遊戲世界中將其刪除:

/// <summary> 
    /// Does the work of removing the GameObject. 
    /// </summary> 
    /// <param name="controller">The GameObject to be removed.</param> 
    private void removeGameObjectFromWorld(GameObjectController controller) 
    { 
     controllers.Remove(controller); 
     worldState.Models.Remove(controller.Model); 
     controller.Model.Body.SetActive(false); 
    } 

    public void addGameObjectToWorld(GameObjectController controller) 
    { 
     controllers.Add(controller); 
     worldState.Models.Add(controller.Model); 
     controller.Model.Body.SetActive(true); 
    } 

controllersGameObjectController實例的集合。

worldState.ModelsGameObjectModel實例的集合。

當我從Box2D中刪除GameObjects這種方式,這種方法被稱爲:

 void IContactListener.EndContact(Contact contact) 
     { 
      GameObjectController collider1 = worldQueryUtils.gameObjectOfBody(contact.GetFixtureA().GetBody()); 
      GameObjectController collider2 = worldQueryUtils.gameObjectOfBody(contact.GetFixtureB().GetBody()); 
      collisionRecorder.removeCollision(collider1, collider2); 
} 

worldQueryUtils:

// this could be cached if we know bodies never change 
    public GameObjectController gameObjectOfBody(Body body) 
    { 
     return worldQueryEngine.GameObjectsForPredicate(x => x.Model.Body == body).Single(); 
    } 

此方法將引發錯誤:

System.InvalidOperationException was unhandled 
    Message="Sequence contains no elements" 
    Source="System.Core" 
    StackTrace: 
     at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
     at etc 

爲什麼這是否發生?我能做些什麼來避免它?在調用body.SetActive()之前,此方法已被調用很多次。我覺得這可能會搞砸了。

+0

是controller.Model.Body一個box2d對象? – HyperCas 2010-04-07 15:55:58

+0

這完全正確。 – 2010-04-07 16:55:54

回答

1

有幾件事。該錯誤實際上來自Single方法,因爲它假定序列中至少有一個項目。如果您想要更寬容的行爲,請使用SingleOrDefault,它將返回該類型的默認值(如果它是一個類,則爲null)。

其次,「Body」對象...它可能會覆蓋equals方法,在這種情況下,執行「==」時可能會得到奇怪的結果。如果你真的在尋找相同的實例(它是一個類),你可以使用object.ReferenceEquals方法。

第三,你應該重新考慮你的設計。任何時候你必須通過一個集合來尋找一個給定的項目(這是所有.Where方法所做的),你有機會使用更好的算法