Pular para o conteúdo

Colheita de Ouro: do zero ao jogo publicado

Bastidores5 min de leitura

Como nasceu a nossa fazenda em 3D feita em Godot, da câmera ao mercado e da versão para navegador ao Android, com um trecho do código real de cada etapa.

Trecho do código do Colheita de Ouro, em GDScript: as funções que dizem se a planta está pronta e que regam a planta

Colheita de Ouro é uma fazenda tranquila em 3D: você planta, rega, colhe e vende na caminhonete para ir aumentando a sua terra. Fizemos o jogo em Godot, com os modelos em Blender, e ele está grátis no navegador, pelo itch.io, desde 2 de novembro de 2026.

Do zero ao lançamento, em código

Estas são as etapas principais da construção, cada uma com um trecho curto do código real do jogo, em GDScript, a linguagem do Godot. As cinco primeiras aconteceram entre 31 de outubro e 1º de novembro, antes do primeiro registro no Git; por isso os trechos delas mostram o código como estava na versão publicada. No jogo, o código está em português; aqui os nomes e os comentários foram traduzidos para o inglês, com a mesma lógica.

  1. Passo 131 out a 1 nov

    Câmera e controles da fazenda

    Não há um personagem: quem passeia pela fazenda é a câmera, com WASD ou as setas do teclado.

    scripts/camera/farm_camera.gd
    func _process(delta: float) -> void:
        var direction: Vector2 = Input.get_vector(&"move_left", &"move_right", &"move_up", &"move_down")
        if direction == Vector2.ZERO:
            return
        # The "Camera speed" option multiplies it (dragging with a finger still follows the finger).
        var speed: float = keyboard_speed * _camera.size / initial_zoom * Options.camera_speed
        position += (_right() * direction.x - _forward() * direction.y) * speed * delta
        _clamp_position()
  2. Passo 231 out a 1 nov

    Plantar, regar e colher

    A planta só cresce enquanto tem água, e regar a tempo recupera a saúde dela.

    scripts/farm/plant.gd
    func is_ready() -> bool:
        return growth >= 1.0 and not wilted
    
    
    func water() -> void:
        if not wilted:
            water_level = 1.0
            health = 1.0  # watered in time: the wilting countdown restarts
  3. Passo 331 out a 1 nov

    Mercado e moedas

    A colheita vai para as vagas de venda da caminhonete, e cada unidade vendida vira moedas aos poucos.

    scripts/autoload/market.gd
    while slot["progress"] >= time and slot["remaining"] > 0:
        slot["progress"] -= time
        slot["remaining"] -= 1
        var value: int = price(slot["item"])
        slot["earned"] += value
        GameState.add_coins(value, &"sale", slot["item"])
        GameState.count(&"sold")
        changed = true
  4. Passo 431 out a 1 nov

    Salvamento automático

    O jogo salva sozinho quando a janela fecha ou quando o celular deixa o jogo em segundo plano.

    scripts/autoload/save_system.gd
    func _notification(what: int) -> void:
        match what:
            NOTIFICATION_WM_CLOSE_REQUEST, NOTIFICATION_APPLICATION_PAUSED, NOTIFICATION_APPLICATION_FOCUS_OUT:
                save()
                upload_to_cloud()
  5. Passo 531 out a 1 nov

    Toque com dois dedos

    No celular, a câmera guarda cada dedo na tela. Com dois dedos, começa o gesto de mover, aproximar e girar.

    scripts/camera/farm_camera.gd
    func _handle_touch(touch: InputEventScreenTouch) -> void:
        if touch.pressed:
            _touches[touch.index] = touch.position
        else:
            _touches.erase(touch.index)
        if _touches.size() == 2:
            _start_gesture()
  6. Passo 62 nov 2026

    Publicado no navegador

    Na versão para navegador o Godot clareia demais a cena, então ajustamos a luz e a cor só para ela.

    scripts/autoload/options.gd
    ## In the browser, Godot renders in "Compatibility" mode, which makes the scene too bright (the road
    ## turns white); there, the sun and the ambient light are multiplied by this value.
    const COMPATIBILITY_LIGHT_FACTOR: float = 0.55
    const COMPATIBILITY_SATURATION: float = 1.25
    ## Saturation of the 3D world (1 = the original Palette colors).
    const WORLD_SATURATION: float = 0.72
  7. Passo 75 nov 2026

    Pronto para o Android

    O botão voltar do celular passou a funcionar como o Esc do teclado, em vez de fechar o jogo.

    scripts/autoload/screen.gd
    func _notification(what: int) -> void:
        if what != NOTIFICATION_WM_GO_BACK_REQUEST:
            return
        for pressed: bool in [true, false]:
            var event: InputEventAction = InputEventAction.new()
            event.action = &"cancel"
            event.pressed = pressed
            Input.parse_input_event(event)

Em números

O jogo foi publicado com 132 scripts e quase 17 mil linhas de código. Uma semana depois, já são 160 scripts e mais de 20 mil linhas, com novas versões publicadas em 3, 5, 7 e 8 de novembro.

Os próximos passos do Colheita de Ouro também vão aparecer aqui no devlog. Até a próxima cena.

Voltar para o devlog