Pergunta

Estou tentando fazer um jogo de vôlei e simular todas as ações baseadas no Box2D. O que eu quero fazer é ter uma restituição diferente de bola quando o jogador bate na bola e bola bate na parede. Portanto, no primeiro caso, a bola deve voar mais rapidamente e, no segundo caso, mais devagar.

Mas se estou tentando definir a restituição para um jogador e para objetos de parede de uma maneira diferente, também noto que o próprio jogador está saltando da parede ... Existe uma maneira de fazer isso de maneira seletiva? Por exemplo, bater no chão não deve fazer com que um jogador salte ... mas se o jogador bater na bola, ele deve saltar muito.

Foi útil?

Solução

Infelizmente, você está certo, o Box2D não tem essa configuração.

O que você pode fazer é ouvir um evento de ouvinte de contato que corresponde ao jogador e à bola. Quando isso acontece, você aplica uma força muito grande na bola.

editar

Eu digitei isso no topo da minha cabeça, não tenho certeza se está exatamente certo.

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

O que está acontecendo aqui.

Você precisa criar uma instância desta classe e registrá -la no mundo que provavelmente é algo como world.SetContactListener(new MyContactListener) ou alguma coisa.

O método add () dispara quando dois corpos entram em contato. A força aplicada está na direção do contato normal (que leva você de um corpo para o outro).

Devido à maneira como o sistema de ouvinte de contato é configurado, é possível que a bola ou o jogador seja o corpo nº 1 na estrutura do B2ContactPoint; portanto, você precisa codificar essa possibilidade. A direção do normal depende de qual é o corpo nº 1 (daí o sinal menos). Na verdade, não me lembro de que maneira é que você pode precisar reverter a força (coloque o sinal de menos no outro ramo).

Fora isso, deve ser razoavelmente claro. Box2D não parece tão conhecido aqui, então você pode ter um pouco mais de sorte nos fóruns Box2D (http://www.box2d.org/forum/)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top