vendor/raylib Vendor

Bindings para a raylib 5.5 — janelas, desenho 2D/3D, entrada e áudio, direto sobre o FFI da Bern.

import vendor/raylib/raylib

O módulo carrega a biblioteca compartilhada da raylib empacotada para a sua plataforma (Windows .dll, Linux .so, macOS .dylib) e expõe as funções C da raylib com os nomes originais. Se você conhece o cheatsheet da raylib, já conhece a API: InitWindow, BeginDrawing, DrawText e as demais são chamadas exatamente como você espera, com o handle da biblioteca já conectado para você.

Por enquanto, só as funções listadas aqui estão disponíveis; o conjunto cobre janelas, o laço de quadros, entrada, formas básicas, texto e áudio. Construtores e enums vêm como valores Bern, então você raramente lida com inteiros crus.

Tipos & cores

As principais structs da raylib são modeladas como ADTs da Bern. Construa-as com seus construtores e passe-as direto para as chamadas de desenho.

Color(r, g, b, a) → Color

Uma cor RGBA, cada canal um byte (0–255). Um conjunto completo de cores nomeadas vem como constantes.

sky   = Color(102, 191, 255, 255)
faded = Color(0, 0, 0, 128)        -- preto 50% transparente

-- ou use as embutidas
RL_RAYWHITE   RL_BLACK   RL_RED   RL_GREEN   RL_BLUE
RL_GOLD       RL_LIME    RL_SKYBLUE   RL_VIOLET   RL_MAGENTA
Vector2(x, y) → Vector  ·  Vector3(x, y, z) → Vector

Vetores 2D e 3D (floats de 32 bits, por compatibilidade com C). Rectangle(x, y, width, height) descreve uma caixa alinhada aos eixos.

pos  = Vector2(400.0, 225.0)
size = Rectangle(0.0, 0.0, 120.0, 40.0)
enums: KeyboardKey, MouseButton, ConfigFlag, …

As constantes nomeadas são agrupadas em objetos, então você lê uma tecla ou flag pelo nome em vez de decorar números. Indexe com ponto ou com chave.

KeyboardKey.SPACE        -- 32
MouseButton.LEFT         -- 0
ConfigFlag.MSAA_4X_HINT  -- 32

-- também: CameraProjection, BlendMode, Gesture, TraceLogLevel,
-- PixelFormat, GamepadButton, MouseCursor, e mais.

Constantes úteis: RL_VERSION ("5.5"), RL_PI, RL_DEG2RAD, RL_RAD2DEG.

Janela

InitWindow(width, height, title) → void

Cria a janela e o contexto OpenGL. Chame uma vez, antes de qualquer desenho.

InitWindow(800, 450, "Bern + raylib")
WindowShouldClose() → bool

Verdadeiro quando o usuário fecha a janela ou pressiona a tecla de saída — a condição natural para o laço principal.

CloseWindow() → void

Encerra a janela e libera os recursos. Chame por último.

Os outros auxiliares de janela seguem os nomes C diretamente:

SetConfigFlags(ConfigFlag.MSAA_4X_HINT)   -- antes de InitWindow
SetWindowTitle("Novo título")
SetWindowSize(1024, 600)
SetWindowPosition(100, 100)
GetScreenWidth()      GetScreenHeight()
IsWindowReady()       IsWindowResized()
ToggleFullscreen()    MaximizeWindow()    MinimizeWindow()

O laço de quadros

Cada quadro é delimitado por BeginDrawing() / EndDrawing(). Limpe o fundo, emita as chamadas de desenho e encerre o quadro para apresentá-lo.

BeginDrawing() → void  ·  EndDrawing() → void
ClearBackground(color) → void

Preenche todo o framebuffer com uma única cor, normalmente a primeira coisa dentro de BeginDrawing.

SetTargetFPS(fps) → void

Limita o laço a uma taxa de quadros alvo. Companheiras: GetFPS(), GetFrameTime() (segundos desde o último quadro), GetTime() (segundos desde o início).

BeginDrawing()
ClearBackground(RL_RAYWHITE)
DrawText("olá", 20, 20, 20, RL_DARKGRAY)
EndDrawing()

Entrada

As funções de polling leem o estado atual da entrada uma vez por quadro. Teclas e botões recebem os valores nomeados dos enums.

IsKeyDown(key) → bool  ·  IsKeyPressed(key) → bool

Down é estar pressionada neste quadro; Pressed dispara só no quadro em que a tecla desceu. Também IsKeyReleased, IsKeyUp e GetKeyPressed() para entrada de texto.

if IsKeyDown(KeyboardKey.RIGHT) then
    x = x + 4
end
GetMouseX() → int  ·  GetMouseY() → int
IsMouseButtonPressed(button) → bool

Além de IsMouseButtonDown, GetMouseWheelMove(), SetMouseCursor(MouseCursor.POINTING_HAND).

if IsMouseButtonPressed(MouseButton.LEFT) then
    click_at(GetMouseX(), GetMouseY())
end
gamepad & toque

IsGamepadAvailable(0), IsGamepadButtonDown(0, GamepadButton.RIGHT_FACE_DOWN), GetGamepadAxisMovement(0, GamepadAxis.LEFT_X); GetTouchX() / GetTouchY() / GetTouchPointCount() para toque.

Formas & texto

DrawRectangle(x, y, width, height, color) → void
DrawCircle(centerX, centerY, radius, color) → void
DrawLine(startX, startY, endX, endY, color) → void

As primitivas 2D básicas. Variantes em contorno (DrawRectangleLines, DrawCircleLines), gradientes (DrawRectangleGradientV/H), DrawEllipse e DrawPixel também estão disponíveis.

DrawRectangle(20, 20, 120, 60, RL_SKYBLUE)
DrawCircle(400, 225, 40.0, RL_RED)
DrawLine(0, 0, 800, 450, RL_GRAY)
DrawText(text, x, y, fontSize, color) → void

Desenha uma string com a fonte embutida. MeasureText(text, fontSize) retorna a largura em pixels, e DrawFPS(x, y) desenha um contador de quadros ao vivo.

colisão

CheckCollisionPointRec(point, rect) e CheckCollisionPointCircle(point, center, radius) respondem testes simples de acerto — úteis para botões e estados de hover.

Áudio

Abra o dispositivo de áudio uma vez, depois carregue e toque sons (one-shots) ou streams de música (faixas longas que você atualiza a cada quadro).

InitAudioDevice()

shot = LoadSound("blip.wav")
PlaySound(shot)

song = LoadMusicStream("theme.ogg")
PlayMusicStream(song)
-- dentro do laço: UpdateMusicStream(song)

-- no encerramento
UnloadSound(shot)
UnloadMusicStream(song)
CloseAudioDevice()

Sons: PauseSound, ResumeSound, StopSound, SetSoundVolume, SetSoundPitch. Música: SeekMusicStream, SetMusicVolume, GetMusicTimeLength, GetMusicTimePlayed.

Juntando tudo

A clássica "primeira janela" da raylib — abrir uma janela, rodar o laço de quadros até o usuário fechá-la e desenhar uma linha de texto no meio.

Sua primeira janela

import vendor/raylib/raylib

InitWindow(800, 450, "Bern + raylib")
SetTargetFPS(60)

for !WindowShouldClose() do
    BeginDrawing()
    ClearBackground(RL_RAYWHITE)
    DrawText("Parabéns! Você criou sua primeira janela!", 190, 200, 20, RL_LIGHTGRAY)
    EndDrawing()
end

CloseWindow()

E um pequeno esboço interativo: um quadrado que você move com as setas, redesenhado a cada quadro.

Um quadrado que se move

import vendor/raylib/raylib

InitWindow(800, 450, "me mova")
SetTargetFPS(60)

x = 400
y = 225

for !WindowShouldClose() do
    if IsKeyDown(KeyboardKey.RIGHT) then x = x + 4 end
    if IsKeyDown(KeyboardKey.LEFT)  then x = x - 4 end
    if IsKeyDown(KeyboardKey.DOWN)  then y = y + 4 end
    if IsKeyDown(KeyboardKey.UP)    then y = y - 4 end

    BeginDrawing()
    ClearBackground(RL_RAYWHITE)
    DrawRectangle(x, y, 40, 40, RL_MAROON)
    DrawText("setas para mover", 20, 20, 20, RL_GRAY)
    EndDrawing()
end

CloseWindow()