Class: FelECS::Entities

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initialize(*components) ⇒ Entity

Creating a new Entity

Parameters:

  • components (Components)

    Can be any number of components, identical duplicates will be automatically purged however different components from the same component manager are allowed.



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.

Returns:

  • (Nil)


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.

Parameters:

  • components_to_add (Component)

    Any number of components created from any component manager

Returns:

  • (Boolean)

    true



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.

Examples:

@entity.component[@component_manager] # array notation(the standard)
@entity.component(@component_manager) # method notation

Parameters:

  • manager (ComponentManager) (defaults to: nil)

    If you pass nil you can then use array notation to access the same value.

Returns:

  • (Component)


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

#componentsHash<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.

Returns:

  • (Hash<Component_Manager, Array<Integer>>)


16
17
18
# File 'lib/felecs/entity_manager.rb', line 16

def components
  @components ||= {}
end

#deleteBoolean

Removes this Entity from the list and purges all references to this Entity from other Components, as well as its data.

Returns:

  • (Boolean)

    true



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

Parameters:

  • components_to_remove (Component)

    A component created from any component manager

Returns:

  • (Boolean)

    true



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