Class: FelECS::Entities
- Inherits:
-
Object
- Object
- FelECS::Entities
- Defined in:
- lib/felecs.rb,
lib/felecs/entity_manager.rb
Overview
Creates and manages Entities. Entities are just collections of Components. You can use array methods directly on this class to access Entities.
Class Method Summary collapse
-
.group(*component_managers, &block) ⇒ Nil
Selects every entity that has components of they type passed into this function and then executes the code block for those components and entities.
Instance Method Summary collapse
-
#add(*components_to_add) ⇒ Boolean
Add any number components to the Entity.
-
#component(manager = nil) ⇒ Component
A single component from a component manager.
-
#components ⇒ Hash<Component_Manager, Array<Integer>>
A hash that uses component manager constant names as keys, and where the values of those keys are arrays that contain the the components attached to this entity.
-
#delete ⇒ Boolean
Removes this Entity from the list and purges all references to this Entity from other Components, as well as its data.
-
#initialize(*components) ⇒ Entity
constructor
Creating a new Entity.
-
#remove(*components_to_remove) ⇒ Boolean
Remove a component from the Entity.
Constructor Details
#initialize(*components) ⇒ Entity
Creating a new Entity
8 9 10 11 12 |
# File 'lib/felecs/entity_manager.rb', line 8 def initialize(*components) # Add each component add(*components) self.class._data.push self end |
Class Method Details
.group(*component_managers, &block) ⇒ Nil
Selects every entity that has components of they type passed into this function and then executes the code block for those components and entities.
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/felecs/entity_manager.rb', line 107 def group(*component_managers, &block) return nil if component_managers.empty? if component_managers.length == 1 component_managers.first.each do |cmp| block.call(cmp, cmp.entity) end else arry = component_managers.first.select do |cmp| ent = cmp.entity keep = true component_managers.drop(1).each do |mgr| next unless ent.components[mgr].nil? keep = false break end keep end arry.each do |cmp| ent = cmp.entity cmp_arry = [cmp] component_managers.drop(1).each do |cmp_mgr| cmp_arry.push ent.component[cmp_mgr] end block.call(*cmp_arry, ent) end end nil end |
Instance Method Details
#add(*components_to_add) ⇒ Boolean
Add any number components to the Entity.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/felecs/entity_manager.rb', line 57 def add(*components_to_add) components_to_add.each do |component| if components[component.class].nil? components[component.class] = [component] component.entities.push self check_systems component, :addition_triggers elsif !components[component.class].include? component components[component.class].push component component.entities.push self check_systems component, :addition_triggers end end true end |
#component(manager = nil) ⇒ Component
A single component from a component manager. Use this if you expect the component to only belong to one entity and you want to access it. Access the component using either parameter notation or array notation. Array notation is conventional for better readablility.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/felecs/entity_manager.rb', line 26 def component(manager = nil) if manager.nil? FelECS::Entities.component_redirect.entity = self FelECS::Entities.component_redirect else if components[manager].nil? raise "This entity(#{self}) doesnt have any components of this type: #{manager}" elsif components[manager].length > 1 Warning.warn("This entity has MANY of this component but you called the method that is intended for having a single of this component type.\nYou may have a bug in your logic.") end components[manager].first end end |
#components ⇒ Hash<Component_Manager, Array<Integer>>
A hash that uses component manager constant names as keys, and where the values of those keys are arrays that contain the the components attached to this entity.
16 17 18 |
# File 'lib/felecs/entity_manager.rb', line 16 def components @components ||= {} end |
#delete ⇒ Boolean
Removes this Entity from the list and purges all references to this Entity from other Components, as well as its data.
43 44 45 46 47 48 49 50 51 52 |
# File 'lib/felecs/entity_manager.rb', line 43 def delete components.each do |_component_manager, component_array| component_array.reverse_each do |component| component.entities.delete(self) end end FelECS::Entities._data.delete self @components = {} true end |
#remove(*components_to_remove) ⇒ Boolean
Remove a component from the Entity
87 88 89 90 91 92 93 94 95 |
# File 'lib/felecs/entity_manager.rb', line 87 def remove(*components_to_remove) components_to_remove.each do |component| check_systems component, :removal_triggers if component.entities.include? self component.entities.delete self components[component.class].delete component components.delete component.class if components[component.class].empty? end true end |