Criando uma arma corpo a corpo no Box2D (libGDX)


10

Estou lutando com como implementar uma arma branca que pode balançar quando uma tecla é pressionada.

Estou imaginando dois ataques diferentes (facada e swing)

Eu tentei criar dois equipamentos (personagem + arma), dois corpos diferentes, dois corpos diferentes + junta de revolução, mas não consigo codificá-lo para se comportar da maneira que imagino. minha imaginação

FACADA:

Assim, com o pressionar de um botão, um corpo / acessório (sensor) sairia por ~ 1 segundo e desapareceria (alternativamente, o corpo / acessório sempre poderia estar no herói e girar 90 graus em torno dos vértices quando pressionado, e depois volte ao normal)

BALANÇO:

A mesma coisa, mas agora a arma começará do topo e balançará para baixo. A arma também será um sensor.

O que eu tentei:

Eu criei dois corpos dinâmicos.

A arma tem que seguir o herói, então usei uma articulação de revolta para mantê-los unidos. Quando uma tecla é pressionada, defino a velocidade angular da arma para um número. No entanto, a arma continuará girando depois que eu soltar a tecla. Eu tentei implementar uma verificação if (se o ângulo for maior que ___, defina a velocidade angular como zero). No entanto, isso significa que a arma irá parar de girar quando eu pressionar a tecla uma segunda vez.


Como você já criou os corpos / acessórios em forma de retângulo, basta girar o corpo da espada 90 graus para a direita para a animação de giro. Também é necessário desativar as colisões do corpo da espada, quando a animação não está ocorrendo, e não desenhá-la na tela. A animação da facada é apenas uma versão mais simples do swing, onde a espada tem um ângulo de partida diferente. Isso não está certo? Parece muito simples para mim. Onde você ficou?
dimitris93

O problema é a espada e o herói sobrepostos? talvez um pequeno corpo quadrado possa ser a ponta da espada, para nunca se sobrepor. talvez edite para obter mais informações #
drumbumLOLcatz 4/15

@Shiro Eu incluí minhas tentativas na parte inferior. No momento, estou paralisado porque não sei como iniciar e parar a rotação com o pressionar de uma tecla.
QuidProQuo

Sim parece que a pergunta real é como girar um objeto em pressione a tecla
dimitris93

Respostas:


1

Aliás, eu fiz exatamente o que você está tentando fazer. O único problema é que eu estava usando o Jbox2d, então o código está em Java, mas você ainda deve descobrir se está usando C ++

Basicamente, você precisa usar juntas / motores e todas essas coisas divertidas se quiser fazer uma ação de balanço. Aqui está um trecho da aparência do meu código com base na entrada principal:

    if (myinput.mouse0) {

        agents.get(0).rightForeJoint.enableMotor(true);
        agents.get(0).rightArmJoint.enableMotor(false);    

        if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)){
            agents.get(0).rightForeJoint.enableMotor(false);
        }

        mouseY = Mouse.getY();
        mouseX = Mouse.getX();
        float temp = mouseY - prevPos[1];

        float temp2 = -mouseX + prevPos[0];

        temp2 *= modifier; temp2 *= 0.000026;
        temp  *= modifier; temp  *= 0.000030;

        agents.get(0).armR.applyAngularImpulse(-temp);
        agents.get(0).foreR.applyAngularImpulse(temp2); 

        prevPos[1] = mouseY;
        prevPos[0] = mouseX;

        if(temp2 < 0){
            temp2 *=-1;
        }
        if(temp < 0){
            temp *=-1;
        }
        fatigueDrain += temp2;
        fatigueDrain += temp;

    }

E então, na medida em que realmente constrói os braços e outros enfeites, o trecho se parece com isso.

    // RIGHTARM //
    this.rightArmDef = new RevoluteJointDef();
        this.rightArmDef.bodyA = this.torso ; this.rightArmDef.bodyB = this.armR;
        this.rightArmDef.collideConnected = false;

        torso_armL_pin = new Vec2(0.50f, +0.05f);
        local_armL_pin = new Vec2(0.14f, 0.14f);

        this.rightArmDef.localAnchorA.set(this.torso.getLocalCenter().add(torso_armL_pin));
        this.rightArmDef.localAnchorB.set(this.armR.getLocalCenter().add(local_armL_pin));

        this.rightArmDef.enableMotor = true;
        this.rightArmDef.motorSpeed = 0f;
        this.rightArmDef.maxMotorTorque =10f;

        this.rightArmDef.enableLimit = true;
        this.rightArmDef.lowerAngle = 1.2f;// * DEGTORAD;
        this.rightArmDef.upperAngle = 5;
    this.rightArmJoint = (RevoluteJoint)world.createJoint(this.rightArmDef);

Sei que há muita coisa acontecendo aqui, mas provavelmente será mais fácil se você me perguntar o que precisa de clareza e eu explicá-la. Se você nunca usou nenhuma dessas coisas, provavelmente precisará ler bastante.

EDIT >>

Perceba que o Box2d possui toda a detecção e física de colisões integradas em suas bibliotecas. Acredite quando digo que é mais fácil descobrir o sistema deles do que tentar fazer as coisas do zero. Se você quiser uma colisão, use os equipamentos bodydefs; se quiser que eles girem ou se movam, use juntas. Pode parecer um pouco mais complicado a princípio, mas no final você economiza infinitamente mais tempo para usar os métodos deles.

Na verdade, eu sugiro que você provavelmente nunca termine se tentar fazer as coisas do zero, supondo que esteja criando um jogo de física. Porque calcular coisas como atrito, flutuabilidade e para não mencionar / detecção eficiente / de colisão, levará uma vida inteira.


0

Encontrei uma solução alternativa para isso, mas não tenho certeza se essa é uma boa maneira de codificar.

Quando uma tecla é pressionada, defino a velocidade angular para 10 e, a cada atualização, peço que verifique

    if(weapon.getAngle() >= Math.PI / 2) {
        weapon.setAngularVelocity(-10);
    }
    if(weapon.getAngle() <= 0) {
        weapon.setAngularVelocity(0);
    }

Dentro do, if(weapon.getAngle() <= 0)você também deve colocá-lo manualmente no ângulo específico que deseja, caso contrário, não será preciso e você precisará de uma if-elsedeclaração em vez de if-if. Tudo se resume à codificação java básica, que não tem muito a ver com o problema específico do jogo.
dimitris93

0

Pelo que você está dizendo, parece que você também pode ter que simplesmente mover o código que redefine a velocidade angular depois que um determinado ângulo é atingido. Eu suspeito que esse código seja usado apenas quando o botão for pressionado, pois você diz que pressionar o botão uma segunda vez faz o movimento parar (e, portanto, faz o código de teste funcionar).

Se for esse o caso, você pode movê-lo para uma instrução 'else' após o código que testa se a tecla é pressionada.


0

Uma coisa que você pode fazer é comandar, execute um método que crie um corpo em relação à posição do corpo principal usando body.getPosition.set (); defina os bits de filtro para não colidirem e, em seguida, defina a velocidade linear ou aplique força, o que você quiser movê-lo para frente depois de iniciar um timer para destruir após x quantidade de loops de jogo

Ou você pode fazer o mesmo, mas, ao invés disso, criar uma articulação de distância combinada com uma articulação prismática somente ao longo do eixo x para fazer um movimento repentino com a colisão conectada como falsa, para que não colidir com o corpo principal. provavelmente funciona melhor,

Para um ataque de giro, crie um corpo semelhante girado metade do pi com apenas a ponta da espada conectada ao corpo principal com colisão conectada a igual falso falso, é claro, então você pode aplicar força motora na articulação e um impulso angular no corpo da espada destruí-lo após uma rotação definida do corpo ou após um certo período de tempo,

se precisar de ajuda extra, basta comentar abaixo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.