浏览代码

actor binding basics

Sam Jaffe 6 年之前
父节点
当前提交
d5b793ea92
共有 5 个文件被更改,包括 30 次插入4 次删除
  1. 15 0
      include/danmaku/actor.hpp
  2. 1 1
      include/danmaku/bullet_pattern.hpp
  3. 6 0
      include/danmaku/enemy.hpp
  4. 4 0
      src/entity/actor.cxx
  5. 4 3
      src/level.cxx

+ 15 - 0
include/danmaku/actor.hpp

@@ -10,6 +10,14 @@
 
 #include "game/engine/entity.hpp"
 
+namespace objects { namespace prototype {
+  template <typename, typename...> class factory;
+}}
+
+namespace graphics {
+  class manager;
+}
+
 namespace danmaku {
   class level;
   struct actor : public engine::entity {
@@ -18,4 +26,11 @@ namespace danmaku {
     virtual void level(class level *) = 0;
     virtual class level * level() const = 0;
   };
+
+  using actor_factory =
+      objects::prototype::factory<std::unique_ptr<actor>, Json::Value const &,
+                                  graphics::manager const &>;
 }
+
+#define BIND_ACTOR(name, function)                                             \
+  bool const _ = actor_factory::instance().bind(name, function)

+ 1 - 1
include/danmaku/bullet_pattern.hpp

@@ -39,4 +39,4 @@ namespace danmaku {
 }
 
 #define BIND_BULLET_PATTERN(name, function)                                    \
-  bool const _ = bullet_pattern_factory::instance().bind(name, function)\
+  bool const _ = bullet_pattern_factory::instance().bind(name, function)

+ 6 - 0
include/danmaku/enemy.hpp

@@ -7,3 +7,9 @@
 //
 
 #pragma once
+
+#include "actor.hpp"
+
+namespace danmaku {
+  class enemy : public actor {};
+}

+ 4 - 0
src/entity/actor.cxx

@@ -7,3 +7,7 @@
 //
 
 #include "danmaku/actor.hpp"
+
+#include "resource_factory/prototype_factory.hpp"
+
+INSTANTIATE_PROTOTYPE_FACTORY_2(danmaku::actor_factory);

+ 4 - 3
src/level.cxx

@@ -15,6 +15,7 @@
 #include "danmaku/player.hpp"
 #include "game/graphics/renderer.hpp"
 #include "game/math/common.hpp"
+#include "resource_factory/prototype_factory.hpp"
 
 using namespace danmaku;
 
@@ -22,8 +23,8 @@ std::vector<std::unique_ptr<actor>>
 get_wave(Json::Value const & json, graphics::manager const & manager) {
   std::vector<std::unique_ptr<actor>> out;
   for (int i = 0; i < json.size(); ++i) {
-    // TODO
-    out.emplace_back(nullptr);
+    auto & factory = actor_factory::instance();
+    out.emplace_back(factory.get(json["type"].asString(), json, manager));
   }
   return out;
 }
@@ -51,7 +52,7 @@ void level::add_bullet(bullet b) {
 }
 
 void level::update(float delta) {
-
+  update_waves(delta);
   for (auto & a : actors_) {
     a->update(delta);
   }