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
| Критерий | Raylib | SFML | SDL2 |
|---|---|---|---|
| Строк до спрайта | Мало | Средне | Больше |
| 3D из коробки | Да | Нет | Через GL/Vulkan |
| API | C, 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
| Задача | Raylib | OpenGL / Vulkan / DirectX |
|---|---|---|
| Pong, Breakout, Snake | Отлично | Избыточно |
| 3D lab, orbit camera | Хорошо | Гибче |
| Deferred, SSR, mesh shaders | Нет | Да |
| Свой коммерческий рендер | Нет | Да |
Частые ошибки
| Симптом | Причина | Решение |
|---|---|---|
| Чёрный экран 3D | камера внутри объекта | сдвинуть camera.position |
| Нет звука | нет InitAudioDevice | до LoadSound |
| Asset not found | cwd не та | файлы рядом с exe |
| Дёрганое движение | нет GetFrameTime | speed * dt |