Pular para o conteúdo
Jogos Digitais
Nesta página
  1. Objetivos de aprendizagem
  2. Pré-requisitos
  3. Materiais
  4. Conceitos
  5. Exemplos
  6. Tutorial passo a passo
  7. Imagens
  8. Indicação da interface
  9. O código completo
  10. Explicação do código
  11. Resultado esperado
  12. Problemas comuns
  13. Exercício guiado
  14. Desafio individual
  15. Desafio avançado (opcional)
  16. Critérios de avaliação
  17. Checklist de conclusão
  18. Extensão

Módulo 8 · Aula 8.4 · Colisões, Area2D e sinais

Carga horáriaDificuldadeFerramentaCompetências
10 h/a⭐⭐⭐Godot 4.7C1, C2

Objetivos de aprendizagem

  1. Diferenciar CharacterBody2D (corpo que se move e bate) de Area2D (área que só percebe quem entrou).
  2. Conectar um sinal pronto (body_entered) a uma função, pela aba Sinais.
  3. Criar um sinal próprio com signal e avisar com emit().
  4. 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_timeout

A 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()        # avisa

Grupo. 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

SinalNóQuando acontece
body_entered(body)Area2Dum corpo entrou na área
area_entered(area)Area2Doutra área entrou
timeout()Timero tempo acabou
pressed()Buttonclicaram no botão
coletada()semente (próprio)o jogador pegou a semente

Tutorial passo a passo

Parte A. Ver as conexões (60 min)

  1. Abra redemoinho.tscn, selecione a raiz e a aba Sinais. Veja body_entered com a setinha verde: está conectado a _on_body_entered.
  2. Abra jogo.tscn, selecione Redemoinho: aparece o sinal próprio encostou() ligado a _on_redemoinho_encostou (captura abaixo).
  3. 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)

  1. Cena nova, raiz Area2D chamada Semente, filhos Sprite2D (Desenho) e CollisionShape2D (Colisao, círculo de raio 10).
  2. Anexe o script semente.gd (abaixo).
  3. Na aba Sinais, dois cliques em body_entered → Conectar ao próprio nó, método _on_body_entered.
  4. No jogador, aba Grupos, adicione o grupo jogador.

Parte C. Ouvir na cena do jogo (150 min)

  1. Coloque três sementes na cena do jogo (arrastando semente.tscn).
  2. No script do jogo, uma variável pontos e a função _on_semente_coletada que soma 1 e mostra com print.
  3. Conecte o sinal coletada de cada semente a essa função pela aba Sinais.
  4. Execute e colete. A Saída mostra os pontos?

Parte D. Redemoinho (60 min)

  1. Leia redemoinho.gd: ele anda até o jogador com move_toward e avisa encostou. Explique para a dupla por que ele é Area2D e não CharacterBody2D.

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

ItemNome na tela
lista de sinais do nóaba Sinais (ao lado de Inspetor e Grupos)
conectardois cliques no sinal, ou botão Conectar... embaixo da aba
janela de conexãoConectar um Sinal a um Método, campo Método Receptor:, botão Conectar
desligarDesconectar
gruposaba 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áximo passo pixels.
  • jogador começ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

SintomaCausaSolução
encosta e nada acontecesinal não conectadoconferir a setinha verde na aba Sinais
encosta e nada acontece (2)falta CollisionShape2D, ou forma vaziadar uma forma à colisão (o editor mostra um aviso amarelo no nó)
a semente some quando o redemoinho passanão conferiu o grupois_in_group("jogador")
erro "method not found"nome da função diferente do conectadorenomear 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.