Class: AdventureRL::SolidsManager

Inherits:
Object
  • Object
show all
Defined in:
lib/AdventureRL/SolidsManager.rb

Constant Summary collapse

DEFAULT_SOLID_TAG =
:default
DEFAULT_SETTINGS =
Settings.new(
  use_cache: false
)

Instance Method Summary collapse

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_tags = [solid_tag].flatten
  solid_tags.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.

Returns:

  • (Boolean)


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_tags = [solid_tag].flatten
  return objects.any? do |obj|
    handle_collides_cache_for obj, solid_tags
    next @cache[obj][:collides?]
  end  if (@use_cache)
  return objects.any? do |obj|
    next get_quadtrees_for(solid_tags).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_tags = [solid_tag].flatten
  return objects.map do |obj|
    handle_colliding_objects_cache_for obj, solid_tags
    next @cache[obj][:colliding_objects]
  end .flatten  if (@use_cache)
  return objects.map do |obj|
    next get_quadtrees_for(solid_tags).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_tags = [solid_tag].flatten
  objects.each do |obj|
    @cache.delete obj
  end
  get_quadtrees_for(solid_tags).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

#resetObject

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_tags = [solid_tag].flatten
  solid_tags.each do |tag|
    @reset_queue[tag] ||= []
    @reset_queue[tag].concat objects
  end
end

#updateObject

Called once every frame by Window.



116
117
118
# File 'lib/AdventureRL/SolidsManager.rb', line 116

def update
  reset
end