Tutorial Godot 4: Como Criar um Sistema de Inventário (Parte 1)
Criar um sistema de inventário é um marco fundamental para quem deseja evoluir no desenvolvimento de jogos indie utilizando a Godot Engine 4. Se você está desenvolvendo um RPG, um jogo de sobrevivência ou aventura, saber gerenciar itens de forma profissional é essencial para o sucesso do seu projeto.
Neste guia prático, vamos programar a base lógica de um sistema de inventário modular, utilizando GDScript, garantindo que seu código seja limpo, organizado e fácil de escalar.
Por que o inventário é tão importante?
Um inventário bem planejado não é apenas uma lista de objetos: ele é parte da experiência do jogador. Ele permite:
- Dar ao jogador sensação de progressão.
- Implementar mecânicas de crafting, comércio e gerenciamento de recursos.
- Organizar armas, poções e recursos coletados.
O que um sistema de inventário profissional precisa ter?
Antes de codificar, é vital entender a arquitetura do seu game design. Para não cometer erros comuns de iniciante — como misturar o código do inventário diretamente no script do jogador — precisamos de uma estrutura que responda:
- Como gerenciar a lista de itens de forma otimizada?
- Como organizar o código para evitar bugs (manutenibilidade)?
- Como preparar a base para uma interface de usuário (UI)?
Uma boa prática é manter o inventário como um nó independente, que pode ser instanciado em diferentes personagens ou até mesmo em baús e lojas dentro do jogo. Isso evita duplicação de código e facilita a manutenção.
Organização do Projeto na Godot 4
Para manter seu projeto de jogo organizado, recomendo a seguinte hierarquia de pastas:
res://
├── Scenes/
├── Scripts/
├── Assets/
└── Inventory/
Programando a Base do Inventário com GDScript
Agora vamos criar o script Inventory.gd na pasta Scripts. Esse arquivo será o coração do nosso sistema de inventário, responsável por armazenar e manipular os itens do jogador.
extends Node
class_name Inventory
# Lista para armazenar nossos itens
var items = []
func add_item(item):
items.append(item)
print("Item adicionado: ", item)
func remove_item(item):
items.erase(item)
print("Item removido: ", item)
func has_item(item) -> bool:
return item in items
func count_items() -> int:
return items.size()
func clear_inventory():
items.clear()
print("Inventário limpo.")
Entendendo o Código Passo a Passo
- extends Node: Diz à Godot que este script é baseado na classe
Node. Isso significa que o inventário pode ser usado como um nó dentro da cena, podendo ser instanciado em qualquer personagem ou objeto do jogo. - class_name Inventory: Registra a classe com o nome
Inventory. Assim, você pode criar novos inventários em outros scripts simplesmente chamandoInventory.new(), sem precisar usarload()oupreload(). - var items = []: Cria um Array vazio que servirá como a lista de itens. Neste estágio inicial, cada item é apenas um texto (string), mas futuramente será substituído por objetos mais complexos chamados Resources, contendo atributos como nome, descrição, peso e ícone.
- func add_item(item): Adiciona um novo item ao inventário usando
append(). Também imprime no console uma mensagem para confirmar que o item foi adicionado. - func remove_item(item): Remove um item específico da lista usando
erase(). Se o item não existir, nada acontece. Essa função também imprime no console para facilitar o debug. - func has_item(item) -> bool: Retorna
trueoufalsedependendo se o item existe no inventário. Isso é útil para verificar se o jogador possui determinado recurso antes de usar. - func count_items() -> int: Retorna o número total de itens no inventário usando
size(). Isso pode ser usado para limitar a quantidade máxima de itens ou mostrar ao jogador quantos objetos ele possui. - func clear_inventory(): Remove todos os itens da lista com
clear(). Essa função pode ser usada em situações como reiniciar o jogo ou limpar o inventário após uma missão.
Por que essas funções são importantes?
Mesmo sendo simples, elas já oferecem uma base sólida para manipular o inventário. Com elas, você pode:
- Adicionar novos itens coletados pelo jogador.
- Remover itens usados ou descartados.
- Verificar se o jogador possui um item antes de permitir uma ação (ex: abrir uma porta com chave).
- Contar quantos itens existem para aplicar limites ou regras de jogo.
- Limpar o inventário em eventos específicos.
Essas funções tornam o inventário flexível e fácil de expandir. Na próxima etapa, vamos conectar esse sistema ao personagem e testar na prática.
Testando sua Implementação
Agora que criamos a base do inventário, é hora de testar na prática. Essa etapa é essencial para garantir que o sistema esteja funcionando corretamente e que você entenda como integrá-lo ao seu personagem.
Criando a Cena do Jogador (Player.tscn)
Agora vamos montar a cena do jogador na Godot 4, passo a passo, para que você consiga testar o inventário dentro de um personagem controlável.
1. Criando a cena
No editor da Godot, clique em Outro Nó. Pesquise por CharacterBody2D, e click no icone dele para selecionar, logo em seguida em Criar. Esse será o nó principal que representa o jogador.
O CharacterBody2D já vem com funções próprias para movimentação, como move_and_slide(), o que facilita bastante.
2. Adicionando o Sprite2D
- Em Cena, a esquerda da tela, clique em Adicionar Nó Filho, ou aperte Ctrl + A.
- Pesquise e selecione Sprite2D e click em Criar.
- No Inspector que ficar a direita da tela, click em Texture, carregue uma imagem (ou arraste uma imagem para dentro).
Esse sprite será a parte visual do jogador.
3. Adicionando a CollisionShape2D
Em Cena, click uma vez emCharacterBody2D. logo em seguida click novamente em Adicionar Nó Filho, ou aperte Ctrl + A.- Pesquise e selecione CollisionShape2D e click em Criar.
- No Inspector que ficar a direita da tela, em Shape, click na seta para baixo (carregamento rapido) e escolha RectangleShape2D ou CircleShape2D.
- Ajuste o tamanho da forma para cobrir o sprite.
Essa forma define a área de colisão do jogador, permitindo que ele interaja com o cenário.
4. Estrutura da cena
Player (CharacterBody2D)
├── Sprite2D
└── CollisionShape2D
5. Criando o script do jogador
Em Cena, selecione com um click o nó CharacterBody2D adicione um script chamado Player.gd. Esse script controlará o movimento e também instanciará o inventário.
extends CharacterBody2D
# Instanciando o inventário
var inventario = Inventory.new()
# Velocidade do jogador
var speed = 200
func _ready():
# Testando o inventário
inventario.add_item("Espada de Ferro")
inventario.add_item("Poção de Cura")
print("Inventário inicial: ", inventario.items)
func _physics_process(delta):
var direction = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
direction.x += 1
if Input.is_action_pressed("ui_left"):
direction.x -= 1
if Input.is_action_pressed("ui_down"):
direction.y += 1
if Input.is_action_pressed("ui_up"):
direction.y -= 1
velocity = direction.normalized() * speed
move_and_slide()
Aperte Ctrl + S, nomeie de Player, e salve na pasta Scenes.
6. Testando
Vamos testar o jogos de maneira simples, aperte no botão Play, que ficar na parte superior direita da tela, ou perte o botão F5, e clique em selecionar atual,
7. Rodando o Jogo
Quando você clica para rodar o projeto, a primeira coisa que aparece é apenas o personagem que colocamos na cena usando o Sprite2D (um tipo de objeto que serve para mostrar imagens na tela).
Se você apertar as setas do teclado, já vai perceber que o personagem consegue se mover — isso mostra que o controle básico está funcionando.
Agora, para testar se o inventário está funcionando, faça o seguinte:
Minimize a janela do jogo.
Olhe para a parte chamada Saída (Output) dentro do Godot 4.
Se tudo estiver certo, vão aparecer mensagens ali confirmando que o inventário foi ativado.
Mensagens de Saída
Item adicionado: Espada de Ferro
Item adicionado: Poção de Cura
Inventário inicial: ["Espada de Ferro", "Poção de Cura"]
8. Testando o Inventário em Tempo Real
Até aqui, nosso inventário foi testado apenas quando o jogo iniciou, dentro da função _ready(). Isso funciona, mas não é muito prático. Afinal, durante o jogo o jogador coleta, usa e descarta itens a qualquer momento.
Vamos deixar esse teste mais interessante permitindo adicionar e remover itens enquanto o jogo está rodando.
Passo 1 — Abra o script do jogador
No painel Cena, selecione o nó Player (CharacterBody2D) e abra o script Player.gd (ou play.gd, caso você tenha usado esse nome).
É o mesmo script que criamos anteriormente, onde já existem as funções _ready() e _physics_process().
Passo 2 — Adicione uma nova função
Role até o final do arquivo e, logo abaixo da função _physics_process(), cole o código abaixo.
Não substitua nenhum código existente. Apenas adicione esta nova função no final do script.
func _process(delta):
# Enter adiciona um item
if Input.is_action_just_pressed("ui_accept"):
inventario.add_item("Arco de Caça")
print("Inventário atual: ", inventario.items)
# Esc remove esse item
if Input.is_action_just_pressed("ui_cancel"):
inventario.remove_item("Arco de Caça")
print("Inventário atual: ", inventario.items)
Passo 3 — Salve o projeto
Pressione Ctrl + S para salvar o script.
Passo 4 — Execute o jogo
Agora pressione F5 para iniciar o projeto.
Assim que o personagem aparecer na tela:
- Pressione Enter para adicionar um Arco de Caça ao inventário.
- Pressione Esc para remover esse item.
Depois de cada ação, minimize a janela do jogo e observe o painel Output da Godot. Você verá a lista do inventário sendo atualizada automaticamente.
O que essa função faz?
A função _process() é executada continuamente enquanto o jogo está rodando. Ela verifica, a cada quadro, se alguma tecla foi pressionada.
ui_acceptcorresponde à tecla Enter nas configurações padrão da Godot.ui_cancelcorresponde à tecla Esc.
Quando pressionamos Enter, chamamos a função add_item(), adicionando um novo item ao inventário.
Quando pressionamos Esc, chamamos remove_item(), removendo esse mesmo item.
Já a função print() serve apenas para mostrar o conteúdo atual do inventário no painel Output, facilitando nossos testes.
Neste ponto você já possui um inventário completamente funcional. Mesmo sem uma interface gráfica, já é possível adicionar, remover e verificar os itens durante a execução do jogo. Na próxima parte do tutorial vamos construir a interface visual (UI), mostrando cada item na tela como acontece em jogos profissionais.
Próximos Passos
Com essa base, você já consegue manipular itens no inventário. O próximo passo será conectar esse sistema a uma interface visual (UI), permitindo que o jogador veja os itens na tela em tempo real. Mas antes disso, é importante garantir que todas as funções básicas estejam funcionando corretamente.
Dica: sempre teste seu inventário em diferentes situações. Isso evita bugs futuros e garante que sua lógica esteja sólida antes de avançar para recursos mais complexos.

Comentários
Postar um comentário
Tem alguma dúvida sobre este código ou sugestão de melhoria? Comente abaixo! Respondo a todas as perguntas técnicas.