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.
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.
Respostas:
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:
E então, na medida em que realmente constrói os braços e outros enfeites, o trecho se parece com isso.
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.
fonte
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
fonte
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 umaif-else
declaração em vez deif-if
. Tudo se resume à codificação java básica, que não tem muito a ver com o problema específico do jogo.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.
fonte
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
fonte