diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2024-08-05 21:49:23 -0400 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2024-08-05 21:49:23 -0400 |
commit | 189afb447e2c76e5dd5e4550e786c5175a828cbc (patch) | |
tree | 9d309a927889ffc707800731f32c64407ad6cfee | |
parent | 456ef376530fc4644732d499c862f1413b9987d9 (diff) |
add lua support
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | main.cpp | 69 | ||||
-rw-r--r-- | scripts/world.lua | 17 | ||||
m--------- | sol2 | 0 |
5 files changed, 69 insertions, 24 deletions
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 @@ -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)) @@ -6,36 +6,66 @@ #include "window.hpp" #include <chrono> +#include <fstream> #include <iostream> #include <thread> #include <entt/entt.hpp> +#include <sol/sol.hpp> #include <SDL2/SDL.h> 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<Player>(ent); - registry.emplace<Point>(ent, 0.f, WINDOW_HEIGHT - 200.f); - registry.emplace<Velocity>(ent, 0.f, 0.f); - registry.emplace<Texture>(ent, "img/player.png"); - } + sol::optional<sol::table> entities = lua["entities"]; + if (entities) { + entities->for_each([®istry](sol::object _, sol::object val) { + const auto ent = registry.create(); + auto tbl = val.as<sol::table>(); - { - const auto ent = registry.create(); - registry.emplace<Point>(ent, 0.f, 0.f); - registry.emplace<Texture>(ent, "img/level.png"); - registry.emplace<Solid>(ent, "img/level.png"); + sol::optional<std::string> solid = tbl["solid"]; + if (solid) { + registry.emplace<Solid>(ent, solid->c_str()); + } + + sol::optional<std::string> texture = tbl["texture"]; + if (texture) { + registry.emplace<Texture>(ent, texture->c_str()); + } + + sol::optional<sol::table> point = tbl["point"]; + if (point) { + registry.emplace<Point>(ent, + static_cast<float>((*point)["x"]), + static_cast<float>((*point)["y"])); + } + + sol::optional<sol::table> velocity = tbl["velocity"]; + if (velocity) { + registry.emplace<Velocity>(ent, + static_cast<float>((*velocity)["x"]), + static_cast<float>((*velocity)["y"])); + } + + sol::optional<sol::table> player = tbl["player"]; + if (player) { + registry.emplace<Player>(ent); + } + }); + } else { + std::cout << "No entities defined..." << std::endl; } do { @@ -50,14 +80,9 @@ int main() registry.view<Solid, Point>().each( [®istry](auto& s, auto& p) { registry.view<Player, Point, Velocity, Texture>().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 +Subproject 2b0d2fe8ba0074e16b499940c4f3126b9c7d347 |