A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Ter Jul 16, 2019 4:25 pm

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 1 mensagem ] 
Autor Mensagem
 Título: Colisão Slope Simples
MensagemEnviado: Qua Abr 03, 2019 5:26 pm 
Offline
Membro novo
Avatar do usuário

Registrado em: Ter Fev 19, 2019 7:16 pm
Mensagens: 5
Localização: Brasil - PE
Olá a todos, abro esse tópico para mostrar uma das muitas formas de usar colisão slope(declive) nos jogos.
Existem muitas formas de testar a colisão e aplicar os efeitos, desde algorítimos simples até o uso de algorítimos trigonométricos complexos. Nesse post vou mostrar uma forma muito simples e que exige muito pouco processamento.

Definindo os retângulos: Para fazer os testes e posicionar as entidades, precisamos saber suas posição e dimensão. Pra representar a entidade num plano 2D temos sua posição (x,y), e suas dimensões (w, h) onde
w é a largura e h é a altura. Então nosso retângulo é composto de (x, y, w, h).

Posição das entidades: Vamos usar o quarto quadrante do plano cartesiano sendo que os valores das ordenadas é positivo para baixo e negativo para cima. Então nossos pontos iniciais x,y são (0, 0) e finais (...n, ...n) onde n pode ser qual quer valor positivo ou negativo.

O Algorítimo: Vamos considerar uma força gravitacional fixa, que empurra o nosso objeto(player, etc) para baixo, assim quando ele tiver caindo sob o tile, esse algorítimo também vai ser útil. Outro ponto importante, não estamos considerando a possibilidade de saltar, apesar de se tratar de um exemplo de jogo de plataforma é muito simples implementar uma variável e teste se o player está pulado ou não em um slope, porém optei por deixar esse código o mais simples possível, para que vocês possam entender e aplicar a diferentes recursos dependendo da necessidade de cada projeto, esse exemplo funciona apenas se a gravidade aplicada sobre o objeto for maior que a velocidades horizontal, mesmo que uma pequena fração. Então temos:

1- Testamos se há colisão entre o objeto e o tile slope.
Código:
Código:
if (x1 + w1 < x2 || x1 > x2 + w2 || y1 + h1 < y2 || y1 > y2 + h2)
    return false;
else
    return true;

2- Se houver colisão obtemos primeiro a diferença dos lados no plano x:
se o slope é da esquerda para direita temos:
Código:
Código:
          /* x1 é a posição x do objeto que vai colidir, no nosso caso o player.
             x1 + (w1 / 2) é o ponto central inferior do objeto(player).
            x2 + (w2 / 2) + yfloor é o centro do slope + sua altura(yfloor), nesse caso em pixel.
         */
          int dif = x1 + (w1 / 2) - x2 + (w2 / 2) + yfloor;
         

o valor yfloor aumenta ou diminui o tamanho da parte solida do slope(que é a que colidimos).

3- Depois de obter essa diferença, vamos fazer um teste preciso para depois aplicar os valores. Se y1 for maior que y2 mais h2 menos dif(y1 >= y2 + h2 - dif) então:
aplicamos os valores ao eixo y do objeto: y1 = y2 + h2 - dif.
4- Por ultimo se um tile slope for da direita para esquerda, ao invés de usar dif com: int dif = x1 + (w1 / 2) - x2 + (w2 / 2) + yfloor, usamos dif assim: int dif = x2 + (w2 / 2) + yfloor - x1 + (w1 / 2);

Pronto é isso. usando esse simples algorítimo podemos implementar mais funcionalidades como salto, teste de colisão com tile comum(se um tile solido comum tiver na mesma altura do slope, podemos acrescentar + 1 ou - 1 para o teste condicional que posiciona o eixo y do nosso objeto(passo 3), para tirar o efeito de "teleporte" quando atingimos o slope após sair dele pode-se usar um tile solido nas arestas, ou adicionar mais condição ao teste if do passo 3, como acrescentar valor a dif apenas se o centro do player estiver antes do centro do slope, etc. Esse foi uma forma básica que encontrei para fazer esse teste de colisão slope, futuramente trago um post mais avançado usando vetores, quem tiver algo a acrescentar ou correção deixe ai embaixo. Obrigado, e até a próxima.

_________________
DWS
https://gundam7463.itch.io/


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 1 mensagem ] 

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB