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

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 (Разработка игр на Python).


Raylib, SFML и SDL​

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

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


Установка и 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-цикл​

Код ITЗагрузка примера кода…

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

  • 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​

Код ITЗагрузка примера кода…

  • 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

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