Estou verificando a colisão quanto a um personagem de jogo de plataforma, como mostra o item 1. Os pontos vermelhos são os pixels marcados e as linhas cinza indicam os eixos aos quais pertencem. Gosto dos resultados obtidos ao verificar a colisão dessa maneira (versus, digamos, caixa delimitadora). Tudo funciona exatamente como eu gostaria, exceto por um problema: detecção de esmagamento.
Nas imagens a seguir, a caixa azul clara representa o chão, a caixa laranja é um objeto e as setas indicam a direção do movimento.
A solução simples para detectar quando o jogador é esmagado é verificar se os pontos de colisão em lados opostos estão sendo acionados. Se estiverem, o jogador está sendo esmagado. No segundo, você pode ver um cenário de queda normal. O jogador está aterrado e os pontos de colisão superiores estão se cruzando com o objeto em queda. Isso desencadeia uma queda.
Os números 3, 4 e 5 apresentam cenários problemáticos. Em # 3, o jogador está se movendo em direção ao objeto, que está se movendo para cima. Um ponto de colisão do lado direito está atingindo o objeto, causando uma colisão e parando o jogador.
Agora, se o objeto continuar se movendo para cima e o jogador continuar se movendo para a direita (como mostra a # 4), o objeto limpa o ponto de colisão do lado direito do jogador e o jogador se move para a direita. Mas agora, tendo feito isso, o objeto está cruzando um ponto de colisão superior, causando uma queda vertical indesejada.
Um cenário semelhante é mostrado em # 5. Dois objetos estão suficientemente distantes para que os pontos de colisão inferiores desapareçam, permitindo que o jogador caia, mas não o suficiente para permitir que os pontos de colisão laterais desapareçam, causando uma queda horizontal indesejada.
Estive procurando meu cérebro em uma solução, mas nada que tenha surgido funcionou particularmente bem, por isso estou me perguntando se alguém por aí tem uma ideia ou insight sobre como resolver esses problemas.
Para esclarecer alguma confusão, os pontos de colisão vermelhos estariam dentro do sprite e as linhas cinza foram usadas apenas para indicar o eixo relevante para cada ponto de colisão. Por exemplo, se o sprite do personagem fosse um quadrado verde simples, os pontos de colisão teriam algo parecido com isto: