码迷,mamicode.com
首页 > 其他好文 > 详细

第五讲:世界

时间:2014-11-17 19:15:39      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   sp   for   文件   数据   div   

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

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

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 = 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(); } };
};

 

第五讲:世界

标签:style   blog   color   ar   sp   for   文件   数据   div   

原文地址:http://www.cnblogs.com/softeem/p/4103965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!