首页 > 代码库 > 第五讲:世界

第五讲:世界

接下来,我们进入真正的捕鱼世界。

在捕鱼的项目中,我们建立了一个独特的世界,当进入房间后,这个独一无二的世界就会衍生出来

word = new artemis::World()

在这个世界中,有自己独特的系统管理者,实体管理者,组管理者,以及tag节点管理者

namespace artemis{ World::World() {    this->systemManager = new SystemManager(*this);    this->entiryManager = new EntityManager(*this);    this->groupManager = new GroupManager();    this->tagManager = new TagManager();    delta = 0;    }
//删除实体
void World::deleteEntity(Entity& e){
if(!deleter.comtains(&e))
deleted.add(&e);
}
//获取延迟操作时间
float World::getDelta() {
        return this->delta;
    }
  //获取系统管理者
    SystemManager* World::getSystemManager() {
        return systemManager;
    }
  //获取实体管理者
    EntityManager* World::getEntityManager() {
        return entityManager;
    }
    
    GroupManager* World::getGroupManager(){
        return groupManager;
    }
    
    TagManager* World::getTagManager(){
        return tagManager;
    }
  
void World::loopStart() {
        if(!refreshed.isEmpty()) { //判断要刷新的容器中是否为空
            for(int i=0; i<refreshed.getCount(); i++) {
                //不为空,放进实体管理进行刷新
                entityManager->refresh(*refreshed.get(i));
            }
      
            refreshed.clear();
      
        }
    //下面删除需要删除的实体对象
        if(!deleted.isEmpty()) {
            for(int i=0; i<deleted.getCount(); i++) {
                Entity & e = *deleted.get(i);
                groupManager->remove(e);
                tagManager->remove(e);
                entityManager->remove(e);
            }
      
            deleted.clear();
        }
    
    }
  //创建实体
    Entity& World::createEntity() {
        return entityManager->create();
    }
  //获取实体
    Entity& World::getEntity(int entityId) {
        return entityManager->getEntity(entityId);
    }
  //刷新实体对象
    void World::refreshEntity(Entity& e) {
        refreshed.add(&e);
    }
  //设置延迟时间
    void World::setDelta(float delta) {
        this->delta = delta;
    }
  //析构世界系统
    World::~World() {
        //Entity manager should be deleted first.
    refreshed.clear();
    deleted.clear();
    
        delete entityManager;
        delete systemManager;
        delete groupManager;
        delete tagManager;
        ComponentTypeManager::deleteComponentTypes();
        SystemBitManager::removeBitSets();
    ComponentType::reset();
    }
}

world.h文件

#include "ImmutableBag.h"#include "TagManager.h"#include "GroupManager.h"namespace artemis {    class Entity;    class EntityManager;    class SystemManager;      class World {  public:    World();    ~World();    SystemManager * getSystemManager();    EntityManager * getEntityManager();    TagManager *   getTagManager();    GroupManager * getGroupManager();    float getDelta();    void setDelta(float delta);    void deleteEntity(Entity& e);    void refreshEntity(Entity& e);    Entity& createEntity();    Entity& getEntity(int entityId);    void loopStart();      private:    SystemManager * systemManager;    EntityManager * entityManager;    TagManager * tagManager;    GroupManager * groupManager;    float delta;    Bag<Entity*> refreshed;    Bag<Entity*> deleted;    };};#endif // $(Guard token)

 上面的代码,不用多多余的介绍,我们可以理解一个简单的世界系统

 

在World.h文件中,出现了一种数据类型:Bag

这是一种类似于set集合的数据类型

首先定义了一个模版类,里面除了析构函数,其余都是纯虚函数,必须由子类实现

#include <cstddef>namespace artemis {  template<typename E>  class ImmutableBag {  public:    virtual E get(int index) = 0;    virtual int getCapacity() = 0;    virtual int getCount() = 0;    virtual bool isEmpty() = 0;    virtual ~ImmutableBag(){};  };};#endif // $(Guard token)

接下来,我们来实现自己的模版容器

namespace artemis {  template<typename E>  class ImmutableBag {  public:    virtual E get(int index) = 0;    virtual int getCapacity() = 0;    virtual int getCount() = 0;    virtual bool isEmpty() = 0;    virtual ~ImmutableBag(){};  };

template<typename E> class Bag : public ImmutableBag<E>public: Bag() { init(20); }; Bag(int capacity) { init(capacity); }; Bag<E> * getGapless(){ //如果当前set已经用了,可能包含指标之间的差距。用这个来获得一个完整的set。就不会改变了原来的set。 Bag<E> * bag = new Bag<E>(this->count); //创建一个和以前set集合中数量相同的对象 for(int i=0; i < this->size; i++) //如果以前的集合中不为null,则全部添加都新的集合中 { if(this->data[i] != NULL){ bag->add(data[i]); } } return bag; } void add(E o) { if(size == count)grow(); data[count++] = o; }; void addAll(Bag<E> & bag) { for(int i=0; i < bag.size ; i++) { add(bag.data[i]); } }; void clear() { for(int i=0; i<size; i++) { data[i] = NULL; } count = 0; }; bool contains(E o) { for(int i=0; i<count; i++) if(o == data[i]) return true; return false; }; virtual E get(int index) { if (index >= size) return NULL; return (E)data[index]; }; virtual int getCapacity() {return size;}; virtual bool isEmpty() {return count == 0;}; virtual int getCount() {return count;}; bool remove(E o) { for(int i=0; i<count; i++) { if(o == data[i]) { remove(i); return true; } } return false; }; E remove(int index) { if(count == 0) return NULL; E object = data[index]; data[index] = data[count-1]; data[count-1] = NULL; count--; return (E) object; }; bool removeAll(Bag<E> bag) { bool mod = false; for(int i=0; i<bag.count; i++) for(int j= 0; j< count ; j++) if(bag.data[i] == data[j]) { remove(j); j--; // ? mod = true; break; } return mod; }; E removeLast() { if(!isEmpty()) { E object = data[count-1]; data[count-1] = NULL; --count; return (E) object; } return NULL; }; bool set(int index, E o) { if(index >= size) grow(index*2); if(o == NULL && data[index] != NULL){ count--; } else if(o != NULL && data[index] == NULL){ count++; }; data[index] = o; return true; }; void operator += (Bag<E> &bag) { addAll(bag); }; void deleteData(){ for(int i=0; i<size; i++) { delete data[i]; data[i] = NULL; } count = 0; } virtual ~Bag<E>() { delete[] data; }; private: int count; int size; E *data; void grow() { int newCapacity =(size * 3.0f) * 0.5f + 1.0f; grow(newCapacity); }; void grow(int newCapacity) { E* newData = http://www.mamicode.com/new E[newCapacity]; for (int i = 0; i < size; i++) newData[i] = data[i]; for (int i = size; i < newCapacity; i++) newData[i] = NULL; delete[] data; size = newCapacity; data = newData; }; void init(int capacity) { size = capacity; count = 0; data = new E[capacity]; clear(); } };
};

 

第五讲:世界