标签: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