Programando em Zig

Esta página foi traduzida automaticamente e pode conter erros. Encontrou um problema? Use o link "Edit this page" para ajudar a corrigir.

O Turian é escrito em Zig e seus scripts de jogo também são escritos em Zig — a mesma linguagem, o mesmo compilador, sem necessidade de aprender DSLs ou bindings.

Editores compatíveis

O Zig possui suporte para editores através do Zig Language Server (zls):

Editor Configuração
Zed Suporte integrado ao Zig — instale o binário do Zig e o Zed o detectará automaticamente.
VS Code Instale a extensão ziglang.vscode-zig.
Neovim Use o zls com sua configuração LSP.
Helix Suporte integrado ao Zig.
IntelliJ O plugin do Zig oferece suporte à linguagem.

O mesmo zls alimenta todos eles, oferecendo preenchimento automático (autocompletion), ir para definição (go-to-definition), visualização de tipos ao passar o mouse (hover types) e erros em linha (inline errors), independentemente de qual editor você escolher.

Conceitos básicos do Zig

O Zig é uma linguagem de programação de sistemas de uso geral, sem fluxo de controle oculto, sem alocações de memória ocultas e sem garbage collector. Conceitos fundamentais que você encontrará:

Structs como blocos de construção

Não existem classes. Um componente é uma struct simples:

pub const Health = struct {
    pub const is_component = true;

    max: f32 = 100.0,
    current: f32 = 100.0,
};

O marcador pub const is_component = true; é o que diz à engine para considerar esta struct como um componente que pode ser anexado a nós de cena. Sem ele, a struct é apenas um tipo comum do Zig — útil para dados internos, mas invisível para o editor e para o sistema de componentes.

Comptime

O Zig remove a barreira entre o tempo de compilação (compile-time) e o tempo de execução (run-time). A palavra-chave comptime permite executar código arbitrário durante a compilação — o Turian a utiliza para descoberta de componentes, resolução de GUIDs e abstrações de custo zero.

Sem alocações ocultas

std.heap.GeneralPurposeAllocator, arenas, alocadores de pilha (stack allocators) — você escolhe. O engine fornece alocadores através do contexto de Frame para que os scripts possam realizar alocações de forma transparente e previsível.

Tratamento de erros

Erros são valores, não exceções. As funções retornam uniões marcadas (tagged unions):

const file = try std.fs.cwd().openFile("config.json", .{});
defer file.close();

Zig em scripts do Turian

O código do seu jogo reside em arquivos .zig na pasta assets/ do seu projeto. Cada arquivo pode exportar uma ou mais structs de componente. O editor analisa sintaticamente o seu código-fonte (e não por expressões regulares) para descobrir os marcadores pub const is_component = true — apenas structs com esse marcador são consideradas componentes.

O engine é importada como um único módulo:

const engine = @import("engine");

Isso concede a você acesso ao engine.Vec3, engine.Time, engine.Frame, engine.GameObjectRef e a todos os tipos integrados — exatamente a mesma API que o próprio engine utiliza. Não há uma camada de abstração entre o código do usuário e o código do engine.

Consulte o Tutorial para um passo a passo sobre como escrever seu primeiro componente.


← Toda a documentação Editar esta página