|
#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; |
|
} |