• Jogos
  • 06. Colisões

Colisões

Colisão com ponto

Ao detectar colisões, o formato dos objetos faz toda a diferença. A maneira mais simples de detectar se houve colisão é envolver o objeto em um círculo ou retângulo e checar por colisões entre essas formas. Vamos começar com dois exercícios: checar se o usuário clicou em um círculo e em um retângulo.

Neste exercício criaremos "botões" usando pygame. Para isso, precisamos desenvolver funções para verificar se um ponto está dentro de um retângulo e de um círculo. Usando essa função, checaremos se o ponteiro do mouse está dentro dos botões.

Para entender melhor as condições de cada tipo de colisão, interaja com cada um dos materiais abaixo (o material também está disponível na ferramenta GeoGebra).

Vamos começar pela colisão entre um ponto e um círculo. Mude o tamanho e posição do círculo e do ponto.

Exercício 1

Qual condição deve ser utilizada para verificar se um ponto está dentro de um círculo? Assuma que você tem as seguintes variáveis:

px  # Coordenada x do ponto
py  # Coordenada y do ponto
cx  # Coordenada x do centro do círculo
cy  # Coordenada y do centro do círculo
raio  # Raio do círculo

Resposta

A condição deve ser:

distancia_ponto_centro = ((cx - px)**2 + (cy - py)**2)**0.5
if distancia_ponto_centro <= raio:
    print('Dentro do círculo')
else:
    print('Fora do círculo')

Vamos agora para a colisão entre um ponto e um retângulo. Mude o tamanho e posição do retângulo e do ponto. Importante: no GeoGebra, o eixo vertical aumenta para cima. Ao passar os conceitos para o Pygame, lembre-se de considerar essa diferença.

Exercício 2

Qual condição deve ser utilizada para verificar se um ponto está dentro de um retângulo? Assuma que você tem as seguintes variáveis:

p_x  # Coordenada x do ponto
p_y  # Coordenada y do ponto
ret_x  # Coordenada x do lado esquerdo do retângulo
ret_y  # Coordenada y do lado superior do retângulo (aqui assumimos as coordenadas do Pygame, que aumentam para baixo)
ret_largura  # Largura do retângulo
ret_altura  # Altura do retângulo

Resposta

A condição deve ser:

if (
    ret_x <= p_x and 
    p_x <= ret_x + ret_largura and 
    ret_y <= p_y and 
    p_y <= ret_y + ret_altura
):
    print('Dentro do retângulo')
else:
    print('Fora do retângulo')

Exercício 3

Agora que você já sabe verificar a colisão entre um ponto e um círculo/retângulo, resolva o exercício Verifica cliques no VS Code.

Acessar exercício

Agora vamos resolver problemas com colisões entre formas geométricas.