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.
Est-ce que controller.Model.Body est un objet box2d? – HyperCas
C'est entièrement correct. –