]> code.bitgloo.com Git - clyne/gamedev2.git/commitdiff
ui-coord mouse interacts with world-coord entity
authorClyne Sullivan <clyne@bitgloo.com>
Thu, 17 Nov 2022 18:47:16 +0000 (13:47 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Thu, 17 Nov 2022 18:47:16 +0000 (13:47 -0500)
Scripts/init.lua
src/engine.cpp
src/render.cpp
src/render.hpp
src/script.hpp

index fde6c8642a64c9ff32c6490e931183d93ba7cd85..1ae2efcc55c94a50526fb5ff269db9b30f51745d 100644 (file)
@@ -24,12 +24,16 @@ player = {
             end
         end,
         JumpKeyReleased = function(self)
-            game.dialog(30, 50, 400, 100)
-            game.puts("dialog", 36, 52, "Hey. Hag?")
         end,
         MousePressed = function(self, mx, my)
-            if mx > 30 and mx < 430 and my > 50 and my < 150 then
-                game.dialogClear()
+            mp = game.uiToWorldCoord(mx, my)
+            if math.abs(mp.x - self.Position.x) < 1 and math.abs(mp.y - self.Position.y) < 1 then
+                game.dialog(30, 50, 400, 100)
+                game.puts("dialog", 36, 52, "What do you think you're doing?")
+            else
+                if mx > 30 and mx < 430 and my > 50 and my < 150 then
+                    game.dialogClear()
+                end
             end
         end
     },
index 25e3cd30d560b709dd9b845add1d5f71d3b5bf4c..a80dfe312a62a3637d025d2324ea618cbc7d9a31 100644 (file)
@@ -76,6 +76,9 @@ int Engine::init(void)
                      systems.system<UISystem>().get()));
     script->addToGameNamespace("dialogClear",
         [this] { events.emit<HideDialog>(); });
+    script->addToGameNamespace("uiToWorldCoord",
+        bindInstance(&RenderSystem::uiToWorldCoord,
+                     systems.system<RenderSystem>().get()));
     script->init();
     
 
index 5ae2c15364b77190ffeecb9a1940f2a7919478fc..9965b8fa24ea18542924a99ad3fea2fbe3d85cd5 100644 (file)
@@ -25,8 +25,8 @@
 #include <components/Light.hpp>
 #include <components/Script.hpp>
 
-void RenderSystem::configure([[maybe_unused]] entityx::EntityManager& entities,
-                             [[maybe_unused]] entityx::EventManager& events)
+void RenderSystem::configure(entityx::EntityManager&,
+                             entityx::EventManager& events)
 {
     events.subscribe<NewRenderEvent>(*this);
     events.subscribe<DelRenderEvent>(*this);
@@ -40,9 +40,33 @@ void RenderSystem::configure([[maybe_unused]] entityx::EntityManager& entities,
     init();
 }
 
-void RenderSystem::update([[maybe_unused]] entityx::EntityManager& entities,
-                          [[maybe_unused]] entityx::EventManager& events,
-                          [[maybe_unused]] entityx::TimeDelta dt)
+float RenderSystem::getWorldViewWidth() const
+{
+    return camPos.z * height / width * 2.0;
+}
+
+float RenderSystem::getWorldViewHeight() const
+{
+    return getWorldViewWidth() * height / width;
+}
+
+Position RenderSystem::uiToWorldCoord(float x, float y) const
+{
+    glm::vec2 scaled;
+    scaled.x = x / width - 0.5;
+    scaled.y = y / height - 0.5;
+
+    Position world;
+    world.x = scaled.x * getWorldViewWidth() + camPos.x;
+    world.y = scaled.y * getWorldViewHeight() + camPos.y;
+    world.z = camPos.z;
+
+    return world;
+}
+
+void RenderSystem::update(entityx::EntityManager& entities,
+                          entityx::EventManager&,
+                          entityx::TimeDelta)
 {
     // TODO move these to only happen once to speed up rendering
     static GLuint s = worldShader.getProgram();
@@ -309,7 +333,7 @@ void RenderSystem::update([[maybe_unused]] entityx::EntityManager& entities,
     SDL_GL_SwapWindow(window.get());
 }
 
-int RenderSystem::init(void)
+int RenderSystem::init()
 {
 
     if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0) {
index ede3f88d7ed6f4e7938e56732c474cfd31ff0b19..786954e201e8c3ed10878463ec17f2b94d61170a 100644 (file)
@@ -82,11 +82,12 @@ private:
     std::map<GLuint, WorldRenderData> worldRenders;
 
     entityx::Entity player; // Save the player so we can track the camera
+
 public:
     RenderSystem() :
         window(nullptr, SDL_DestroyWindow) {}
 
-    ~RenderSystem(void)
+    ~RenderSystem()
     {
         SDL_GL_DeleteContext(context);
         SDL_Quit();
@@ -109,7 +110,24 @@ public:
      * Initializes the rendering system
      * @return Zero on success, non-zero on error
      */
-    int init(void);
+    int init();
+
+    glm::vec3 getCameraPosition() const {
+        return camPos;
+    }
+
+    Position uiToWorldCoord(float x, float y) const;
+
+    /**
+     * Returns the width of the camera's view in world coordinates.
+     */
+    float getWorldViewWidth() const;
+
+    /**
+     * Returns the height of the camera's view in world coordinates.
+     */
+    float getWorldViewHeight() const;
+
 
     /************
     *  EVENTS  *
index 24cc14255bf0b836d1d4c8a25e8113437844c7a5..dadddfaa3ce1e6017de933ce9e39c1f2ec15f644 100644 (file)
 #ifndef SYSTEM_SCRIPT_HPP_
 #define SYSTEM_SCRIPT_HPP_
 
+#include "world.hpp"
+
 #include <entityx/entityx.h>
 #include <sol/sol.hpp>
 
-#include "world.hpp"
+#include <concepts>
 
 /**
  * Utility for pairing class instances to their member function calls.
  * This is useful for adding functions to the Lua game namespace.
  *
+ * TODO I am certain that this can be done better. -clyne
+ *
  * @param func The member function to call
  * @param instance The instance to bind to
  * @return A function that calls the member function using the given instance
 template<class C, typename R, typename... Args>
 auto bindInstance(R (C::* func)(Args...), C *instance)
 {
-    return [instance, func](Args... args) { (instance->*func)(args...); };
+    if constexpr (std::same_as<R, void>)
+        return [instance, func](Args... args) { (instance->*func)(args...); };
+    else
+        return [instance, func](Args... args) { return (instance->*func)(args...); };
+}
+template<class C, typename R, typename... Args>
+auto bindInstance(R (C::* func)(Args...) const, const C *instance)
+{
+    if constexpr (std::same_as<R, void>)
+        return [instance, func](Args... args) { (instance->*func)(args...); };
+    else
+        return [instance, func](Args... args) { return (instance->*func)(args...); };
 }