]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
README updates.
authorAlec Thomas <alec@swapoff.org>
Wed, 24 Oct 2012 21:07:08 +0000 (17:07 -0400)
committerAlec Thomas <alec@swapoff.org>
Wed, 24 Oct 2012 21:07:08 +0000 (17:07 -0400)
CMakeLists.txt
README.md
entityx/Manager.cc [new file with mode: 0644]
entityx/Manager.h [new file with mode: 0644]
entityx/System_test.cc
entityx/World.cc [deleted file]
entityx/World.h [deleted file]

index 253cc709eddf087fada2adb18d4fb257b3bfbbf5..afb314636a6dc0c518e08cb393232c1e5dea68df 100644 (file)
@@ -59,7 +59,7 @@ set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
 set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
 
-set(sources entityx/Components.cc entityx/System.cc entityx/Event.cc entityx/Entity.cc entityx/World.cc)
+set(sources entityx/Components.cc entityx/System.cc entityx/Event.cc entityx/Entity.cc entityx/Manager.cc)
 add_library(entityx STATIC ${sources})
 add_library(entityx_shared SHARED ${sources})
 
index cd5fff64143a7d5d19ed07b44cceecac6ae4e8e1..4b71e9447c899a72e0cb45ad6615789d3fc62098 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,18 +1,18 @@
 # EntityX - A fast, type-safe C++ Entity-Component system
 
-Entity-Component (EC) systems are a form of decomposition that completely decouple entity logic and data from the entity "objects" themselves. The [Evolve your Hierarchy](http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/) article provides a solid overview of EC systems.
+Entity-Component (EC) systems are a form of decomposition that completely decouples entity logic and data from the entity "objects" themselves. The [Evolve your Hierarchy](http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/) article provides a solid overview of EC systems and why you should use them.
 
-EntityX is an EC system that uses C++11 features to provide type-safe component management, event delivery, etc.
+EntityX is an EC system that uses C++11 features to provide type-safe component management, event delivery, etc. It was built during the creation of a 2D space shooter.
 
 ## Overview
 
-In EntityX data associated with an entity is called a `Component`. `Systems` use components to implement behavior and can utilize as many components as necessary. An `EventManager` allows systems to interact without being tightly coupled. Finally, a `World` object ties all of the systems together for convenience.
+In EntityX data associated with an entity is called a `Component`. `Systems` encapsulate logic and can use as many component types as necessary. An `EventManager` allows systems to interact without being tightly coupled. Finally, a `Manager` object ties all of the systems together for convenience.
 
 As an example, a physics system might need *position* and *mass* data, while a collision system might only need *position* - the data would be logically separated into two components, but usable by any system. The physics system might emit *collision* events whenever two entities collide.
 
 ## Tutorial
 
-
+Following is some skeleton code that implements `Position` and `Direction` components, a `MovementSystem` using these data components, and a `CollisionSystem` that emits `Collision` events when two entities collide.
 
 ### Entities
 
@@ -66,15 +66,6 @@ entities.assign(entity, position);
 
 #### Querying entities and their components
 
-To retrieve a component associated with an entity use ``EntityManager::component()``:
-
-```
-boost::shared_ptr<Position> position = entities.component<Position>();
-if (position) {
-  // Do stuff with position
-}
-```
-
 To query all components with a set of components assigned use ``EntityManager::entities_with_components()``. This method will return only those entities that have *all* of the specified components associated with them, assigning each component pointer to the corresponding component instance:
 
 ```
@@ -85,6 +76,15 @@ for (auto entity : entities.entities_with_components(position, direction)) {
 }
 ```
 
+To retrieve a component associated with an entity use ``EntityManager::component()``:
+
+```
+boost::shared_ptr<Position> position = entities.component<Position>();
+if (position) {
+  // Do stuff with position
+}
+```
+
 ### Systems (implementing behavior)
 
 Systems implement behavior using one or more components. Implementations are subclasses of `System<T>` and *must* implement the `update()` method, as shown below.
@@ -94,8 +94,8 @@ A basic movement system might be implemented with something like the following:
 ```
 struct MovementSystem : public System<MovementSystem> {
   void update(EntityManager &es, EventManager &events, double dt) override {
-    Position *position;
-    Direction *direction;
+    boost::shared_ptr<Position> position;
+    boost::shared_ptr<Direction> direction;
     for (auto entity : es.entities_with_components(position, direction)) {
       position->x += direction->x;
       position->y += direction->y;
@@ -154,7 +154,7 @@ struct DebugCollisions : public Receiver<DebugCollisions> {
 };
 ```
 
-Note that a single class can receive any number of types of events by implementing a ``receive(const EventType &)`` method for each event type.
+***Note:** a single class can receive any number of types of events by implementing a ``receive(const EventType &)`` method for each event type.*
 
 Finally, we subscribe our receiver to collision events:
 
@@ -168,14 +168,14 @@ DebugCollisions debug_collisions;
 events.subscribe<Collision>(debug_collisions);
 ```
 
-### World (tying it all together)
+### Manager (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.
+Managing systems, components and entities can be streamlined by subclassing `Manager`. It is not necessary, but it provides callbacks for configuring systems, initializing entities, and so on.
 
-To use it, subclass `World` and implement `configure()`, `initialize()` and `update()`:
+To use it, subclass `Manager` and implement `configure()`, `initialize()` and `update()`:
 
 ```
-class GameWorld : public World {
+class GameManager : public Manager {
  protected:
   void configure() {
     system_manager.add<MovementSystem>();
@@ -202,7 +202,7 @@ class GameWorld : public World {
 
 EntityX has the following build and runtime requirements:
 
-- A C++ compiler that supports a basic set of C++11 features (eg. recent clang, recent gcc).
+- A C++ compiler that supports a basic set of C++11 features (ie. recent clang, recent gcc, but **NOT** Visual C++).
 - [CMake](http://cmake.org/)
 - [Boost](http://boost.org) `1.48.0` or higher (links against `boost::signals`).
 - [Glog](http://code.google.com/p/google-glog/) (tested with `0.3.2`).
diff --git a/entityx/Manager.cc b/entityx/Manager.cc
new file mode 100644 (file)
index 0000000..012e06f
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * Copyright (C) 2012 Alec Thomas <alec@swapoff.org>
+ * All rights reserved.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.
+ * 
+ * Author: Alec Thomas <alec@swapoff.org>
+ */
+
+#include "Manager.h"
+
+namespace entity {
+
+void Manager::start() {
+  configure();
+  system_manager.configure();
+  initialize();
+}
+
+void Manager::run() {
+  running_ = true;
+  double dt;
+  timer_.restart();
+  while (running_) {
+    dt = timer_.elapsed();
+    timer_.restart();
+    update(dt);
+  }
+}
+
+void Manager::stop() {
+  running_ = false;
+}
+
+}
diff --git a/entityx/Manager.h b/entityx/Manager.h
new file mode 100644 (file)
index 0000000..66ace3f
--- /dev/null
@@ -0,0 +1,59 @@
+/**
+ * Copyright (C) 2012 Alec Thomas <alec@swapoff.org>
+ * All rights reserved.
+ * 
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.
+ * 
+ * Author: Alec Thomas <alec@swapoff.org>
+ */
+
+#pragma once
+
+#include <boost/timer.hpp>
+#include "entityx/Entity.h"
+#include "entityx/Event.h"
+#include "entityx/System.h"
+
+namespace entity {
+
+class Manager {
+ public:
+  Manager() : entity_manager(event_manager), system_manager(entity_manager, event_manager) {}
+  virtual ~Manager() {}
+
+  void start();
+  void run();
+  void stop();
+
+ protected:
+  /**
+   * Configure the world.
+   *
+   * This is called once on Manager initialization. It is typically used to add Systems to the world, load permanent
+   * resources, global configuration, etc.
+   */
+  virtual void configure() = 0;
+
+  /**
+   * Initialize the entities and events in the world.
+   *
+   * Typically used when 
+   */
+  virtual void initialize() = 0;
+
+  /**
+   * Update the world.
+   */
+  virtual void update(double dt) = 0;
+
+  EventManager event_manager;
+  EntityManager entity_manager;
+  SystemManager system_manager;
+
+ private:
+  boost::timer timer_;
+  bool running_ = false;
+};
+
+}
index 0c54dabb5d3275fd13d35b9b5fe22e34633e2422..2dad4d90d99147912b5c15bd694870d465278a51 100644 (file)
@@ -12,7 +12,7 @@
 #include <vector>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
-#include "entityx/World.h"
+#include "entityx/Manager.h"
 #include "entityx/System.h"
 
 
@@ -52,7 +52,7 @@ class MovementSystem : public System<MovementSystem> {
 };
 
 
-class TestWorld : public entity::World {
+class TestManager : public entity::Manager {
  public:
   std::vector<Entity> entities;
 
@@ -81,31 +81,31 @@ class TestWorld : public entity::World {
 
 class SystemManagerTest : public ::testing::Test {
  protected:
-  TestWorld world;
+  TestManager manager;
 
   virtual void SetUp() override {
-    world.start();
+    manager.start();
   }
 };
 
 
 TEST_F(SystemManagerTest, TestConstructSystemWithArgs) {
-  world.sm().add<MovementSystem>("movement");
-  world.sm().configure();
+  manager.sm().add<MovementSystem>("movement");
+  manager.sm().configure();
 
-  ASSERT_EQ("movement", world.sm().system<MovementSystem>()->label);
+  ASSERT_EQ("movement", manager.sm().system<MovementSystem>()->label);
 }
 
 
 TEST_F(SystemManagerTest, TestApplySystem) {
-  world.sm().add<MovementSystem>();
-  world.sm().configure();
+  manager.sm().add<MovementSystem>();
+  manager.sm().configure();
 
-  world.sm().update<MovementSystem>(0.0);
+  manager.sm().update<MovementSystem>(0.0);
   shared_ptr<Position> position;
   shared_ptr<Direction> direction;
-  for (auto entity : world.entities) {
-    world.em().unpack<Position, Direction>(entity, position, direction);
+  for (auto entity : manager.entities) {
+    manager.em().unpack<Position, Direction>(entity, position, direction);
     if (position && direction) {
       ASSERT_FLOAT_EQ(2.0, position->x);
       ASSERT_FLOAT_EQ(3.0, position->y);
diff --git a/entityx/World.cc b/entityx/World.cc
deleted file mode 100644 (file)
index 05a10d7..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (C) 2012 Alec Thomas <alec@swapoff.org>
- * All rights reserved.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.
- * 
- * Author: Alec Thomas <alec@swapoff.org>
- */
-
-#include "World.h"
-
-namespace entity {
-
-void World::start() {
-  configure();
-  system_manager.configure();
-  initialize();
-}
-
-void World::run() {
-  running_ = true;
-  double dt;
-  timer_.restart();
-  while (running_) {
-    dt = timer_.elapsed();
-    timer_.restart();
-    update(dt);
-  }
-}
-
-void World::stop() {
-  running_ = false;
-}
-
-}
diff --git a/entityx/World.h b/entityx/World.h
deleted file mode 100644 (file)
index 0cca1e2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright (C) 2012 Alec Thomas <alec@swapoff.org>
- * All rights reserved.
- * 
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.
- * 
- * Author: Alec Thomas <alec@swapoff.org>
- */
-
-#pragma once
-
-#include <boost/timer.hpp>
-#include "entityx/Entity.h"
-#include "entityx/Event.h"
-#include "entityx/System.h"
-
-namespace entity {
-
-class World {
- public:
-  World() : entity_manager(event_manager), system_manager(entity_manager, event_manager) {}
-  virtual ~World() {}
-
-  void start();
-  void run();
-  void stop();
-
- protected:
-  /**
-   * Configure the world.
-   *
-   * This is called once on World initialization. It is typically used to add Systems to the world, load permanent
-   * resources, global configuration, etc.
-   */
-  virtual void configure() = 0;
-
-  /**
-   * Initialize the entities and events in the world.
-   *
-   * Typically used when 
-   */
-  virtual void initialize() = 0;
-
-  /**
-   * Update the world.
-   */
-  virtual void update(double dt) = 0;
-
-  EventManager event_manager;
-  EntityManager entity_manager;
-  SystemManager system_manager;
-
- private:
-  boost::timer timer_;
-  bool running_ = false;
-};
-
-}