第五讲:世界

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

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

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();
    }
  };};
时间: 2024-08-09 05:42:32

第五讲:世界的相关文章

《上古天真论》第五讲文字版

上古天真论篇第五讲 主讲:徐文兵  主持:梁  冬 播出时间:2008-12-27  23:00—24:00 经文:是以嗜欲不能劳其目,淫邪不能惑其心,愚智贤不肖,不惧于物,故合于道.所以能年皆度百岁而动作不衰者,以其德全不危也. 梁冬:是的重新发现中医太美.大家好!欢迎收听今天晚上国学堂之<黄帝内经>之<上古天真论>之第二段.第三段.依然在我们对面的是我所崇敬的专门研究<黄帝内经>的,而且有趣地专门能把<黄帝内经>讲清楚的厚朴中医学堂堂主徐文兵老师,徐老师

OpenGL编程 基础篇(五)世界窗口和视口

一.基本定义 世界窗口:在世界坐标系中定义一个对齐的矩形(aligned rectangle,即矩阵的边与坐标轴平行)的窗口,这个世界窗口外的部分被裁减并不被绘制.OpenGL会自动地做剪裁. 视口:在显示器的屏幕窗口上定义一个对齐的矩形的视口,OpenGL会自动建立世界窗口和视口的变换(包括缩放和平移).当世界窗口中所有对象都被绘制时,对象在世界窗 口中的部分会被自动地映射到视口中----换句话说,被映射到屏幕坐标中,即像素在显示器上的坐标. 二.相关函数介绍 1.对于二维绘图来说,世界窗口由

铁狮门, 世界一流的房地产业开发商、运营商及基金管理公司

美国铁狮门 编辑 铁狮门(TISHMAN SPEYER)是世界一流的房地产业开发商.运营商及基金管理公司,擅长开发并与管理密切结合.铁狮门收购.开发.管理的物业总值达到681亿美元,目前在全球各大都市管理着362个项目.总面积1.3亿平方英尺的商业物业组合及9200万平方英尺的住宅单元,向中国和印度积极拓展投资和开发业务.TSP秉承创造最大的价值的哲学理念,并与每个单位或项目展开深入合作,鼓励文化的创造和跨学科的各种非常规思维的相互结合.TSP旗下的标志性建筑囊括洛克菲勒中心.克莱斯勒中心.柏林

HTTPS 互联网世界的安全基础

近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是模糊的知道大概是更安全,但到底怎么变得更安全的,实际上整个细节和流程并没有掌握的特别清晰. 所以这篇关于 HTTPS 的技术总结文章,主要提供一个关于 HTTPS 中的 S 一个整体的认识.从其产生的历史背景.设计目标说起,到分析其协议设计结构.交互流程是如何实现其目标.最后结合我们自己的案例分析下

活着就能改变世界

乔帮主说活着就要改变世界,其实活着就能改变世界,摘自老罗的一段话: 每一个生命来到世间,都注定改变世界,这是你的宿命,你别无选择.你要么把世界变得好一点,要么把世界变得坏一点.有些人不服气,说:“妈的我就不信了,我自杀.”你自杀就把这个 世界的自杀率改变了一点点.你如果走进社会,为了生存或是为了什么不要脸的理由,变成了一个 恶心的成年人社会中的一员,那你就把这个世界变得恶心了一点点.如果你一生耿直,刚正不阿, 没做任何恶心的事情,没有做任何对别人造成伤害的事情,一辈子拼了老命勉强把老婆.孩子.老

会飞的汽车真能改变世界吗?

日前,会飞的汽车正成为交通界的大热话题,据国外媒体报道,美国一家名叫"脱离地球"的公司已经推出一款比较靠谱的飞行汽车,这款汽车的外观主体和一般汽车相似,只是车门的部分多了两个可折叠的翅膀.正常情况下,翅膀可以折叠:想要飞行的时候,翅膀就会张开,相信一般读者都没有见过实体车辆,但估计大家都能想象出这款汽车的变身情景,毕竟,这个过程在变形金刚里已经演练了无数次.除此之外,汽车巨头丰田也早早涉猎该领域,并推出相似的概念汽车:在天津某汽车博览会上,中国汽车厂商也曾展出过"会飞的汽车&

物联网世界常见传输方式简介(思维导图)

物联网世界常见的传输方式包括:移动网络(2G/3G/4G).wifi.蓝牙.ZigBee等传统的传输方式,以及基于NB-IOT.Lora等新兴的传输方式.以下思维导图供参考: 点击附件下载原图.

读《世界是数字的》有感

<世界是数字的>这本书开篇作者举了两个例子分别是数码产品对世界和对自己的影响.然后给我们介绍了几种常见的数码产品的前世今生.我们从这些例子里面知道现在的社会会越来越数字化,而我们身处其中也会带来一些隐患.所以我们在使用电子产品的时候要注意自己的言行举止. 其次书给我们介绍了许多计算机的硬件,让作者更清楚明白的知道计算机的构造,作者让我们知道好多计算机的专业知识,先引导我们进入计算机的世界,然后再升入告诉我们计算机的世界是什么样子的,然后告诉我们要如何的应用好这些数字的产品. 从书中的东西我联想

《世界是数字的》读后感

我们生活在一个被数字包围的时代.信息瞬息万变,打开电脑可以看到非常多的新闻,不仅仅有本国的还有他国的.这些依靠互联网才能如此迅速的传播,而互联网依靠的是计算机来展示给人们.世界上第一个计算机ENIAC于1964年在美国宾夕法尼亚大学诞生,其体积非常的打,耗电高,能存储的数据少,cpu也不能做非常高深的计算.可是发展到现在计算机的体积越来越像,cpu的速度越来越快,能存储的数据越来越多.一块2.1GHz处理器,它每秒钟跳动21亿次.人类的心跳大约是1赫兹,也就是每天大约跳10万次,每年将近3千万次