Class: FelFlame::Entities
- Inherits:
-
Object
- Object
- FelFlame::Entities
- Defined in:
- lib/felflame.rb,
lib/felflame/entity_manager.rb
Overview
Creates and manages Entities. Allows iterating or accessing Entities using array methods directly on the class. Entities are just collections of Components.
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
7 8 9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/felflame/entity_manager.rb', line 7 def initialize(*components) # Add each component add(*components) # Fancy method redirection for when the `component` method is called @component_redirect = Object.new @component_redirect.instance_variable_set(:@entity, self) @component_redirect.define_singleton_method(:[]) do |component_manager| instance_variable_get(:@entity).component(component_manager) end self.class._data.push self end |
Instance Method Details
#add(*components_to_add) ⇒ Boolean
Add any number components to the Entity.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/felflame/entity_manager.rb', line 63 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.
33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/felflame/entity_manager.rb', line 33 def component(manager = nil) if manager.nil? @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.
23 24 25 |
# File 'lib/felflame/entity_manager.rb', line 23 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.
49 50 51 52 53 54 55 56 57 58 |
# File 'lib/felflame/entity_manager.rb', line 49 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
93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/felflame/entity_manager.rb', line 93 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 if components[component.class].empty? components.delete component.class end end true end |