Sou novo no Stack Overflow e no Game Development, então desculpe se essa pergunta for estúpida. Atualmente, estou trabalhando em um jogo no godot onde um jogador pode atirar projéteis em inimigos (simplificação excessiva). No entanto, tenho o seguinte problema: o projétil surge dentro do modelo do jogador e então colide com o jogador que o atira e ricocheteia. Meu projétil usa o tipo RigidBody2D e o Player é um CharacterBody2D.
Eu tentei o seguinte:
Defina a máscara da camada de colisão para estar em uma camada diferente do player
Problema: O projétil deve ricochetear nas paredes e então deve ser capaz de atingir o jogador. Então, os dois precisam ter colisão.
Faça a primeira sugestão, mas habilite a camada de máscara após o primeiro salto de parede
Problema: Mais tarde, quero usar algo semelhante a mísseis guiados. O jogador pode atirar mísseis que seguem o mouse e então atingem os inimigos ou o jogador. Então, o projétil deve ser capaz de colidir com o jogador sem um salto na parede.
Faça a primeira sugestão, mas habilite a camada de máscara após x quantidade de milissegundos
Problema: Os projéteis têm velocidades diferentes e o jogador pode ter modelos de tamanhos diferentes, então eu gostaria de evitar algo assim.
Gere o projétil com um deslocamento para que ele comece fora da área de impacto do jogador
Problema: Eu tentei isso e não pareceu, especialmente com modelos de jogadores variados. Mas se não houver outra solução, essa provavelmente seria a melhor opção.
Basicamente, eu gostaria de desabilitar a colisão entre os dois, então ter o sinal body_exited disparado quando o projétil sai da hitbox do jogador e então reativar a colisão. O problema é que se eu desabilitar a colisão, o sinal body_exited não dispara porque não há colisão. Mas com a colisão habilitada, o projétil ricocheteia no jogador. Basicamente, o que eu quero é que não haja interação física entre os dois inicialmente, mas com detecção de colisão ativa. Qualquer ajuda seria apreciada. Além disso, como sou novo, conselhos de melhores práticas são muito apreciados. Se o que estou fazendo é considerado uma prática ruim, por favor me avise.
Honestamente, eu usaria o deslocamento, mas teria um efeito diferente para a animação de tiro.
No entanto, se você realmente quiser fazer isso, minha sugestão é usar uma área em cima do personagem para detectar o projétil. Assim que o projétil sai da área, você habilita a colisão para o projétil.
Dessa forma, se o modelo/tamanho/escala do personagem for diferente, você pode ajustar a área de acordo. Então você não precisa depender de um timer propenso a erros.
Sobre desabilitar a colisão, além de desabilitar as formas de colisão e alterar as camadas, você pode adicionar uma exceção do código usando
add_collision_exception_with
, que você pode então remover comremove_collision_exception_with
. Dessa forma, você pode desabilitar a colisão entre o personagem e o projétil sem desabilitar mais nada.