Estou desenvolvendo um jogo no qual o jogador pode usar cordas para balançar (exatamente como o Spiderman ou o Bionic Commando ) e estou tendo problemas para implementar esse comportamento. Alguém pode me ajudar a fazer isso, quero dizer fórmulas de física e etc. Até agora eu tenho três idéias. Um deles usa a primavera, mas consome muito tempo e, às vezes, é instável. Os outros dois estão tentando calcular o próximo passo (um através do cálculo da energia potencial e outro através do cálculo do torque) e os dois quase batem sempre que o ator está tentando balançar.
Aqui está o código que escrevi para calcular o torque:
float dx = Runner->getPosition().x - ancher.x;
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;
physics
platformer
rope-physics
Ali1S232
fonte
fonte
Respostas:
Se você deseja um balanço rígido, para que a distância até o ponto de rotação seja constante, trate o personagem como um ponto em um círculo centrado no ponto de rotação. Dê a ele uma velocidade angular unidimensional (ao longo do círculo). Para cada quadro a aceleração angular deve estar
accelerationDueToGravity * cos(angleOfPlayerOnCircle)
(com 0 graus apontando para a direita).Se você deseja que a corda fique mais longa / mais curta, você pode usar o esquema acima e apenas variar o raio de cada quadro.
fonte
depois de muitas tentativas, fui com o box2d.
geralmente existem duas abordagens para esta simulação ou pelo menos eu encontrei 2:
em cada senario você precisa ter um ancher (que no meu caso era uma caixa estática). é melhor se você diminuir o peso das peças do cabo (use formas circulares ou retangulares), por exemplo, para ter uma física mais realista, defino sua densidade como 0,1 e, para a caixa conectada no final da corda, usei a densidade 10.
Outra coisa é que você precisa se preocupar com a forma como seu segmento de corda reage um ao outro. Eu só queria que minha corda se movesse livremente na cena, então marquei todos os acessórios como sensores. você pode precisar de uma abordagem diferente.
a próxima coisa com a qual você deve se preocupar é o número de iterações que você está executando na atualização mundial: para um segmento baixo de corda (talvez 8 no máximo), não há necessidade de usar um valor de iteração alto, talvez 10/10, o que o próprio box2d sugeriu é suficiente, mas se você aumentar o número de segmentos, por exemplo, tentei 30 segmentos, com baixo número de iterações, sua corda parece aumentar seu comprimento mais do que deveria, portanto, talvez você precise de novas iterações 40/40 para resolver essas situações.
após alguns testes, parece que a caixa 2d foi projetada para cenas com tamanhos de objeto de 0,1m a 10m e o tamanho máximo sugerido para cenas grandes é algo em torno de 50mx50m. tão básico que você precisa dimensionar seu objeto para baixo para corresponder a esses parâmetros. no meu caso, tentei passar as posições de pixel diretamente para o box2d, mas parecia que havia alguns limites de velocidade que impediam o mundo de se mover o mais rápido que deveria, então tive que escalar minha cena em torno de 64 vezes para obter os melhores resultados. embora eu não tenha me testado, existem alguns limites no box2d que o impedem de usar cenas maiores. por exemplo, há um valor definido no
b2Setting.h
arquivo.#define b2_maxTranslation 2.0f
Você pode alterar as configurações do box2d, mas isso não é recomendado.fonte
Você já pensou em diminuir a velocidade do movimento de giro com base na distância que a corda está da linha de prumo (no centro)?
fonte
Quando o jogador estiver além do comprimento da corda, ele será imediatamente empurrado para trás com uma força igual à distância pela qual ele passou. Isso deve funcionar sem parecer elástico e deve ser intuitivo para o jogador. Você pode ter que ajustar sua física para obter os melhores resultados para o seu jogo.
Quando a corda está presa. Salve um
maxLength
valor.A cada atualização, verifique
distance
entreplayer
asattachPoint
Se o valor
distance
for menor que amaxLength
atualização normalmente, nenhum efeito da corda.Se a distância for maior que a
maxLength
, encontre onormal
deattachPoint
para o jogador. Obtenha a diferença entre odistance
emaxLength
. Adicionar àplayerVelocity
,normal
multiplicado pela diferença.Pseudo-código:
fonte
dx = player.x - attachpoint.x
edy = player.y - attachpoint.y
.Se você olhar para http://www.cocos2d-iphone.org/archives/1112, há uma implementação de uma corda com um corpo rígido preso ao final da corda. Ele usa o Box2D para o mecanismo de física. Se você olhar o código-fonte, tenho certeza de que pode implementá-lo em qualquer idioma que desejar.
Além disso, o link acima para a pergunta Rope é meu e esta demonstração (link fornecido) acima realmente ajudou.
fonte