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.8 · Dados: Resource e dicionário

Carga horáriaDificuldadeFerramentaCompetências
6 h/a⭐⭐⭐Godot 4.7C2, C3

Objetivos de aprendizagem

  1. Guardar textos num dicionário ({"chave": "valor"}) e ler pela chave.
  2. Criar um tipo de dado próprio com class_name e extends Resource.
  3. Criar e editar arquivos .tres no Inspetor, sem mexer no código.
  4. Mostrar dinheiro em centavos como "R$ 7,65" com %d e %02d.

Pré-requisitos

Aula 7.2 (lista de estruturas na Feira do Troco). Aula 7.7 (centavos inteiros). Aula 8.7.

Materiais

Godot 4.7; laboratório: dados/fregues.gd, dados/rita.tres, joao.tres, lia.tres, cena fregueses.tscn.

Conceitos

Dicionário. Guarda pares chave → valor. É a "estrutura" do GDevelop (Aula 4.9) em forma de código.

const FALAS := {
	"ola": "Bom dia!",
	"pedido": "Vou levar %s.",
}
print(FALAS["ola"])   # Bom dia!

Resource próprio. Um molde de dados com campos fixos. Cada freguês da Feira vira um arquivo .tres com nome, item, preço, pagamento e retrato. Quem não programa (o professor parceiro do Projeto 4, por exemplo) pode mudar os preços no Inspetor sem abrir o código.

class_name Fregues
extends Resource

@export var nome := ""
@export var preco_centavos := 0

class_name Fregues dá um nome ao tipo: depois disso, Fregues aparece como opção ao criar um recurso novo e pode ser usado no código (Array[Fregues]).

Lista tipada. @export var fregueses: Array[Fregues] = [] mostra no Inspetor uma lista onde só entram fregueses.

Dinheiro formatado.

func reais(centavos: int) -> String:
	return "R$ %d,%02d" % [floori(centavos / 100.0), centavos % 100]

%02d escreve o número com 2 dígitos, completando com zero: 5 vira "05". Bem mais curto do que a conta da Feira no GDevelop (Aula 7.7), que precisava de SubStr.

Exemplos

DadoMelhor jeito
falas fixas do jogodicionário (const)
fregueses, inimigos, itens com vários camposResource próprio em arquivos .tres
pontos da partidavariável

Tutorial passo a passo

Parte A. Ler o exemplo (60 min)

  1. Abra dados/rita.tres com dois cliques: o Inspetor mostra os campos de Fregues (captura abaixo).
  2. Abra fregueses.tscn, selecione a raiz e veja a lista Fregueses no Inspetor com os três arquivos.
  3. Execute a cena. Enter chama o próximo freguês; no fim aparece "Acabou a fila. Até sábado!".

Parte B. Novo freguês sem código (60 min)

  1. Na aba Arquivos, clique com o botão direito na pasta dados e crie um recurso novo do tipo Fregues (o caminho exato do menu não foi conferido nesta versão). Salve como chico.tres.
  2. Preencha no Inspetor: Seu Chico, rapadura e queijo, 1235, 2000, e arraste um retrato.
  3. Acrescente o arquivo na lista Fregueses da cena e execute. O troco aparece como "R$ 7,65"?

Parte C. Dicionário de falas (90 min)

  1. Acrescente ao FALAS a chave "obrigado" e mostre essa fala junto.
  2. Faça falas diferentes por freguês: acrescente um campo @export var jeito_de_falar := "" no Fregues e use no texto.

Parte D. Testar a formatação (30 min)

  1. No _ready, mostre com print o resultado de reais para 5, 50, 100, 765 e 1000. Confira cada um.

Imagens

  • ../../../recursos/imagens/godot/captura-godot-recurso-fregues.png: o arquivo rita.tres aberto no Inspetor.
  • ../../../recursos/imagens/godot/laboratorio-tela-fregueses.png: a cena rodando com a Dona Rita.

Indicação da interface

ItemNome na tela
campos do ResourceInspetor, numa seção com o nome do tipo (Fregues)
abrir um .tresdois cliques na aba Arquivos
salvar o recursoícone de disquete no alto do Inspetor
lista de fregueses da cenapropriedade Fregueses da raiz da cena

O código completo

dados/fregues.gd:

class_name Fregues
extends Resource

@export var nome := ""
@export var item := ""
@export var preco_centavos := 0
@export var pago_centavos := 0
@export var retrato: Texture2D


func troco() -> int:
	return pago_centavos - preco_centavos

scripts/fila_de_fregueses.gd:

extends Control

const FALAS := {
	"ola": "Bom dia!",
	"pedido": "Vou levar %s.",
	"troco": "O troco é %s.",
	"fim": "Acabou a fila. Até sábado!",
}

@export var fregueses: Array[Fregues] = []

var vez := 0

@onready var retrato: TextureRect = $Retrato
@onready var fala: Label = $Fala


func _ready() -> void:
	mostrar()


func _unhandled_input(event: InputEvent) -> void:
	if event.is_action_pressed("ui_accept"):
		vez += 1
		mostrar()


func mostrar() -> void:
	if vez >= fregueses.size():
		retrato.texture = null
		fala.text = FALAS["fim"]
		return
	var f := fregueses[vez]
	retrato.texture = f.retrato
	fala.text = "%s: %s\n%s\n%s" % [f.nome, FALAS["ola"], FALAS["pedido"] % f.item,
			FALAS["troco"] % reais(f.troco())]


func reais(centavos: int) -> String:
	return "R$ %d,%02d" % [floori(centavos / 100.0), centavos % 100]

Explicação do código

  • %s põe um texto no lugar; FALAS["pedido"] % f.item vira "Vou levar 1 kg de feijão.".
  • troco() mora no próprio Resource: o dado sabe fazer a conta dele.
  • centavos / 100.0 (com .0) evita o aviso de divisão de inteiros; floori arredonda para baixo.
  • O teste automático confere: três fregueses carregados, troco de 300, reais(765) = "R$ 7,65", reais(5) = "R$ 0,05", a fala completa e a fala de fim.

Resultado esperado

Novo freguês criado só pelo Inspetor, dicionário de falas ampliado e formatação de dinheiro conferida.

Problemas comuns

SintomaCausaSolução
Fregues não aparece na lista de tiposfalta class_name, ou o script tem erroconferir a primeira linha e salvar
campo novo não aparece no Inspetorfaltou @exportacrescentar @export
5 centavos aparece "R$ 0,5" em vez de "R$ 0,05"usou %d nos centavos%02d
erro de chave no dicionáriochave escrita diferenteconferir aspas e acentos ("ola" ≠ "olá")

Exercício guiado

Quanto dá reais(1005)? (Resposta: "R$ 10,05".)

Desafio individual

Refaça a Feira do Troco em Godot só com a parte do diálogo: cinco fregueses em .tres, a fala de cada um e o troco certo.

Desafio avançado (opcional)

Acrescente ao Resource um campo @export_multiline var fala_extra := "" e veja como o Inspetor muda para uma caixa de texto grande.

Critérios de avaliação

  • Resource próprio com class_name e campos @export.
  • Dados editados no Inspetor, sem mexer no código.
  • Formatação de dinheiro correta.

Checklist de conclusão

Extensão

Português: escreva as falas de três fregueses com jeitos de falar diferentes (Aula 7.1) e guarde no Resource.