From ba42c54560d7f0533d6d4598ded73879a6ab8cd4 Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Sun, 15 Mar 2026 18:52:27 -0700 Subject: [PATCH] Add AS6 skeleton --- as6/CMakeLists.txt | 21 +++++++++ as6/Components.hpp | 115 +++++++++++++++++++++++++++++++++++++++++++++ as6/Draw.hpp | 6 +++ as6/Entities.hpp | 74 +++++++++++++++++++++++++++++ as6/Entity.hpp | 47 ++++++++++++++++++ as6/Systems.hpp | 8 ++++ as6/main.cpp | 29 ++++++++++++ as6/ui_layout.rgl | 12 +++++ 8 files changed, 312 insertions(+) create mode 100644 as6/CMakeLists.txt create mode 100644 as6/Components.hpp create mode 100644 as6/Draw.hpp create mode 100644 as6/Entities.hpp create mode 100644 as6/Entity.hpp create mode 100644 as6/Systems.hpp create mode 100644 as6/main.cpp create mode 100644 as6/ui_layout.rgl diff --git a/as6/CMakeLists.txt b/as6/CMakeLists.txt new file mode 100644 index 0000000..1192d68 --- /dev/null +++ b/as6/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.25) +project(as6-gravity-surfing VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# adding this option to make clangd work +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +add_subdirectory(../raylib-cpp raylib) + +include(../assets/includeable.cmake) + +add_executable(as6-gravity-surfing main.cpp) +target_link_libraries(as6-gravity-surfing PUBLIC raylib raylib_cpp buffered-raylib) + +target_include_directories(as6-gravity-surfing PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${RAYLIB_CPP_ROOT}/include +) diff --git a/as6/Components.hpp b/as6/Components.hpp new file mode 100644 index 0000000..1e6e856 --- /dev/null +++ b/as6/Components.hpp @@ -0,0 +1,115 @@ +#pragma once + +#include "Entity.hpp" + +// Placeholder component definitions inspired by the GDD. Logic will be filled +// in later, but the types exist now so other modules can include them and build. + +struct TransformComponent : public Component { + float x = 0.0f; + float y = 0.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct PhysicsComponent : public Component { + float vx = 0.0f; + float vy = 0.0f; + float speedCap = 400.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct GravityWellComponent : public Component { + float mass = 150000.0f; + float minDist = 30.0f; + bool active = false; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct GravityReceiverComponent : public Component { + Entity *well = nullptr; + bool inVoid = false; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct ColliderComponent : public Component { + float radius = 8.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct ScrollComponent : public Component { + float scrollX = 0.0f; + float speed = 2.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct ScrollableComponent : public Component { + float worldX = 0.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct SpawnComponent : public Component { + float cursorWX = 0.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct TrailComponent : public Component { + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct ProjectionComponent : public Component { + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct MeterComponent : public Component { + float value = 60.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct HudComponent : public Component { + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct RenderComponent : public Component { + virtual void Draw() {} + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct NullZoneComponent : public Component { + float width = 70.0f; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; + +struct CollectibleComponent : public Component { + bool collected = false; + void Setup() override {} + void Update(float) override {} + void Cleanup() override {} +}; diff --git a/as6/Draw.hpp b/as6/Draw.hpp new file mode 100644 index 0000000..e3b70bc --- /dev/null +++ b/as6/Draw.hpp @@ -0,0 +1,6 @@ +#pragma once + +// placeholder for draw helpers +void DrawSceneOutline() { + +} diff --git a/as6/Entities.hpp b/as6/Entities.hpp new file mode 100644 index 0000000..bb796b2 --- /dev/null +++ b/as6/Entities.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include "Components.hpp" +#include "Entity.hpp" +#include + +std::shared_ptr CreateProbe() { + auto e = std::make_shared(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} + +std::shared_ptr CreateGravityWell() { + auto e = std::make_shared(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} + +std::shared_ptr CreateStar(float x, float y) { + auto e = std::make_shared(); + auto &t = e->template AddComponent(); + t.x = x; + t.y = y; + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} + +std::shared_ptr CreateAsteroid(float x, float y) { + auto e = std::make_shared(); + auto &t = e->template AddComponent(); + t.x = x; + t.y = y; + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} + +std::shared_ptr CreateNullZone(float x, float width) { + auto e = std::make_shared(); + auto &t = e->template AddComponent(); + t.x = x; + (void)width; + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} + +std::shared_ptr CreateWorld() { + auto e = std::make_shared(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} + +std::shared_ptr CreateHUD() { + auto e = std::make_shared(); + e->template AddComponent(); + e->template AddComponent(); + e->template AddComponent(); + return e; +} diff --git a/as6/Entity.hpp b/as6/Entity.hpp new file mode 100644 index 0000000..1c40fba --- /dev/null +++ b/as6/Entity.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include + +struct Entity; +class Component; + +class Component { + public: + Entity *entity = nullptr; + + virtual void Setup() = 0; + virtual void Update(float dt) = 0; + virtual void Cleanup() = 0; + + virtual ~Component() = default; +}; + +struct Entity { + std::vector> components; + + template T> T &AddComponent() { + auto &ptr = components.emplace_back(std::make_shared()); + ptr->entity = this; + ptr->Setup(); + return static_cast(*ptr); + } + + template T> + std::optional> GetComponent() const { + for (auto &c : components) { + T *cast = dynamic_cast(c.get()); + if (cast) { + return *cast; + } + } + return {}; + } + + void Update(float dt) { + for (auto &c : components) { + c->Update(dt); + } + } +}; diff --git a/as6/Systems.hpp b/as6/Systems.hpp new file mode 100644 index 0000000..ac87710 --- /dev/null +++ b/as6/Systems.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include +#include "Entity.hpp" + +void UpdateAllSystems(std::vector &entities, float deltaTime) { + +} diff --git a/as6/main.cpp b/as6/main.cpp new file mode 100644 index 0000000..f3de464 --- /dev/null +++ b/as6/main.cpp @@ -0,0 +1,29 @@ +#include "Components.hpp" +#include "Draw.hpp" +#include "Entities.hpp" +#include "Entity.hpp" +#include "Systems.hpp" + +#include "raylib-cpp.hpp" + +int main() { + raylib::Window window(700, 460, "Gravity Surfing"); + window.SetTargetFPS(60); + + std::vector entities; + entities.reserve(20); + + auto &world = entities.emplace_back(); + world.AddComponent(); + + while (!window.ShouldClose()) { + float dt = window.GetFrameTime(); + UpdateAllSystems(entities, dt); + window.BeginDrawing(); + window.ClearBackground(raylib::Color::Black()); + DrawSceneOutline(); + window.EndDrawing(); + } + + return 0; +} diff --git a/as6/ui_layout.rgl b/as6/ui_layout.rgl new file mode 100644 index 0000000..f7ba6e4 --- /dev/null +++ b/as6/ui_layout.rgl @@ -0,0 +1,12 @@ +# +# rgl layout text file (v4.0) - raygui layout file generated using rGuiLayout +# +# Number of controls: 1 +# +# Ref. window: r +# Anchor info: a +# Control info: c +# +r 0 40 -1 -1 +a 001 anchor01 456 240 1 +c 000 18 GravityBar 72 24 240 16 0 Gravity