From 189afb447e2c76e5dd5e4550e786c5175a828cbc Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Mon, 5 Aug 2024 21:49:23 -0400 Subject: [PATCH] add lua support --- .gitmodules | 3 +++ Makefile | 4 +-- main.cpp | 69 ++++++++++++++++++++++++++++++++--------------- scripts/world.lua | 17 ++++++++++++ sol2 | 1 + 5 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 scripts/world.lua create mode 160000 sol2 diff --git a/.gitmodules b/.gitmodules index 3f53ce8..4f0db41 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "entt"] path = entt url = https://github.com/skypjack/entt +[submodule "sol2"] + path = sol2 + url = https://github.com/ThePhD/sol2 diff --git a/Makefile b/Makefile index 88cd5d7..9def519 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CXXFLAGS := -std=c++23 -O0 -g3 -ggdb \ - -Iinclude -Ientt/single_include -LDFLAGS := -lSDL2 -lSDL2_image + -Iinclude -Ientt/single_include -Isol2/include `pkg-config --cflags lua5.4` +LDFLAGS := -lSDL2 -lSDL2_image `pkg-config --libs lua5.4` OBJS := $(subst .cpp,.o,$(wildcard *.cpp)) diff --git a/main.cpp b/main.cpp index c137cc1..0d3feeb 100644 --- a/main.cpp +++ b/main.cpp @@ -6,36 +6,66 @@ #include "window.hpp" #include +#include #include #include #include +#include #include constexpr std::chrono::microseconds FRAME_TIME (1'000'000 / 60); static bool handleInputs(entt::registry& registry); -int main() +int main(int argc, const char *argv[]) { + entt::registry registry; + sol::state lua; + if (auto err = sdl2Initialize(); err) return err; - entt::registry registry; + for (int i = 1; i < argc; ++i) + lua.script_file(argv[i]); - { - const auto ent = registry.create(); - registry.emplace(ent); - registry.emplace(ent, 0.f, WINDOW_HEIGHT - 200.f); - registry.emplace(ent, 0.f, 0.f); - registry.emplace(ent, "img/player.png"); - } + sol::optional entities = lua["entities"]; + if (entities) { + entities->for_each([®istry](sol::object _, sol::object val) { + const auto ent = registry.create(); + auto tbl = val.as(); - { - const auto ent = registry.create(); - registry.emplace(ent, 0.f, 0.f); - registry.emplace(ent, "img/level.png"); - registry.emplace(ent, "img/level.png"); + sol::optional solid = tbl["solid"]; + if (solid) { + registry.emplace(ent, solid->c_str()); + } + + sol::optional texture = tbl["texture"]; + if (texture) { + registry.emplace(ent, texture->c_str()); + } + + sol::optional point = tbl["point"]; + if (point) { + registry.emplace(ent, + static_cast((*point)["x"]), + static_cast((*point)["y"])); + } + + sol::optional velocity = tbl["velocity"]; + if (velocity) { + registry.emplace(ent, + static_cast((*velocity)["x"]), + static_cast((*velocity)["y"])); + } + + sol::optional player = tbl["player"]; + if (player) { + registry.emplace(ent); + } + }); + } else { + std::cout << "No entities defined..." << std::endl; } do { @@ -50,14 +80,9 @@ int main() registry.view().each( [®istry](auto& s, auto& p) { registry.view().each( - [&s, &p](auto& _, auto& pp, auto& pv, auto& t) { - const auto c = s.collision(pp + t.dim()); - - if (c) { - if (std::abs(c) > 1.f) - pv.y = c * 0.5f; - else - pv.y = 0.f; + [&s, &p](auto& _, auto& pp, auto& pv, auto& pt) { + if (const auto c = s.collision(pp + pt.dim()); c) { + pv.y = (std::abs(c) > 1.f) ? c * 0.25f : 0.f; } else { pv.y += 0.1f; } diff --git a/scripts/world.lua b/scripts/world.lua new file mode 100644 index 0000000..5be4441 --- /dev/null +++ b/scripts/world.lua @@ -0,0 +1,17 @@ +WINDOW_WIDTH = 640 +WINDOW_HEIGHT = 480 + +entities = { + [0] = { + point = { x = 0, y = WINDOW_HEIGHT - 200 }, + texture = "img/player.png", + velocity = { x = 0, y = 0 }, + player = {}, + }, + [1] = { + point = { x = 0, y = 0 }, + texture = "img/level.png", + solid = "img/level.png", + }, +} + diff --git a/sol2 b/sol2 new file mode 160000 index 0000000..2b0d2fe --- /dev/null +++ b/sol2 @@ -0,0 +1 @@ +Subproject commit 2b0d2fe8ba0074e16b499940c4f3126b9c7d3471