Browse Source

Start making collision detection.
TODO: intersects(quad, quad)

Sam Jaffe 6 years ago
parent
commit
0eb4b973e4

+ 2 - 0
engine/include/game/engine/engine_fwd.hpp

@@ -11,6 +11,8 @@
 #include <unordered_map>
 
 namespace engine {
+  using collision_t = int;
+
   using raw_key_t = int;
   using key_enum_t = int;
   using scene_id_t = std::string;

+ 3 - 2
engine/include/game/engine/entity.hpp

@@ -20,6 +20,7 @@ namespace engine {
   public:
     entity(Json::Value const & json);
     void update(float delta);
+    void collide(entity const &);
 
     graphics::object const & render_info() const { return render_info_; }
 
@@ -40,7 +41,7 @@ namespace engine {
 
     float scale;
 
-    int collides_with;
-    int collides_as;
+    collision_t collides_with;
+    collision_t collides_as;
   };
 }

+ 5 - 0
engine/include/game/engine/scene.hpp

@@ -43,6 +43,11 @@ namespace engine {
     graphics::renderer * renderer;
     std::vector<entity> entities;
 
+    // Map from entity::collides_with -> [entity*]
+    std::unordered_map<collision_t, std::vector<entity *>> colliders;
+    // Map from entity::collides_as -> [entity*]
+    std::unordered_map<collision_t, std::vector<entity *>> collidables;
+
   private:
     math::vec2 local_scene_dimension_;
     key_binding keys_;

+ 2 - 0
engine/src/entity.cxx

@@ -42,3 +42,5 @@ void entity::update(float delta) {
   velocity += acceleration * delta;
   //  render_info.angle += angular_velocity * delta;
 }
+
+void entity::collide(entity const &) {}

+ 12 - 0
engine/src/scene.cpp

@@ -11,6 +11,7 @@
 #include "game/engine/events.hpp"
 #include "game/engine/game_dispatch.hpp"
 #include "game/graphics/renderer.hpp"
+#include "game/math/common.hpp"
 
 namespace engine {
 
@@ -20,6 +21,17 @@ namespace engine {
     for (auto & ent : entities) {
       ent.update(delta);
     }
+    for (auto & pair : colliders) {
+      auto & collidable = collidables[pair.first];
+      for (auto & ent : pair.second) {
+        for (auto & hit : collidable) {
+          if (math::intersects(ent->render_info().points,
+                               hit->render_info().points)) {
+            ent->collide(*hit);
+          }
+        }
+      }
+    }
   }
 
   void scene::render() {