Перейти к основному содержимому

Raylib — быстрые 2D/3D прототипы на C++

Разработчику Начальный уровень

Что такое Raylib

Raylib — open-source библиотека на C с минимальными зависимостями. Один заголовок raylib.h даёт окно, 2D/3D примитивы, текстуры, шрифты, звук и простую камеру. Девиз проекта — "make games, not engines" ("делай игры, а не движки").

Raylib не навязывает ECS, сцены или редактор. Это сознательно низкий уровень абстракции — но выше, чем голый OpenGL.

Из C++ подключают так:

extern "C" {
#include "raylib.h"
}

Официальный API остаётся C; C++-обёртки существуют, но не обязательны.


Ключевые понятия

ТерминОпределение
InitWindow / CloseWindowСоздание и уничтожение окна и контекста
BeginDrawing / EndDrawingГраницы одного кадра 2D-отрисовки
BeginMode3D / EndMode3DВременное включение 3D-проекции
GetFrameTime()Delta time в секундах — для плавного движения
SetTargetFPSОграничение частоты кадров (не жёсткий VSync)

Игровой цикл в теории — Разработка игр. Аналог на Python — Pygame (312).


Raylib, SFML и SDL

КритерийRaylibSFMLSDL2
Строк до спрайтаМалоСреднеБольше
3D из коробкиДаНетЧерез GL/Vulkan
APIC, Draw*C++ классыC + расширения
ЗависимостиПочти нетOpenGL backendМодули отдельно
Размер бинарникаНебольшойСреднийЗависит от связки

Правило выбора: Raylib — быстрый старт. SFML — C++-стиль и сеть. SDL — фундамент под движок. Siv3D — C++20 "всё в одном" (2743).


Установка и CMake

  • vcpkg: vcpkg install raylib
  • Linux: libraylib-dev или сборка с GitHub
cmake_minimum_required(VERSION 3.16)
project(raylib_demo CXX)
set(CMAKE_CXX_STANDARD 17)

find_package(raylib REQUIRED)
add_executable(game main.cpp)
target_link_libraries(game PRIVATE raylib)

Статическая линковка raylib на Windows часто даёт один .exe без DLL — удобно для учебных работ.


Минимальный 2D-цикл

#include "raylib.h"

int main() {
InitWindow(800, 600, "Raylib demo");
SetTargetFPS(60);

while (!WindowShouldClose()) {
if (IsKeyPressed(KEY_ESCAPE))
break;

BeginDrawing();
ClearBackground({30, 30, 40, 255});
DrawCircle(400, 300, 50, {80, 200, 120, 255});
DrawText("Hello, Raylib!", 280, 80, 28, RAYWHITE);
EndDrawing();
}

CloseWindow();
return 0;
}

Разбор построчно

  • InitWindow — создаёт окно и OpenGL-контекст; до него нельзя рисовать.
  • SetTargetFPS(60)мягкое ограничение FPS; для жёсткого VSync смотрите флаги платформы.
  • WindowShouldClose()true после клика по крестику; можно выставить вручную через CloseWindow().
  • IsKeyPressed(KEY_ESCAPE) — одно нажатие за кадр; для удержания — IsKeyDown.
  • BeginDrawing / EndDrawing — все Draw* только между ними.
  • ClearBackground — заливка; цвет {R,G,B,A} 0..255.
  • DrawCircle(x, y, radius, color) — примитив без текстуры.
  • DrawText — встроенный bitmap-шрифт; для TTF — LoadFontEx.
  • CloseWindow — освобождение ресурсов GL и окна.

Delta time и движение

while (!WindowShouldClose()) {
float dt = GetFrameTime();
playerX += speed * dt;
// ...
}

GetFrameTime() — время последнего кадра. На слабом ПК dt растёт — объект всё равно проходит speed пикселей в секунду.


Текстуры и коллизии

Texture2D tex = LoadTexture("player.png");
DrawTexture(tex, x, y, WHITE);
UnloadTexture(tex);
  • LoadTexture — загрузка в GPU; парная UnloadTexture обязательна.
  • DrawTextureRec — вырезка из атласа для анимации.
  • CheckCollisionRecs, CheckCollisionCircles — AABB и круги; не замена Box2D (игры).

Простой 3D

Camera3D camera = { 0 };
camera.position = {4.f, 4.f, 4.f};
camera.target = {0.f, 0.f, 0.f};
camera.up = {0.f, 1.f, 0.f};
camera.fovy = 45.f;
camera.projection = CAMERA_PERSPECTIVE;

while (!WindowShouldClose()) {
UpdateCamera(&camera, CAMERA_ORBITAL);
BeginDrawing();
ClearBackground(RAYWHITE);
BeginMode3D(camera);
DrawCube({0, 0, 0}, 2, 2, 2, RED);
DrawGrid(10, 1.f);
EndMode3D();
EndDrawing();
}
  • Camera3D — position, target, up, fov — классическая look-at модель.
  • BeginMode3D — включает depth test и проекцию; после EndMode3D снова 2D.
  • LoadModel / DrawModel — OBJ/GLTF (зависит от версии raylib).

Для PBR, deferred, mesh shaders — OpenGL, Vulkan или DirectX.


Звук

InitAudioDevice();
Sound jump = LoadSound("jump.wav");
PlaySound(jump);
UnloadSound(jump);
CloseAudioDevice();

Музыка: LoadMusicStream, в цикле — UpdateMusicStream(music).


Raylib и полноценный 3D API

ЗадачаRaylibOpenGL / Vulkan / DirectX
Pong, Breakout, SnakeОтличноИзбыточно
3D lab, orbit cameraХорошоГибче
Deferred, SSR, mesh shadersНетДа
Свой коммерческий рендерНетДа

Частые ошибки

СимптомПричинаРешение
Чёрный экран 3Dкамера внутри объектасдвинуть camera.position
Нет звуканет InitAudioDeviceдо LoadSound
Asset not foundcwd не тафайлы рядом с exe
Дёрганое движениенет GetFrameTimespeed * dt

Что читать дальше