2010-04-07 9 views
0

J'écris un jeu XNA en C# en utilisant le port XNA de Box2d - Box2dx.Box2d: Set actif et inactif

Les entités telles que les arbres ou les zombies sont représentées en tant que GameObjects. GameObjectManager ajoute et les retire du monde du jeu:

/// <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); 
    } 

controllers est une collection de GameObjectController cas.

worldState.Models est une collection de GameObjectModel instances.

Lorsque je retire GameObjects de Box2d cette façon, cette méthode est appelée:

 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(); 
    } 

Cette méthode renvoie une erreur:

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

Pourquoi Est-ce que cela arrive? Que puis-je faire pour l'éviter? Cette méthode a été appelée plusieurs fois avant l'appel du body.SetActive(). Je pense que cela peut être déconner.

+0

Est-ce que controller.Model.Body est un objet box2d? – HyperCas

+0

C'est entièrement correct. –

Répondre

1

Quelques petites choses. L'erreur provient en fait de la méthode Single car elle suppose qu'il y aura au moins un élément dans la séquence. Si vous voulez un comportement plus tolérant utilisez SingleOrDefault qui retournera la valeur par défaut de ce type (si c'est une classe, null). Deuxièmement, l'objet "Body" ... il peut avoir la méthode equals surchargée, auquel cas vous pouvez obtenir des résultats bizarres en faisant "==". Si vous cherchez littéralement la même instance (et c'est une classe), vous pouvez utiliser la méthode object.ReferenceEquals. Troisièmement, vous devriez repenser votre conception. Chaque fois que vous devez parcourir une collection pour rechercher un élément donné (ce qui est la méthode .Where), vous avez la possibilité d'utiliser un meilleur algorithme.