Pregunta

Estoy tratando de hacer un juego de voleibol y simular cada acción basada en Box2d. Lo que quiero hacer es tener una restitución de pelota diferente cuando el jugador golpeó la pelota, y la pelota golpeó la pared. Entonces, en el primer caso, la pelota debe volar más rápido, y en el segundo caso más lento.

Pero si estoy tratando de establecer restitución para un jugador y para objetos de pared de una manera diferente, también noto que el jugador mismo está rebotando de la pared ... ¿Hay alguna manera de hacerlo de manera selectiva? Por ejemplo, golpear el piso no debería hacer que un jugador rebote ... pero si el jugador golpeó la pelota, debería rebotar mucho.

¿Fue útil?

Solución

Desafortunadamente, tienes razón, Box2d no tiene esta configuración.

En su lugar, lo que puede hacer es escuchar un evento de escucha de contacto que coincida tanto con el reproductor como la pelota. Cuando eso sucede, aplicas una fuerza muy grande a la pelota.

editar

Escribí esto en la parte superior de mi cabeza, no estoy seguro de que sea exactamente correcto.

public class MyContactListener extends b2ContactListener {
    override public function Add(point:b2ContactPoint):void {
        var ball:b2Body = ...
        var player:b2Body = ... // fill these
        var force:b2Vec2;

        if(point.shape1.GetBody() == ball && point.shape2.GetBody() == player) {
            force = point.normal.Copy();
            force.Multiply(SOMETHING);
            ball.ApplyForce(force);
        } else if(point.shape1.GetBody() == player && point.shape2.GetBody() == ball) {
            force = point.normal.Copy();
            force.Multiply(-SOMETHING);
            ball.ApplyForce(force);
        }
    }
}

Que está pasando aqui.

Necesita crear una instancia de esta clase y registrarla con el mundo, que probablemente sea algo así como world.SetContactListener(new MyContactListener) o algo.

El método add () se dispara cuando dos cuerpos entran en contacto. La fuerza aplicada está en la dirección del contacto normal (que lo lleva de un cuerpo a otro).

Debido a la forma en que se configura el sistema de oyentes de contacto, es posible que la pelota o el jugador sean el cuerpo #1 en la estructura B2ContactPoint, por lo que debe codificar esa posibilidad. La dirección de lo normal depende de cuál sea el cuerpo #1 (de ahí el signo menos). En realidad, no puedo recordar de qué manera va, por lo que es posible que necesite revertir la fuerza (coloque el signo menos en la otra rama).

Aparte de eso, debería ser razonablemente claro. Box2d no parece tan conocido aquí, por lo que es posible que tenga un poco más de suerte en los foros de Box2d (http://www.box2d.org/forum/)

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