Skip to content

Instantly share code, notes, and snippets.

@h4k1m0u
Created April 6, 2024 11:11
Show Gist options
  • Save h4k1m0u/14dbd1e19ad38f56234ba4e05d336d45 to your computer and use it in GitHub Desktop.
Save h4k1m0u/14dbd1e19ad38f56234ba4e05d336d45 to your computer and use it in GitHub Desktop.
Very basic 2D game example made with Raylib
cmake_minimum_required(VERSION 3.15)
project(raylib-basic-game)
# use C++20
set(CMAKE_CXX_STANDARD 20)
# autocomplete with YCM
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_BUILD_TYPE Release)
# copy assets
file(COPY player.png DESTINATION ${CMAKE_BINARY_DIR})
# executable
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} raylib)
#include <raylib.h>
#include <string>
/* Get upper-left corner position from center position */
static Vector2 get_position_ul(const Vector2& position_center, const Vector2& size_sprite) {
Vector2 position_ul = {
position_center.x - size_sprite.x/2.0f,
position_center.y - size_sprite.y/2.0f
};
return position_ul;
}
static Vector2 get_random_position(const Vector2& size_sprite, const Vector2& size_window) {
auto [ width_window, height_window ] = size_window;
auto [ width_sprite, height_sprite ] = size_sprite;
Vector2 position_center = {
static_cast<float>(GetRandomValue(width_sprite/2, width_window - width_sprite/2)),
static_cast<float>(GetRandomValue(height_sprite/2, height_window - height_sprite/2))
};
return get_position_ul(position_center, size_sprite);
}
/* Detect collision between mouse cursor & sprite bbox */
static bool check_collision(const Vector2& position_enemy, const Vector2& size_sprite) {
Rectangle rectangle_sprite = { position_enemy.x, position_enemy.y, size_sprite.x, size_sprite.y };
Vector2 position_mouse = GetMousePosition();
bool is_in_rect = CheckCollisionPointRec(position_mouse, rectangle_sprite);
return is_in_rect;
}
int main() {
const int WIDTH_WINDOW = 800;
const int HEIGHT_WINDOW = 600;
const Vector2 size_window = { static_cast<float>(WIDTH_WINDOW), static_cast<float>(HEIGHT_WINDOW) };
InitWindow(WIDTH_WINDOW, HEIGHT_WINDOW, "My game");
const float TIME_SPAWN_ENEMY = 1.0;
float timer = TIME_SPAWN_ENEMY;
Texture2D texture_player = LoadTexture("player.png");
int width_player = texture_player.width;
int height_player = texture_player.height;
const Vector2 size_sprite = { static_cast<float>(width_player), static_cast<float>(height_player) };
Vector2 position_enemy = get_random_position(size_sprite, size_window);
bool is_hit = false;
unsigned int score = 0;
while (!WindowShouldClose()) {
BeginDrawing();
ClearBackground(WHITE);
DrawRectangle(200, 200, 400, 400, SKYBLUE);
// player at mouse location
// position center (not upper-left corner by default)
Vector2 position_mouse = GetMousePosition();
Vector2 position_player = get_position_ul(position_mouse, size_sprite);
DrawTexture(texture_player, position_player.x, position_player.y, WHITE);
// spawn enemy every second
timer -= GetFrameTime();
if (timer < 0 || is_hit) {
timer = TIME_SPAWN_ENEMY;
position_enemy = get_random_position(size_sprite, size_window);
is_hit = false;
}
Color tint = { 0x0, 0x0, 0xff, 0xff }; // basic multiplication with 255: opaque, 0: transparent
DrawTexture(texture_player, position_enemy.x, position_enemy.y, tint);
// display score
std::string score_text = "Score: " + std::to_string(score);
DrawText(score_text.c_str(), WIDTH_WINDOW - 100, HEIGHT_WINDOW - 20, 20, LIGHTGRAY);
EndDrawing();
// detect mouse cursor collision with enemy
bool is_in_rect = check_collision(position_enemy, size_sprite);
if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) && is_in_rect) {
++score;
is_hit = true;
}
}
UnloadTexture(texture_player);
CloseWindow();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment