Class: FelFlame::Entities
- Inherits:
-
Object
- Object
- FelFlame::Entities
- Defined in:
- lib/felflame.rb,
lib/felflame/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.
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/felflame/entity_manager.rb', line 8 def initialize(*components) # Add each component add(*components) self.class._data.push self 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/felflame/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/felflame/entity_manager.rb', line 26 def component(manager = nil) if manager.nil? FelFlame::Entities.component_redirect.entity = self FelFlame::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/felflame/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/felflame/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 FelFlame::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/felflame/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 |