Add AS6 skeleton

master
John Montagu, the 4th Earl of Sandvich 2026-03-15 18:52:27 -07:00
parent 67097e14c9
commit ba42c54560
Signed by: sandvich
GPG Key ID: 9A39BE37E602B22D
8 changed files with 312 additions and 0 deletions

21
as6/CMakeLists.txt 100644
View File

@ -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
)

115
as6/Components.hpp 100644
View File

@ -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 {}
};

6
as6/Draw.hpp 100644
View File

@ -0,0 +1,6 @@
#pragma once
// placeholder for draw helpers
void DrawSceneOutline() {
}

74
as6/Entities.hpp 100644
View File

@ -0,0 +1,74 @@
#pragma once
#include "Components.hpp"
#include "Entity.hpp"
#include <memory>
std::shared_ptr<Entity> CreateProbe() {
auto e = std::make_shared<Entity>();
e->template AddComponent<TransformComponent>();
e->template AddComponent<PhysicsComponent>();
e->template AddComponent<GravityReceiverComponent>();
e->template AddComponent<ColliderComponent>();
e->template AddComponent<TrailComponent>();
e->template AddComponent<ProjectionComponent>();
e->template AddComponent<RenderComponent>();
return e;
}
std::shared_ptr<Entity> CreateGravityWell() {
auto e = std::make_shared<Entity>();
e->template AddComponent<TransformComponent>();
e->template AddComponent<GravityWellComponent>();
e->template AddComponent<RenderComponent>();
return e;
}
std::shared_ptr<Entity> CreateStar(float x, float y) {
auto e = std::make_shared<Entity>();
auto &t = e->template AddComponent<TransformComponent>();
t.x = x;
t.y = y;
e->template AddComponent<ScrollableComponent>();
e->template AddComponent<ColliderComponent>();
e->template AddComponent<CollectibleComponent>();
e->template AddComponent<RenderComponent>();
return e;
}
std::shared_ptr<Entity> CreateAsteroid(float x, float y) {
auto e = std::make_shared<Entity>();
auto &t = e->template AddComponent<TransformComponent>();
t.x = x;
t.y = y;
e->template AddComponent<ScrollableComponent>();
e->template AddComponent<ColliderComponent>();
e->template AddComponent<RenderComponent>();
return e;
}
std::shared_ptr<Entity> CreateNullZone(float x, float width) {
auto e = std::make_shared<Entity>();
auto &t = e->template AddComponent<TransformComponent>();
t.x = x;
(void)width;
e->template AddComponent<ScrollableComponent>();
e->template AddComponent<NullZoneComponent>();
e->template AddComponent<RenderComponent>();
return e;
}
std::shared_ptr<Entity> CreateWorld() {
auto e = std::make_shared<Entity>();
e->template AddComponent<ScrollComponent>();
e->template AddComponent<SpawnComponent>();
return e;
}
std::shared_ptr<Entity> CreateHUD() {
auto e = std::make_shared<Entity>();
e->template AddComponent<MeterComponent>();
e->template AddComponent<HudComponent>();
e->template AddComponent<RenderComponent>();
return e;
}

47
as6/Entity.hpp 100644
View File

@ -0,0 +1,47 @@
#pragma once
#include <memory>
#include <optional>
#include <vector>
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<std::shared_ptr<Component>> components;
template <std::derived_from<Component> T> T &AddComponent() {
auto &ptr = components.emplace_back(std::make_shared<T>());
ptr->entity = this;
ptr->Setup();
return static_cast<T &>(*ptr);
}
template <std::derived_from<Component> T>
std::optional<std::reference_wrapper<T>> GetComponent() const {
for (auto &c : components) {
T *cast = dynamic_cast<T *>(c.get());
if (cast) {
return *cast;
}
}
return {};
}
void Update(float dt) {
for (auto &c : components) {
c->Update(dt);
}
}
};

8
as6/Systems.hpp 100644
View File

@ -0,0 +1,8 @@
#pragma once
#include <vector>
#include "Entity.hpp"
void UpdateAllSystems(std::vector<Entity> &entities, float deltaTime) {
}

29
as6/main.cpp 100644
View File

@ -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<Entity> entities;
entities.reserve(20);
auto &world = entities.emplace_back();
world.AddComponent<ScrollComponent>();
while (!window.ShouldClose()) {
float dt = window.GetFrameTime();
UpdateAllSystems(entities, dt);
window.BeginDrawing();
window.ClearBackground(raylib::Color::Black());
DrawSceneOutline();
window.EndDrawing();
}
return 0;
}

12
as6/ui_layout.rgl 100644
View File

@ -0,0 +1,12 @@
#
# rgl layout text file (v4.0) - raygui layout file generated using rGuiLayout
#
# Number of controls: 1
#
# Ref. window: r <x> <y> <width> <height>
# Anchor info: a <id> <name> <posx> <posy> <enabled>
# Control info: c <id> <type> <name> <rectangle> <anchor_id> <text>
#
r 0 40 -1 -1
a 001 anchor01 456 240 1
c 000 18 GravityBar 72 24 240 16 0 Gravity