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.
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.
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
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)
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.
Cria a janela e o contexto OpenGL. Chame uma vez, antes de qualquer desenho.
InitWindow(800, 450, "Bern + raylib")
Verdadeiro quando o usuário fecha a janela ou pressiona a tecla de saída — a condição natural para o laço principal.
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()
Cada quadro é delimitado por BeginDrawing() / EndDrawing(). Limpe o fundo, emita as chamadas de desenho e encerre o quadro para apresentá-lo.
Preenche todo o framebuffer com uma única cor, normalmente a primeira coisa dentro de BeginDrawing.
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()
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.
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
Além de IsMouseButtonDown, GetMouseWheelMove(), SetMouseCursor(MouseCursor.POINTING_HAND).
if IsMouseButtonPressed(MouseButton.LEFT) then
click_at(GetMouseX(), GetMouseY())
end
IsGamepadAvailable(0), IsGamepadButtonDown(0, GamepadButton.RIGHT_FACE_DOWN), GetGamepadAxisMovement(0, GamepadAxis.LEFT_X); GetTouchX() / GetTouchY() / GetTouchPointCount() para toque.
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)
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.
CheckCollisionPointRec(point, rect) e CheckCollisionPointCircle(point, center, radius) respondem testes simples de acerto — úteis para botões e estados de hover.
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.
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.
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.
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()