Farseer 3.3 Verificando si un cuerpo no habilitado chocará si estuviera habilitado (desove)

Estoy usando Farseer 3.3 y XNA.

Tengo un problema que no puedo resolver de una manera agradable.

Tengo una situación en la que hay un mundo en el que los cuerpos se mueven haciendo eso.

Luego tengo un objeto cuyo cuerpo está configurado como no habilitado, ¿hay alguna manera agradable de verificar si el cuerpo está chocando con algo actualmente? es decir, para saber si sería un engendro limpio, ¿debo habilitarlo y configurarlo en dinámico?

Gracias de antemano.

preguntado el 27 de agosto de 11 a las 17:08

1 Respuestas

Para cualquier otra persona que encuentre esta publicación mientras intenta resolver el mismo tipo de problema, aquí es cómo lo hice al final.

En este ejemplo, utilizo la palabra Item para representar la clase que contiene un cuerpo, etc., este podría ser su jugador / bala / lo que sea.

En su clase de artículo, suscríbase a los cuerpos en caso de colisión y en eventos de separación.

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

luego configure un miembro para que el elemento contenga un recuento de colisiones y separaciones.

privado int _canBePlacedCounter = 0;

En los métodos del controlador de eventos, aumente o disminuya el recuento de miembros. En el siguiente código hay condiciones adicionales en cuanto a mí, solo quiero realizar estas operaciones cuando un artículo se coloca en el "mundo".

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

Luego podemos configurar una propiedad pública simple (esto realmente debería ser un método si queremos entrar en estándares de codificación, pero este no es el momento ni el lugar)

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

El motivo de esta implementación es que originalmente tenía un bool que establecía en verdadero o falso cada vez que obtenía uno de los eventos. El problema es ... Si su artículo choca con el artículo A, luego choca con el artículo B y luego deja el artículo A, obtiene una lectura de no colisionar. Entonces ... usando un contador como este, podemos contar y contar todas las colisiones y separaciones. Créame, esto funciona como un encanto absoluto.

Espero que sea de utilidad para alguien por ahí.

ACTUALIZACIÓN: He descubierto que esto solo funciona bien con rectángulos básicos. Si ingresa a cuerpos con muchos polígonos, como los generados automáticamente a partir de imágenes, es muy poco confiable ya que, por alguna razón, el clarividente genera regularmente menos eventos de separación que eventos de colisión, lo que significa que el contador a menudo no vuelve a 0.

Respondido el 06 de Septiembre de 11 a las 11:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.