Class: AdventureRL::SolidsManager
- Inherits:
-
Object
- Object
- AdventureRL::SolidsManager
- Defined in:
- lib/AdventureRL/SolidsManager.rb
Constant Summary collapse
Instance Method Summary collapse
-
#add_object(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object
(also: #add)
Add one (or multiple)
object(s) with one (or multiple)solid_tag(s). -
#collides?(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Boolean
Returns
trueif the givenobject(or multiple objects), collide with any other objects with a mutualsolid_tag. -
#get_colliding_objects(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object
Returns all objects colliding with
object(s). -
#initialize(settings = {}) ⇒ SolidsManager
constructor
A new instance of SolidsManager.
- #remove_object(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object (also: #remove)
- #remove_object_from_all_quadtrees(object) ⇒ Object (also: #remove_from_all_quadtrees)
-
#reset ⇒ Object
Resets for every object in
@reset_queue. - #reset_cache_for(object) ⇒ Object
-
#reset_object(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object
Pass an
object(or multiple), to queue it/them for resetting next update. -
#update ⇒ Object
Called once every frame by Window.
Constructor Details
#initialize(settings = {}) ⇒ SolidsManager
Returns a new instance of SolidsManager.
9 10 11 12 13 14 15 |
# File 'lib/AdventureRL/SolidsManager.rb', line 9 def initialize settings = {} @settings = DEFAULT_SETTINGS.merge settings @quadtrees = {} @reset_queue = {} @cache = {} @use_cache = @settings.get :use_cache end |
Instance Method Details
#add_object(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object Also known as: add
Add one (or multiple) object(s) with one (or multiple) solid_tag(s).
19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/AdventureRL/SolidsManager.rb', line 19 def add_object object, solid_tag = DEFAULT_SOLID_TAG objects = [object].flatten = [solid_tag].flatten .each do |tag| if (@quadtrees[tag]) @quadtrees[tag].add_object objects else @quadtrees[tag] = Quadtree.new objects: objects end end end |
#collides?(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Boolean
Returns true if the given object (or multiple objects), collide with any other objects with a mutual solid_tag.
57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/AdventureRL/SolidsManager.rb', line 57 def collides? object, solid_tag = DEFAULT_SOLID_TAG objects = [object].flatten = [solid_tag].flatten return objects.any? do |obj| handle_collides_cache_for obj, next @cache[obj][:collides?] end if (@use_cache) return objects.any? do |obj| next get_quadtrees_for().any? do |quadtree| next quadtree.collides?(obj) end end end |
#get_colliding_objects(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object
Returns all objects colliding with object(s).
72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/AdventureRL/SolidsManager.rb', line 72 def get_colliding_objects object, solid_tag = DEFAULT_SOLID_TAG objects = [object].flatten = [solid_tag].flatten return objects.map do |obj| handle_colliding_objects_cache_for obj, next @cache[obj][:colliding_objects] end .flatten if (@use_cache) return objects.map do |obj| next get_quadtrees_for().map do |quadtree| next quadtree.get_colliding_objects(obj) end end .flatten end |
#remove_object(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object Also known as: remove
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/AdventureRL/SolidsManager.rb', line 32 def remove_object object, solid_tag = DEFAULT_SOLID_TAG objects = [object].flatten = [solid_tag].flatten objects.each do |obj| @cache.delete obj end get_quadtrees_for().each do |quadtree| quadtree.remove_object objects end end |
#remove_object_from_all_quadtrees(object) ⇒ Object Also known as: remove_from_all_quadtrees
44 45 46 47 48 49 50 51 52 |
# File 'lib/AdventureRL/SolidsManager.rb', line 44 def remove_object_from_all_quadtrees object objects = [object].flatten objects.each do |obj| @cache.delete obj end @quadtrees.values.flatten.each do |quadtree| quadtree.remove_object objects end end |
#reset ⇒ Object
Resets for every object in @reset_queue.
98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/AdventureRL/SolidsManager.rb', line 98 def reset @reset_queue.each do |solid_tag, objects| @quadtrees.map do |quadtree_tag, quadtree| next quadtree if (solid_tag == quadtree_tag) next nil end .compact.each do |quadtree| quadtree.reset_object objects end @reset_queue[solid_tag] = [] end end |
#reset_cache_for(object) ⇒ Object
110 111 112 113 |
# File 'lib/AdventureRL/SolidsManager.rb', line 110 def reset_cache_for object @collides_cache.delete object @colliding_objects_cache.delete object end |
#reset_object(object, solid_tag = DEFAULT_SOLID_TAG) ⇒ Object
Pass an object (or multiple), to queue it/them for resetting next update.
88 89 90 91 92 93 94 95 |
# File 'lib/AdventureRL/SolidsManager.rb', line 88 def reset_object object, solid_tag = DEFAULT_SOLID_TAG objects = [object].flatten = [solid_tag].flatten .each do |tag| @reset_queue[tag] ||= [] @reset_queue[tag].concat objects end end |
#update ⇒ Object
Called once every frame by Window.
116 117 118 |
# File 'lib/AdventureRL/SolidsManager.rb', line 116 def update reset end |