ComponentManager class
class ComponentManager extends Manager {
Bag<Bag<Component>> _componentsByType;
Bag<Entity> _deleted;
ComponentManager() : _componentsByType = new Bag<Bag<Component>>(),
_deleted = new Bag<Entity>();
void initialize() {}
void _removeComponentsOfEntity(Entity e) {
_forComponentsOfEntity(e, (components, typeId) {
components[e.id]._removed();
components[e.id] = null;
});
e._typeBits = 0;
}
void _addComponent(Entity e, ComponentType type, Component component) {
int index = type.id;
_componentsByType._ensureCapacity(index);
Bag<Component> components = _componentsByType[index];
if(components == null) {
components = new Bag<Component>();
_componentsByType[index] = components;
}
components[e.id] = component;
e._addTypeBit(type.bit);
}
void _removeComponent(Entity e, ComponentType type) {
if((e._typeBits & type.bit) != 0) {
int typeId = type.id;
_componentsByType[typeId][e.id]._removed();
_componentsByType[typeId][e.id] = null;
e._removeTypeBit(type.bit);
}
}
Bag<Component> getComponentsByType(ComponentType type) {
int index = type.id;
_componentsByType._ensureCapacity(index);
Bag<Component> components = _componentsByType[index];
if(components == null) {
components = new Bag<Component>();
_componentsByType[index] = components;
}
return components;
}
Component _getComponent(Entity e, ComponentType type) {
int index = type.id;
Bag<Component> components = _componentsByType[index];
if(components != null && components.isIndexWithinBounds(e.id)) {
return components[e.id];
}
return null;
}
Bag<Component> getComponentsFor(Entity e, Bag<Component> fillBag) {
_forComponentsOfEntity(e, (components, _) => fillBag.add(components[e.id]));
return fillBag;
}
void _forComponentsOfEntity(Entity e, void f(Bag<Component> components, int index)) {
int componentBits = e._typeBits;
int index = 0;
while (componentBits > 0) {
if ((componentBits & 1) == 1) {
f(_componentsByType[index], index);
}
index++;
componentBits = componentBits >> 1;
}
}
void deleted(Entity e) => _deleted.add(e);
void clean() {
_deleted.forEach((entity) => _removeComponentsOfEntity(entity));
_deleted.clear();
}
}
Extends
Manager > ComponentManager
Constructors
new ComponentManager() #
ComponentManager() : _componentsByType = new Bag<Bag<Component>>(),
_deleted = new Bag<Entity>();
Methods
void clean() #
void clean() {
_deleted.forEach((entity) => _removeComponentsOfEntity(entity));
_deleted.clear();
}
Bag<Component> getComponentsByType(ComponentType type) #
Bag<Component> getComponentsByType(ComponentType type) {
int index = type.id;
_componentsByType._ensureCapacity(index);
Bag<Component> components = _componentsByType[index];
if(components == null) {
components = new Bag<Component>();
_componentsByType[index] = components;
}
return components;
}
Bag<Component> getComponentsFor(Entity e, Bag<Component> fillBag) #
Bag<Component> getComponentsFor(Entity e, Bag<Component> fillBag) {
_forComponentsOfEntity(e, (components, _) => fillBag.add(components[e.id]));
return fillBag;
}
void initialize() #
void initialize() {}