Pregunta

Estoy escribiendo un juego XNA en C # usando el puerto de XNA Box2D -. Box2dx

Entidades como árboles o zombis están representados como GameObjects. GameObjectManager agrega y los elimina del mundo del juego:

    /// <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 es una colección de instancias GameObjectController.

worldState.Models es una colección de instancias GameObjectModel.

Cuando quito GameObjects de Box2D esta manera, este método se llama:

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

Este método genera un error:

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

¿Por qué sucede esto? ¿Qué puedo hacer para evitarlo? Este método ha sido llamado muchas veces antes de la body.SetActive() fue llamado. Siento que esto puede mezclarlo.

¿Fue útil?

Solución

Un par de cosas. El error en realidad proviene del método individual porque se supone que habrá al menos un elemento de la secuencia. Si quieres más tolerante SingleOrDefault utilización comportamiento que devolverá el valor predeterminado de ese tipo (si se trata de una clase, null).

En segundo lugar, el objeto "cuerpo" ... que puede tener el método es igual a anularse, en cuyo caso es posible obtener resultados extraños al hacer "==". Si está buscando literalmente la misma instancia (y es una clase), puede utilizar el método object.ReferenceEquals.

En tercer lugar, se debe reconsiderar su diseño. Cada vez que tenga que recorrer una colección de buscar un tema determinado (que es todo el método .Where hace) usted tiene la oportunidad de utilizar un algoritmo mejor

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top