Eu tenho um jogo simples em que o jogador move uma bola. A bola quica nas paredes. No momento, tenho paredes quadradas (■) implementadas: uso colisões de caixas delimitadoras simples para verificar se o jogador se moverá para uma parede ao atualizar sua velocidade x ou y; nesse caso, multiplico essa velocidade por -1 para fazê-las saltar .
No entanto, também quero implementar peças triangulares (◢◣◤◥). Para recuperar, acredito que se pode simplesmente usar:
newxspeed = -1*yspeed;
newyspeed = -1*xspeed;
No entanto, estou tendo problemas com a detecção de colisão: quando o jogador atinge a diagonal?
collision-detection
Qqwy
fonte
fonte
Respostas:
Antes de tudo, para calcular a detecção de colisão entre uma esfera (círculo em 2D) e uma linha, você precisa calcular o vetor perpendicular entre o centro da bola em movimento e a linha. Para calcular essa distância, é necessário fazer o seguinte:
Portanto, para calcular d na figura acima, precisamos executar algumas etapas.
Então você expande a equação para obter o seguinte, parece um pouco complicado, mas na verdade não é.
Onde Q é o centro do círculo e S é qualquer ponto da linha. Uma vez que a distância é menor que o raio do círculo / esfera, é necessário acionar a resposta de colisão, explicada no próximo ponto.
É incorreto sempre virar o componente x ou y para rebater a bola, o que você precisa fazer é refletir o vetor de velocidade. Para isso, é necessário calcular o vetor normal da superfície e usar esse normal para calcular a reflexão vector usando a seguinte equação
onde R é o vetor de reflexão, N é o normal da superfície e V é o vetor de velocidade.
No caso de 45 graus, sua superfície normal será N = (1,1,0) com sinal variável, dependendo de qual direção a face normal (posição ou negativo).
fonte
Você quer medir a distância entre o centro da sua bola e a parede, então:
resolver o sistema que você vê na figura fornecerá as coordenadas do ponto d.
Então, se a distância entre o ponto d e c for menor ou igual ao raio da bola r, haverá uma colisão entre a bola e a parede
fonte
Bolas são na verdade objetos bastante simples para detecção de colisão. Eles colidem com o terreno quando a distância entre o centro da bola e a borda do terreno se torna menor que o raio da bola. A posição do centro da bola deve ser trivial para obter. Encontrar o ponto mais próximo do terreno é geralmente mais complicado e a melhor maneira de fazê-lo depende de como o terreno é representado.
Seu algoritmo para calcular a nova velocidade após saltar de uma inclinação diagonal está incorreto. Inverter as coordenadas x e y fará a bola voltar na mesma direção em que se aproximou da inclinação. Isso é bom se a bola chegar ao terreno de um ângulo reto, mas falhar em outros ângulos. Você desejará negar apenas o componente normal à superfície; por exemplo, ao saltar do teto, você nega y, não x.
fonte