A detecção de colisão afeta a maior parte do jogo, desde a posição do jogador em uma plataforma até a forma como ele destrói os inimigos.
A detecção de colisões é um dos aspectos críticos do desenvolvimento de jogos, impactando significativamente a experiência do jogador. A detecção precisa de colisões garante que os personagens do jogo interajam perfeitamente com seu ambiente, criando uma sensação de imersão e realismo.
Godot, um popular mecanismo de jogo de código aberto, fornece ferramentas poderosas para implementar detecção de colisão eficiente, resultando em uma jogabilidade suave e envolvente.
Configurando o jogo Godot
Antes de começar, crie um jogo de plataforma 2D simples em Godot 4. Comece configurando o cenário do jogo com um personagem do jogador e plataformas.
O código usado neste artigo está disponível neste Repositório GitHub e é gratuito para você usar sob a licença do MIT.
Crie uma nova cena e adicione um PersonagemBody2D nó como o nó raiz. Adicione um Sprite2D nó como filho do PersonagemBody2D para representar visualmente o personagem do jogador.
Próximo, adicione movimento ao jogador personagem usando GDScript:
extends CharacterBody2D
var speed = 300
func _physics_process(delta):
var input_dir = Vector2.ZEROif Input.is_action_pressed("ui_left"):
input_dir.x -= 1if Input.is_action_pressed("ui_right"):
input_dir.x += 1if Input.is_action_pressed("ui_up"):
input_dir.y -= 1if Input.is_action_pressed("ui_down"):
input_dir.y += 1
velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)
Finalmente, adicione plataformas à cena usando Corpo Estático2D nós para concluir a configuração básica.
Diferentes formas de colisão
Godot oferece uma variedade de formas de colisão que atendem a diferentes tipos de objetos de jogo. Esses formatos de colisão ajudam a definir com precisão a área dentro da qual ocorre a detecção de colisão.
Antes de mergulhar nas várias formas de colisão, é importante observar que você pode anexar uma diretamente ao personagem do jogador para definir sua área de colisão. Isso permite controlar a região precisa para detectar colisão.
Forma de colisão circular
Uma forma de colisão circular é particularmente útil para personagens que precisam interagir radialmente com o ambiente. Você pode usar esta forma para personagens com hitbox circular ou esférica. Para adicionar uma forma de colisão circular ao seu personagem do jogador:
# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape)
Forma de colisão retangular
As formas de colisão retangulares são adequadas para caracteres com formato mais quadradão ou retangular. Veja como você pode adicionar uma forma de colisão retangular:
# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var rect_shape = RectangleShape2D.new()
rect_shape.extents = Vector2(32, 64)
collision_shape.shape = rect_shape
add_child(collision_shape)
Forma de colisão de polígono convexo
As formas de colisão de polígonos convexos oferecem grande flexibilidade para caracteres com formas irregulares ou não retangulares. Você pode usar esta forma para combinar melhor com o contorno do seu personagem. Para adicionar uma forma de colisão de polígono convexo:
# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var polygon_shape = ConvexPolygonShape2D.new()
polygon_shape.set_points([Vector2(-32, -64), Vector2(32, -64), Vector2(0, 64)])
collision_shape.shape = polygon_shape
add_child(collision_shape)
Ao escolher a forma de colisão apropriada e anexá-la ao personagem do jogador, você pode precisamente detectar colisões dentro da área designada, aumentando a precisão das interações com o jogo mundo.
Detectando Colisões
Detectar colisões entre objetos é essencial para implementar interações e mecânicas de jogo. No Godot, você pode conseguir isso usando o mecanismo de física integrado.
# Detecting Collisions in _physics_process
func _physics_process(delta):
var input_dir = Vector2.ZERO
#... (input handling)velocity = input_dir.normalized() * speed
var collision = move_and_collide(velocity * delta)
if collision:
print("collided")
Abaixo está a saída:
Sinais de colisão e máscaras de colisão
Godot fornece sinais de colisão e máscaras de colisão como ferramentas poderosas para adicionar sofisticação ao seu jogo.
Sinais de colisão
Sinais de colisão são eventos que o mecanismo de física aciona quando ocorrem colisões. Esses sinais fornecem uma maneira para os objetos se comunicarem entre si e responderem às colisões. No Godot, você pode conectar-se a sinais de colisão para executar lógica personalizada quando ocorrerem eventos de colisão específicos.
Por exemplo, digamos que você queira reproduzir um efeito sonoro quando o personagem do jogador colidir com um item colecionável. Veja como você pode conseguir isso usando sinais de colisão:
# Inside the player character's script
func _ready():
connect("body_entered", self, "_on_body_entered")func _on_body_entered(body: Node):
if body.is_in_group("collectible"):
# Play a sound effect
play_collectible_sound()# Perform additional logic like collecting the item
# Remove the collectible from the scene
body.queue_free()
Neste exemplo, o corpo_entrado o sinal é emitido quando o personagem do jogador colide com outro corpo físico. Ao conectar este sinal ao _on_body_entered função, você pode responder ao evento de colisão. Se o corpo em colisão estiver no colecionável grupo, você pode reproduzir um efeito sonoro sem direitos autorais.
Máscaras de colisão
As máscaras de colisão permitem controlar quais camadas de colisão podem interagir entre si. Cada camada de colisão corresponde a um bit em uma máscara de bits. Ao atribuir camadas e máscaras de colisão a objetos, você pode ajustar quais objetos colidem entre si e otimizar o desempenho.
Por exemplo, imagine que você tem inimigos e balas no jogo. Você quer que os inimigos colidam com as plataformas, mas não entre si. Você também quer que as balas colidam com os inimigos, mas não com as plataformas. Veja como você pode conseguir isso usando máscaras de colisão:
# Inside the enemy's script
func _ready():
# Disable collision with other enemies
set_collision_mask_value(2, false)
# Enable collision with platforms
set_collision_mask_value(3, true)# Inside the bullet's script
func _ready():
# Enable collision with enemies
set_collision_mask_value(2, true)
# Disable collision with platforms
set_collision_mask_value(3, false)
Ao ativar ou desativar seletivamente as máscaras de colisão, você controla quais objetos podem colidir entre si, resultando em interações de colisão precisas e eficientes.
Melhores práticas para detecção de colisão
Para garantir uma jogabilidade suave e detecção de colisão eficiente, considere estas práticas recomendadas.
Use formas simples
Formas de colisão complexas podem consumir muitos recursos. Sempre que possível, use formas simples como círculos e retângulos para detecção de colisões.
Máscaras de colisão de camadas
Godot permite definir camadas e máscaras de colisão. Use-os para controlar quais objetos colidem entre si, otimizando o desempenho.
Por exemplo, em um jogo de plataforma, o o jogador pode pular em plataformas e deslizar pelas paredes. Ao configurar camadas e máscaras de colisão adequadamente, você pode obter comportamentos distintos.
Grupos de colisão
Agrupe objetos com propriedades de colisão semelhantes para facilitar o gerenciamento e a detecção eficiente de colisões.
Caixas delimitadoras
Para otimizar o desempenho, use caixas delimitadoras para verificar rapidamente se há objetos próximos antes de realizar uma detecção precisa de colisão.
Use consultas cinemáticas
Godot fornece consultas cinemáticas para realizar verificações de colisão sem realmente mover o objeto. Isto pode ser útil para prever colisões antes que elas aconteçam.
Tornando os jogos Godot mais envolventes com detecção de colisão
Incorporar detecção de colisão eficiente em seu jogo Godot não apenas garante uma interação perfeita entre os personagens e o ambiente, mas também abre oportunidades para uma jogabilidade criativa mecânica.
Quer se trate de desafios de plataforma, resolução de quebra-cabeças ou cenários de combate, a detecção de colisões está no centro do envolvimento do jogador. Ao adicionar detecção de colisão, você pode criar um jogo que cativa os jogadores com suas interações suaves e dinâmicas.