Como Fazer um Jogo de Sobrevivência: Sistemas, Escassez e o Loop do Gênero

Como fazer um jogo de sobrevivência: o loop do gênero, fome e energia na Godot com GDScript tipado, design da escassez e o escopo certo pra começar.
Como Fazer um Jogo de Sobrevivência: Sistemas, Escassez e o Loop do Gênero
Aprender como fazer um jogo de sobrevivência começa por entender uma coisa que não aparece na tela: o gênero não é sobre floresta, zumbi ou picareta. É sobre pressão. Minecraft, Valheim, The Forest e Don't Starve são jogos muito diferentes entre si, mas todos fazem a mesma pergunta ao jogador o tempo inteiro: o que você vai fazer agora, com o pouco que tem, sabendo que a noite está chegando? Enquanto essa pergunta tiver peso, o jogo funciona. Quando ela perde o peso, nenhum gráfico segura.
Este guia segue o mesmo espírito dos outros posts de gênero da casa: desmontar o survival em sistemas, mostrar como cada peça cria a sensação que o jogador reconhece, e dar o caminho prático na Godot pra você sair daqui com o núcleo do gênero rodando. Sem promessa de mundo aberto infinito. Com um plano que cabe na sua rotina.
O que define um jogo de sobrevivência
Dois ingredientes definem o gênero, e os dois precisam estar presentes ao mesmo tempo.
O primeiro é a pressão constante de recursos. Alguma coisa está sempre acabando: a fome sobe, a fogueira apaga, a ferramenta quebra, a noite consome a luz. O jogador nunca está em paz de verdade, ele está sempre em débito com o mundo. Essa pressão é o motor do gênero. Num RPG, o jogador avança porque quer a próxima recompensa. Num survival, ele se move porque parar significa morrer.
O segundo ingrediente são as decisões de risco e recompensa. A pressão sozinha seria só estresse. O que transforma estresse em jogo é o jogador escolher como responder: fico perto da base coletando madeira segura ou atravesso o rio atrás de ferro sabendo que posso não voltar? Gasto minha última comida agora ou aguento mais um pouco? Cada recurso melhor mora num lugar mais perigoso, e é essa troca que gera as histórias que as pessoas contam depois.
Esses dois ingredientes se organizam num loop que todo survival repete: coletar, craftar, sobreviver, expandir. Você coleta recursos do mundo, transforma esses recursos em itens e estruturas, usa o que criou pra atravessar a próxima ameaça, e a sobrevivência abre acesso a uma área ou tecnologia nova, que reinicia o ciclo num patamar mais alto. Minecraft inteiro é esse loop: madeira vira picareta, picareta vira pedra, pedra vira fornalha, fornalha vira ferro, e cada volta do ciclo expande o que é possível. Se o seu jogo tiver esse loop girando com pressão real, ele é um survival, mesmo que seja pequeno.
Os sistemas essenciais do gênero
Com o loop na cabeça, dá pra listar os sistemas que o sustentam. Nem todo survival tem todos, mas você precisa saber o papel de cada um pra escolher quais entram no seu.
Fome, sede e energia são os relógios de pressão. Barras que caem com o tempo e obrigam o jogador a agir. A função delas não é punir, é criar urgência: cada minuto parado tem custo, então explorar deixa de ser passeio e vira investimento. A regra de ouro é que cada barra precisa gerar uma decisão diferente. Fome empurra o jogador pra caçar e cozinhar, energia limita quanto ele aguenta fazer antes de precisar descansar. Se duas barras geram o mesmo comportamento, uma delas é redundante e só suja a tela.
A coleta de recursos é a interação básica com o mundo. Árvores, pedras, plantas, animais. O importante aqui é a distribuição: recursos comuns perto do ponto seguro, recursos valiosos longe e cercados de risco. É a geografia da escassez que cria as decisões de risco e recompensa, não o ato de apertar botão na árvore.
O crafting transforma coleta em progresso. É a ponte entre ter dez madeiras e ter um machado. Um bom sistema de craft com receitas definido em dados, e não em código espalhado, deixa você adicionar itens novos sem reescrever nada, e no survival isso importa mais que em qualquer outro gênero, porque a árvore de receitas é literalmente a progressão do jogo.
A construção de base dá permanência ao esforço. O abrigo é o placar do jogador: olhar pra parede que você levantou é ver o tempo investido materializado. Além do lado emocional, a base cria o ritmo espacial do gênero, com expedições que saem do seguro em direção ao perigoso e voltam.
O ciclo de dia e noite é o metrônomo. De dia o mundo tolera o jogador, de noite o mundo o ameaça. Esse pêndulo organiza a sessão de jogo em rodadas naturais de preparação e teste, e é o jeito mais barato de criar tensão: nada precisa acontecer, basta o sol começar a descer.
Por fim, inimigos e ameaças são a cobrança. Eles dão consequência concreta a estar despreparado. Não precisam ser criaturas: frio, tempestade e escuridão cumprem o mesmo papel. O que importa é que exista algo que transforme má preparação em perda.
Implementando as barras de sobrevivência na Godot
Chega de teoria, vamos pro relógio de pressão. O padrão na Godot 4 é um nó de stats separado do personagem, com um Timer dando o tique do decaimento e sinais avisando o resto do jogo quando algo importante acontece. Assim a interface, o áudio e a lógica de morte reagem aos sinais sem o nó de stats conhecer nenhum deles.
class_name StatsSobrevivencia
extends Node
signal stats_mudaram(fome: float, energia: float)
signal fome_zerou
signal energia_zerou
@export var fome_maxima: float = 100.0
@export var energia_maxima: float = 100.0
@export var decaimento_fome: float = 1.5
@export var decaimento_energia: float = 1.0
@export var intervalo_tick: float = 2.0
var fome: float = 100.0
var energia: float = 100.0
var tick: Timer = Timer.new()
func _ready() -> void:
fome = fome_maxima
energia = energia_maxima
tick.wait_time = intervalo_tick
tick.timeout.connect(_on_tick_timeout)
add_child(tick)
tick.start()
func _on_tick_timeout() -> void:
var fome_anterior: float = fome
var energia_anterior: float = energia
fome = maxf(fome - decaimento_fome, 0.0)
energia = maxf(energia - decaimento_energia, 0.0)
stats_mudaram.emit(fome, energia)
if fome == 0.0 and fome_anterior > 0.0:
fome_zerou.emit()
if energia == 0.0 and energia_anterior > 0.0:
energia_zerou.emit()
func comer(valor: float) -> void:
fome = minf(fome + valor, fome_maxima)
stats_mudaram.emit(fome, energia)
func descansar(valor: float) -> void:
energia = minf(energia + valor, energia_maxima)
stats_mudaram.emit(fome, energia)
Alguns detalhes desse código valem atenção. O decaimento acontece no timeout do Timer, não no _process, porque fome caindo a cada dois segundos é mais fácil de balancear que fome caindo a cada quadro, e você ajusta tudo mexendo em três números exportados no inspetor. Os sinais de zerou só disparam na transição, comparando o valor anterior com o novo, senão o jogo receberia o aviso de fome zerada a cada tique e a lógica de dano ficaria bagunçada. E maxf e minf mantêm os valores presos entre zero e o máximo sem nenhum if extra.
Pra mostrar isso na tela, conecte stats_mudaram a uma ProgressBar da sua interface e atualize o value dela com o valor recebido. Pra matar o jogador de fome, conecte fome_zerou ao nó de vida e comece a aplicar dano por tique. O mesmo desenho de barra que decai e se recupera aparece em outros contextos, e o guia de sistema de stamina na Godot mostra a variação desse padrão pra corrida e esforço físico, que combina bem com survival se a energia do seu jogo for gasta por ação e não só pelo tempo.
O design da escassez
Agora a parte que separa survival bom de survival chato: a economia interna. Todo jogo de sobrevivência é, por baixo, um sistema de torneiras e ralos. A torneira é a taxa com que cada recurso entra no mundo: quantas árvores existem, com que frequência a fruta renasce, quanto uma caçada rende. O ralo é a taxa com que o jogador consome: a velocidade do decaimento da fome, o custo das receitas, a durabilidade das ferramentas. O estado do seu jogo em qualquer momento é a diferença entre esses dois fluxos.
Se a torneira ganha com folga, a pressão desaparece. O jogador acumula um estoque gigante, as barras viram enfeite e o survival vira jogo de construção sem tensão. É o famoso momento em que o baú está cheio e o jogo acabou sem avisar. Se o ralo ganha sempre, o jogo vira frustração: o jogador corre atrás do próprio rabo, nunca sobra recurso pra experimentar, e cada erro pequeno vira espiral de morte. Tédio de um lado, raiva do outro, e o ponto certo fica numa faixa estreita entre os dois: o jogador quase confortável, com sobra pequena o bastante pra próxima expedição ainda valer o risco.
Esse equilíbrio não pode ser fixo, porque o jogador melhora. Ele decora onde os recursos ficam, otimiza rotas, monta estoque. Um jogo balanceado pra primeira hora fica fácil demais na quinta. Por isso os survivals escalam a pressão com o tempo: Don't Starve muda as estações e cada inverno cobra mais preparo, Valheim amarra a dificuldade ao bioma e cada região nova redefine o que é estar equipado. O seu jogo precisa de alguma versão disso, nem que seja noites que ficam mais longas ou ameaças que aparecem mais fundo no mapa. Essa matemática de fluxos, estoques e curvas é um assunto próprio, e o post sobre economia de jogo e design de recursos desce nos detalhes de como modelar e testar essas taxas antes de sair chutando número no inspetor.
Um atalho prático pra balancear: comece pelo consumo e derive a oferta. Decida quanto tempo uma barra cheia de fome deve durar em minutos reais de jogo, calcule quanta comida o jogador precisa por ciclo de dia, e então distribua no mundo um pouco menos do que isso em locais seguros. A diferença entre o que ele precisa e o que o lugar seguro oferece é exatamente o tamanho do risco que o jogo pede. Escassez boa é desenhada de trás pra frente.
Escopo: comece com uma mecânica de pressão
Conselho honesto pra fechar: o maior risco do seu survival não é o balanceamento, é o escopo. O gênero é uma armadilha nesse ponto, porque os jogos de referência são pilhas enormes de sistemas acoplados. Minecraft ficou anos em desenvolvimento antes de ser o jogo que você conhece, e continuou crescendo por mais de uma década com uma equipe inteira. Valheim e The Forest também não nasceram prontos. Tentar começar pelo pacote completo, com fome, sede, temperatura, sono, construção livre e mundo gerado, é a receita clássica do projeto abandonado no terceiro mês.
Um survival mínimo viável precisa de exatamente três coisas: um recurso, uma ameaça e um loop de craft. Um exemplo concreto: o jogador está numa clareira, a fogueira consome madeira, e quando o fogo apaga a escuridão mata. Pronto, isso é um jogo de sobrevivência inteiro. Madeira é o recurso, a escuridão é a ameaça, alimentar a fogueira é o loop. Dá pra construir isso em semanas com o nó de stats deste post, um contador de madeira e uma luz que diminui. E o mais importante: dá pra sentir se a pressão funciona antes de investir um ano.
Se esse núcleo for tenso e interessante, cada sistema novo multiplica o que já funciona: um machado craftável que acelera a coleta, uma segunda área com madeira melhor e mais perigo, uma barra de fome pra criar a segunda decisão. Se o núcleo for chato, nenhuma quantidade de sistemas por cima salva, e é melhor descobrir isso no primeiro mês do que depois de um ano de trabalho.
Comece pequeno, faça a pressão funcionar de verdade e cresça em cima do que já gera decisão. É assim que a gente encara qualquer gênero aqui no CursoGame.Dev, e o survival é onde esse conselho mais paga: o gênero inteiro cabe numa fogueira apagando.
Perguntas frequentes
Quais sistemas um jogo de sobrevivência precisa ter?
O núcleo do gênero é formado por barras de necessidade (fome, sede ou energia) que caem com o tempo, coleta de recursos, crafting, alguma forma de abrigo ou base e uma ameaça que pressiona o jogador, como o ciclo dia e noite ou inimigos. Nem todo survival tem todos esses sistemas, mas todos têm pelo menos uma fonte de pressão constante e um loop de coletar e craftar pra aliviar essa pressão.
Dá pra fazer um jogo de sobrevivência sozinho?
Dá, desde que o escopo seja honesto. Um survival mínimo viável tem um recurso, uma ameaça e um loop de craft curto, e isso cabe no trabalho de uma pessoa. O que não cabe é tentar recriar Minecraft ou Valheim de primeira, porque esses jogos são pilhas enormes de sistemas interligados construídas ao longo de anos por equipes inteiras.
Qual engine é melhor pra fazer um jogo de sobrevivência?
O Godot atende muito bem, tanto em 2D quanto em 3D, e é gratuito. Os sistemas centrais do gênero, como barras de status, inventário, crafting e ciclo de dia e noite, são lógica de jogo pura, então qualquer engine moderna dá conta. Pra quem está começando, o Godot tem a vantagem de ser leve e de o GDScript ser fácil de ler e escrever.
Como balancear a fome e os recursos num survival?
Pense em torneira e ralo: a taxa com que o recurso aparece no mundo é a torneira, a taxa com que o jogador consome é o ralo. Se a torneira ganha com folga, a pressão some e o jogo vira tédio. Se o ralo ganha sempre, o jogo vira frustração. O balanceamento bom deixa o jogador quase confortável, com sobra pequena o bastante pra cada expedição continuar valendo o risco.
Jogo de sobrevivência precisa de mundo aberto?
Não. Mundo aberto é o formato mais comum no gênero, mas a essência é a pressão de recursos e as decisões de risco e recompensa, não o tamanho do mapa. Don't Starve funciona em telas relativamente contidas e existem survivals ótimos em arenas pequenas. Pra um primeiro projeto, um mapa pequeno e denso é muito melhor que um mundo enorme e vazio.
Por onde começar a programar um survival na Godot?
Comece pelo relógio de pressão: um nó de stats com fome caindo num Timer e um sinal disparado quando chega a zero. Ligue essa barra numa ProgressBar na tela e crie um item que restaura fome. Com isso funcionando, você já tem o coração do gênero rodando e pode crescer em direção a coleta, craft e construção de base uma peça de cada vez.


