Voltar para o Blog
Quest Log

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

Cena low poly de jogo de sobrevivência com fogueira, mesa de craft, abrigo de madeira e ícones de recursos flutuando numa floresta ao pôr do sol

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.

Próximo nível
Quer aprender isso na prática?

No CursoGame.Dev você sai dos tutoriais soltos e constrói jogos publicáveis, com trilha progressiva, quests práticas e feedback real.

Conhecer a plataforma
+500 alunos4.9/5Garantia 7 dias

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.