raylib-cpp is a C++ wrapper library for raylib, a simple and easy-to-use library to enjoy videogames programming. This C++ header provides object-oriented wrappers around raylib's struct interfaces.
#include "raylib-cpp.hpp"
int main()
{
int screenWidth = 800;
int screenHeight = 450;
raylib::Window w(screenWidth, screenHeight, "raylib-cpp - basic window");
raylib::Texture logo("raylib_logo.png");
SetTargetFPS(60);
while (!w.ShouldClose())
{
BeginDrawing();
raylib::Color::RayWhite.ClearBackground();
DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);
// Object methods.
logo.Draw(
screenWidth / 2 - texture.getWidth() / 2,
screenHeight / 2 - texture.getHeight() / 2);
EndDrawing();
}
// UnloadTexture() and CloseWindow() are called automatically.
return 0;
}
See the examples folder for more of the raylib examples that have been ported over to raylib-cpp.
There are a few conventions that raylib-cpp takes on when adopting raylib...
Object constructors load raylib objects.
// raylib
Texture2D texture = LoadTexture("texture.png");
// raylib-cpp
raylib::Texture2D texture("texture.png");
When a raylib method has an object as one of its arguments, you can call the method on the object itself.
// raylib
Vector2 position(50, 50);
DrawPixelV(position, PURPLE);
// raylib-cpp
raylib::Vector2 position(50, 50);
position.DrawPixel(raylib::Color::Purple);
// ... or
raylib::Color::Purple.DrawPixel(position);
If a method's name contains an object's name, it is removed from its name to shorten it.
// raylib
DrawTexture(texture, 50, 50, RAYWHITE);
// raylib-cpp
texture.Draw(50, 50, RAYWHITE);
Objects will attempt to unload their respective raylib resources on destruction. This means no need to call Unload or Close methods. This applies to the window, textures, images, sounds, etc.
// raylib
InitWindow(640, 480, "Hello World");
CloseWindow();
// raylib-cpp
raylib::Window w(640, 480, "Hello World");
// CloseWindow(); // w.Close() is automatically called when the object is destructed.
Properties can be assigned through getter and setter methods. You still have access to the internal properties, however.
// raylib
Vector2 position;
position.x = 50;
position.y = 100;
// raylib-cpp
raylib::Vector2 position;
position.SetX(50);
position.SetY(100);
// ... or
position.x = 50;
position.y = 100;
Many similar raylib method names have different name suffixes based on what arguments they take. With raylib-cpp, these cases use method overriding to allow using the same method names.
// raylib
Color color = GRAY;
DrawPixel(50, 50, color);
Vector2 position = {50.0f, 50.0f};
DrawPixelV(position, color); // Extra V in method name.
// raylib-cpp
raylib::Color color = raylib::Color::Gray;
color.DrawPixel(50, 50);
Vector2 position(50.0f, 50.0f);
color.DrawPixel(position); // No more V in method name.
position.DrawPixel(color); // Alternatively
When there's a method that doesn't return anything, it'll instead return the object itself, allowing method chaining.
// raylib
Image cat = ImageLoad("cat.png");
ImageCrop(&cat, (Rectangle){ 100, 10, 280, 380 });
ImageFlipHorizontal(&cat);
ImageResize(&cat, 150, 200);
// raylib-cpp
raylib::Image cat("cat.png");
cat.Crop((Rectangle){ 100, 10, 280, 380 })
.FlipHorizontal()
.Resize(150, 200);
There are operator overrides for objects.
// raylib
Vector2 position = {50, 50};
Vector2 speed = {10, 10};
postion.x += speed.x;
position.y += speed.y;
// raylib-cpp
raylib::Vector2 position(50, 50);
raylib::Vector2 speed(10, 10);
position += speed; // Addition assignment operator override.
The raymath methods are included.
// raylib
Vector2 direction = {50, 50};
Vector2 newDirection = Vector2Rotate(direction, 30);
// raylib-cpp
raylib::Vector2 direction(50, 50);
raylib::Vector2 newDirection = direction.Rotate(30);
raylib-cpp is a header-only library. This means in order to use it, you must link your project to raylib, and then include include/raylib-cpp.hpp
.
- Set up a raylib project using the build and install instructions
- Download raylib-cpp
- Include
raylib-cpp.hpp
#include "path/to/raylib-cpp.hpp"
The projects directory includes some starter templates...
If there's a project template you would like to see added, feel free to make an issue and we can add it in.
raylib-cpp uses CMake as a primary target for development. To build it, and run the tests or examples, use...
git clone https://github.com/RobLoach/raylib-cpp.git
cd raylib-cpp
git submodule update --init
mkdir build
cd build
cmake ..
make
make test
./examples/core_basic_window
To build the document with Doxygen, use...
doxygen projects/Doxygen/Doxyfile
RAYLIB_CPP_NO_MATH
- When set, will skip adding theraymath.h
integrations