made items affect stats
This commit is contained in:
40
main.cpp
40
main.cpp
@@ -3,7 +3,6 @@
|
|||||||
#include <print>
|
#include <print>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <raylib.h>
|
#include <raylib.h>
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
#include "rng.h"
|
#include "rng.h"
|
||||||
#include "spawner.h"
|
#include "spawner.h"
|
||||||
@@ -21,7 +20,7 @@ uint32_t score;
|
|||||||
|
|
||||||
Tear tears[100] = {};
|
Tear tears[100] = {};
|
||||||
float tear_speed = 10;
|
float tear_speed = 10;
|
||||||
float tear_range = 500;
|
float tear_range = 300;
|
||||||
float tear_radius = 10.0f;
|
float tear_radius = 10.0f;
|
||||||
double last_fired = 0;
|
double last_fired = 0;
|
||||||
double fire_rate = .5;
|
double fire_rate = .5;
|
||||||
@@ -211,6 +210,11 @@ int main() {
|
|||||||
std::string lives_text_buffer;
|
std::string lives_text_buffer;
|
||||||
lives_text_buffer.reserve(64);
|
lives_text_buffer.reserve(64);
|
||||||
|
|
||||||
|
std::string item_pickup_text_buffer;
|
||||||
|
item_pickup_text_buffer.reserve(64);
|
||||||
|
double item_last_picked_up = 0;
|
||||||
|
double item_pickup_message_duration = 3;
|
||||||
|
|
||||||
while (!WindowShouldClose()) {
|
while (!WindowShouldClose()) {
|
||||||
if (IsWindowResized()) {
|
if (IsWindowResized()) {
|
||||||
screen_height = static_cast<float>(GetScreenHeight());
|
screen_height = static_cast<float>(GetScreenHeight());
|
||||||
@@ -263,7 +267,7 @@ int main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enemy_spawner.for_each([now](auto &enemy) {
|
enemy_spawner.for_each([now](Enemy &enemy) {
|
||||||
if (enemy.alive) {
|
if (enemy.alive) {
|
||||||
enemy.center = Vector2MoveTowards(enemy.center, player.center(), enemy.speed);
|
enemy.center = Vector2MoveTowards(enemy.center, player.center(), enemy.speed);
|
||||||
DrawCircleV(enemy.center, enemy.radius, RED);
|
DrawCircleV(enemy.center, enemy.radius, RED);
|
||||||
@@ -281,12 +285,30 @@ int main() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
item_spawner.for_each([](auto &item) {
|
item_spawner.for_each([&item_pickup_text_buffer, now, &item_last_picked_up](Item &item) {
|
||||||
if (!item.active) return;
|
if (!item.active) return;
|
||||||
|
|
||||||
DrawCircleV(item.center, item.radius, item.color());
|
DrawCircleV(item.center, item.radius, item.color());
|
||||||
|
|
||||||
if (CheckCollisionCircleRec(item.center, item.radius, player.rect())) {
|
if (CheckCollisionCircleRec(item.center, item.radius, player.rect())) {
|
||||||
|
switch (item.type) {
|
||||||
|
case TEARS_UP:
|
||||||
|
fire_rate = std::max(fire_rate - 0.1, 0.1);
|
||||||
|
break;
|
||||||
|
case TEARS_DOWN:
|
||||||
|
fire_rate += 0.1;
|
||||||
|
break;
|
||||||
|
case RANGE_UP:
|
||||||
|
tear_range += 100.0f;
|
||||||
|
break;
|
||||||
|
case RANGE_DOWN:
|
||||||
|
tear_range = std::max(tear_range - 100.0f, 100.0f);
|
||||||
|
break;
|
||||||
|
case ITEM_TYPE_COUNT:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::format_to(std::back_inserter(item_pickup_text_buffer), "{:t}!", item.type);
|
||||||
|
item_last_picked_up = now;
|
||||||
item.active = false;
|
item.active = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -296,9 +318,17 @@ int main() {
|
|||||||
score_text_buffer.clear();
|
score_text_buffer.clear();
|
||||||
|
|
||||||
std::format_to(std::back_inserter(lives_text_buffer), "Lives: {}", player.lives);
|
std::format_to(std::back_inserter(lives_text_buffer), "Lives: {}", player.lives);
|
||||||
DrawText(lives_text_buffer.c_str(), 50, static_cast<int>(screen_height) - 50, 20, BLACK);
|
DrawText(lives_text_buffer.c_str(), 50, static_cast<int>(screen_height) - 75, 20, BLACK);
|
||||||
lives_text_buffer.clear();
|
lives_text_buffer.clear();
|
||||||
|
|
||||||
|
if (now < item_last_picked_up + item_pickup_message_duration && !item_pickup_text_buffer.empty()) {
|
||||||
|
DrawText(item_pickup_text_buffer.c_str(), 50, static_cast<int>(screen_height) - 50, 20, BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item_last_picked_up + item_pickup_message_duration <= now && !item_pickup_text_buffer.empty()) {
|
||||||
|
item_pickup_text_buffer.clear();
|
||||||
|
}
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
}
|
}
|
||||||
CloseWindow();
|
CloseWindow();
|
||||||
|
|||||||
24
types.h
24
types.h
@@ -57,23 +57,37 @@ enum ItemType {
|
|||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct std::formatter<ItemType> : std::formatter<string_view> {
|
struct std::formatter<ItemType> : std::formatter<string_view> {
|
||||||
|
bool title_case = false;
|
||||||
|
|
||||||
|
constexpr auto parse(std::format_parse_context& ctx) {
|
||||||
|
auto it = ctx.begin();
|
||||||
|
if (it == ctx.end()) return it;
|
||||||
|
|
||||||
|
if (*it == 't') {
|
||||||
|
title_case = true;
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
auto format(const ItemType& item_type, std::format_context& ctx) const {
|
auto format(const ItemType& item_type, std::format_context& ctx) const {
|
||||||
std::string_view item_type_str;
|
std::string_view item_type_str;
|
||||||
switch (item_type) {
|
switch (item_type) {
|
||||||
case TEARS_UP:
|
case TEARS_UP:
|
||||||
item_type_str = "TEARS_UP";
|
item_type_str = title_case ? "Tears Up" : "TEARS_UP";
|
||||||
break;
|
break;
|
||||||
case TEARS_DOWN:
|
case TEARS_DOWN:
|
||||||
item_type_str = "TEARS_DOWN";
|
item_type_str = title_case ? "Tears Down" : "TEARS_DOWN";
|
||||||
break;
|
break;
|
||||||
case RANGE_UP:
|
case RANGE_UP:
|
||||||
item_type_str = "RANGE_UP";
|
item_type_str = title_case ? "Range Up" : "RANGE_UP";
|
||||||
break;
|
break;
|
||||||
case RANGE_DOWN:
|
case RANGE_DOWN:
|
||||||
item_type_str = "RANGE_DOWN";
|
item_type_str = title_case ? "Range Down" : "RANGE_DOWN";
|
||||||
break;
|
break;
|
||||||
case ITEM_TYPE_COUNT:
|
case ITEM_TYPE_COUNT:
|
||||||
item_type_str = "ITEM_TYPE_COUNT";
|
item_type_str = title_case ? "Item Type Count" : "ITEM_TYPE_COUNT";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return std::formatter<string_view>::format(item_type_str, ctx);;
|
return std::formatter<string_view>::format(item_type_str, ctx);;
|
||||||
|
|||||||
Reference in New Issue
Block a user