Módulo 8 · Aula 8.4 · Colisões, Area2D e sinais
| Carga horária | Dificuldade | Ferramenta | Competências |
|---|---|---|---|
| 10 h/a | ⭐⭐⭐ | Godot 4.7 | C1, C2 |
Objetivos de aprendizagem
- Diferenciar
CharacterBody2D(corpo que se move e bate) deArea2D(área que só percebe quem entrou). - Conectar um sinal pronto (
body_entered) a uma função, pela aba Sinais. - Criar um sinal próprio com
signale avisar comemit(). - Usar grupos para saber quem encostou.
Pré-requisitos
Aula 8.3.
Materiais
Godot 4.7; Sementes em Godot (semente.tscn, redemoinho.tscn, jogo.tscn).
Conceitos
Area2D. Uma área invisível com uma forma de colisão. Não empurra nada; só percebe. A semente e o redemoinho são Area2D: quando o corpo do jogador entra, elas ficam sabendo.
Sinal. Um aviso que um nó dá: "alguém entrou em mim" (body_entered), "o tempo acabou" (timeout, do Timer). Quem quiser ouvir conecta o sinal a uma função. É como "quando receber mensagem" do Scratch (Aula 1.2): quem avisa não precisa saber quem ouve.
Duas conversas no Sementes.
Semente --body_entered--> semente.gd: _on_body_entered --coletada--> jogo.gd: _on_semente_coletada
Redemoinho --body_entered--> redemoinho.gd: _on_body_entered --encostou--> jogo.gd: _on_redemoinho_encostou
TempoPartida --timeout--> jogo.gd: _on_tempo_partida_timeoutA semente não mexe nos pontos: ela só avisa coletada. Quem conta é a cena do jogo. Assim a semente serve para qualquer jogo.
Sinal próprio.
signal coletada # cria o sinal
coletada.emit() # avisaGrupo. Etiqueta que se põe em nós (aba Grupos, ao lado de Sinais). O jogador está no grupo jogador. Na semente, body.is_in_group("jogador") garante que só o jogador coleta.
Conectar pelo editor ou pelo código. Pela aba Sinais: escolhe o sinal, Conectar..., escolhe o nó e o Método Receptor:. Pelo código: semente.coletada.connect(_on_semente_coletada) (usado quando o nó é criado pelo código, Aula 8.5).
Exemplos
| Sinal | Nó | Quando acontece |
|---|---|---|
body_entered(body) | Area2D | um corpo entrou na área |
area_entered(area) | Area2D | outra área entrou |
timeout() | Timer | o tempo acabou |
pressed() | Button | clicaram no botão |
coletada() | semente (próprio) | o jogador pegou a semente |
Tutorial passo a passo
Parte A. Ver as conexões (60 min)
- Abra
redemoinho.tscn, selecione a raiz e a aba Sinais. Vejabody_enteredcom a setinha verde: está conectado a_on_body_entered. - Abra
jogo.tscn, selecioneRedemoinho: aparece o sinal próprioencostou()ligado a_on_redemoinho_encostou(captura abaixo). - No script, o ícone verde ao lado do número da linha também mostra que a função recebe um sinal.
Parte B. Fazer uma semente (150 min)
- Cena nova, raiz
Area2DchamadaSemente, filhosSprite2D(Desenho) eCollisionShape2D(Colisao, círculo de raio 10). - Anexe o script
semente.gd(abaixo). - Na aba Sinais, dois cliques em
body_entered→ Conectar ao próprio nó, método_on_body_entered. - No jogador, aba Grupos, adicione o grupo
jogador.
Parte C. Ouvir na cena do jogo (150 min)
- Coloque três sementes na cena do jogo (arrastando
semente.tscn). - No script do jogo, uma variável
pontose a função_on_semente_coletadaque soma 1 e mostra comprint. - Conecte o sinal
coletadade cada semente a essa função pela aba Sinais. - Execute e colete. A Saída mostra os pontos?
Parte D. Redemoinho (60 min)
- Leia
redemoinho.gd: ele anda até o jogador commove_towarde avisaencostou. Explique para a dupla por que ele éArea2De nãoCharacterBody2D.
Imagens
../../../recursos/imagens/godot/captura-godot-sinais-semente.png
: aba Sinais da semente.../../../recursos/imagens/godot/captura-godot-sinais-redemoinho.png
: sinal próprio encostou()conectado ao script do jogo.
Indicação da interface
| Item | Nome na tela |
|---|---|
| lista de sinais do nó | aba Sinais (ao lado de Inspetor e Grupos) |
| conectar | dois cliques no sinal, ou botão Conectar... embaixo da aba |
| janela de conexão | Conectar um Sinal a um Método, campo Método Receptor:, botão Conectar |
| desligar | Desconectar |
| grupos | aba Grupos |
A janela Conectar um Sinal a um Método não foi fotografada nesta versão; os nomes foram lidos das traduções do Godot 4.7.2.
O código completo
scripts/semente.gd:
extends Area2D
signal coletada
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("jogador"):
coletada.emit()
queue_free()scripts/redemoinho.gd:
extends Area2D
signal encostou
var velocidade := 60.0
var jogador: Node2D
func _physics_process(delta: float) -> void:
if jogador != null:
position = position.move_toward(jogador.position, velocidade * delta)
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("jogador"):
encostou.emit()Explicação do código
queue_free()apaga o nó no fim do quadro (com segurança).move_toward(alvo, passo)anda até o alvo, no máximopassopixels.jogadorcomeça vazio; quem preenche é a cena do jogo, no_ready(redemoinho.jogador = jogador). Assim o redemoinho não precisa saber onde o jogador está na árvore.
Resultado esperado
Sementes que somem e avisam, cena que conta os pontos, redemoinho que avisa ao encostar.
Problemas comuns
| Sintoma | Causa | Solução |
|---|---|---|
| encosta e nada acontece | sinal não conectado | conferir a setinha verde na aba Sinais |
| encosta e nada acontece (2) | falta CollisionShape2D, ou forma vazia | dar uma forma à colisão (o editor mostra um aviso amarelo no nó) |
| a semente some quando o redemoinho passa | não conferiu o grupo | is_in_group("jogador") |
| erro "method not found" | nome da função diferente do conectado | renomear igual nos dois lugares |
Exercício guiado
Por que a semente avisa coletada em vez de somar os pontos ela mesma? (Resposta: para a semente não depender da cena do jogo; quem decide o que fazer com o aviso é quem ouve. Dá para usar a mesma semente em outro jogo.)
Desafio individual
Crie uma "semente dourada" que vale 3 pontos: um sinal coletada com um valor (signal coletada(valor: int) e coletada.emit(3)).
Desafio avançado (opcional)
Faça o redemoinho emitir um sinal perto quando estiver a menos de 100 pixels, e a cena mostrar um aviso "Cuidado!".
Critérios de avaliação
- Explica Area2D × CharacterBody2D.
- Sinal pronto e sinal próprio funcionando.
- Usa grupo para filtrar quem encostou.
Checklist de conclusão
Extensão
Desenhe no caderno as "conversas" de um jogo de futebol: quem avisa o quê (bola entrou no gol, tempo acabou) e quem ouve.