]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
Allow System's to be added pre-created to the SystemManager.
authorAlec Thomas <alec@swapoff.org>
Mon, 22 Oct 2012 20:02:08 +0000 (16:02 -0400)
committerAlec Thomas <alec@swapoff.org>
Mon, 22 Oct 2012 20:02:08 +0000 (16:02 -0400)
README.md
entityx/System.h

index db4f140c03d98027f7737fb92c5df625e18e1a17..cd5fff64143a7d5d19ed07b44cceecac6ae4e8e1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@ As an example, a physics system might need *position* and *mass* data, while a c
 
 ## Tutorial
 
+
+
 ### Entities
 
 Entities are simply 64-bit numeric identifiers with which components are associated. Entity IDs are allocated by the `EntityManager`. Components are then associated with the entity, and can be queried or retrieved directly.
@@ -168,6 +170,34 @@ events.subscribe<Collision>(debug_collisions);
 
 ### World (tying it all together)
 
+Managing systems, components and entities can be streamlined by subclassing `World`. It is not necessary, but it provides callbacks for configuring systems, initializing entities and the world, and so on.
+
+To use it, subclass `World` and implement `configure()`, `initialize()` and `update()`:
+
+```
+class GameWorld : public World {
+ protected:
+  void configure() {
+    system_manager.add<MovementSystem>();
+    system_manager.add<CollisionSystem>();
+  }
+  
+  void initialize() {
+    // Create some entities in random locations heading in random directions
+    for (int i = 0; i < 100; ++i) {
+      Entity entity = entity_manager.create();
+      entity_manager.assign<Position>(entity, rand() % 100, rand() % 100);
+      entity_manager.assign<Direction>(entity, (rand() % 10) - 5, (rand() % 10) - 5);
+    }
+  }
+  
+  void update(double dt) {
+    system_manager.update<MovementSystem>(dt);
+    system_manager.update<CollisionSystem>(dt);
+  }
+};
+```
+
 ## Installation
 
 EntityX has the following build and runtime requirements:
@@ -184,4 +214,4 @@ Once these dependencies are installed you should be able to build and install En
 mkdir build && cd build && cmake .. && make && make test && make install
 ```
 
-EntityX has currently only been tested on Mac OSX (Lion and Mountain Lion). Reports and patches for builds on other platforms are welcome.
\ No newline at end of file
+EntityX has currently only been tested on Mac OSX (Lion and Mountain Lion). Reports and patches for builds on other platforms are welcome.
index 1881b13fd960f90ea1fc2e5b00179487f08cae4d..a754352991f49fbe7f341e30716947abc8590d1e 100644 (file)
@@ -83,12 +83,26 @@ class SystemManager : boost::noncopyable {
    * Must be called before Systems can be used.
    *
    * eg.
-   * auto movement = system.add<MovementSystem>()
+   * boost::shared_ptr<MovementSystem> movement = boost::make_shared<MovementSystem>();
+   * system.add(movement);
+   */
+  template <typename S>
+  void add(boost::shared_ptr<S> system) {
+    systems_.insert(std::make_pair(S::family(), system));
+  }
+
+  /**
+   * Add a System to the SystemManager.
+   *
+   * Must be called before Systems can be used.
+   *
+   * eg.
+   * auto movement = system.add<MovementSystem>();
    */
   template <typename S, typename ... Args>
   boost::shared_ptr<S> add(Args && ... args) {
-    boost::shared_ptr<S> s(new S(args ...));
-    systems_.insert(std::make_pair(S::family(), s));
+    boost::shared_ptr<S> s = boost::make_shared<S>(args ...);
+    add(s);
     return s;
   }