class AdventureRL::SolidsManager

Constants

DEFAULT_SETTINGS
DEFAULT_SOLID_TAG

Public Class Methods

new(settings = {}) click to toggle source
# 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

Public Instance Methods

add(object, solid_tag = DEFAULT_SOLID_TAG)
Alias for: add_object
add_object(object, solid_tag = DEFAULT_SOLID_TAG) click to toggle source

Add one (or multiple) object(s) with one (or multiple) solid_tag(s).

# 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
Also aliased as: add
collides?(object, solid_tag = DEFAULT_SOLID_TAG) click to toggle source

Returns true if the given object (or multiple objects), collide with any other objects with a mutual solid_tag.

# 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) click to toggle source

Returns all objects colliding with object(s).

# 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, solid_tag = DEFAULT_SOLID_TAG)
Alias for: remove_object
remove_from_all_quadtrees(object)
remove_object(object, solid_tag = DEFAULT_SOLID_TAG) click to toggle source
# 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
Also aliased as: remove
remove_object_from_all_quadtrees(object) click to toggle source
# 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
Also aliased as: remove_from_all_quadtrees
reset() click to toggle source

Resets for every object in @reset_queue.

# 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) click to toggle source
# 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) click to toggle source

Pass an object (or multiple), to queue it/them for resetting next update.

# 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
update() click to toggle source

Called once every frame by Window.

# File lib/AdventureRL/SolidsManager.rb, line 116
def update
  reset
end

Private Instance Methods

get_quadtrees_for(solid_tag = DEFAULT_SOLID_TAG) click to toggle source
# File lib/AdventureRL/SolidsManager.rb, line 122
def get_quadtrees_for solid_tag = DEFAULT_SOLID_TAG
  solid_tags = [solid_tag].flatten
  return @quadtrees.map do |quadtree_tag, quadtree|
    next quadtree  if (solid_tags.include?(quadtree_tag))
    next nil
  end .compact
end
handle_collides_cache_for(object, solid_tags) click to toggle source
# File lib/AdventureRL/SolidsManager.rb, line 130
def handle_collides_cache_for object, solid_tags
  cached = @cache[object]
  update_collides_cache_for object, solid_tags  unless (
    # TODO: Remove cache or improve, it can break stuff
    @use_cache &&
    cached                                     &&
    (cached[:position] == object.get_position) &&
    (cached[:size]     == object.get_size)
  )
end
handle_colliding_objects_cache_for(object, solid_tags) click to toggle source
# File lib/AdventureRL/SolidsManager.rb, line 150
def handle_colliding_objects_cache_for object, solid_tags
  cached = @cache[object]
  update_colliding_objects_cache_for object, solid_tags  unless (
    # TODO: Remove cache or improve, it can break stuff
    @use_cache &&
    cached                                     &&
    (cached[:position] == object.get_position) &&
    (cached[:size]     == object.get_size)
  )
end
update_collides_cache_for(object, solid_tags) click to toggle source
# File lib/AdventureRL/SolidsManager.rb, line 141
def update_collides_cache_for object, solid_tags
  @cache[object] ||= {}
  @cache[object][:position]  = object.get_position.dup
  @cache[object][:size]      = object.get_size.dup
  @cache[object][:collides?] = get_quadtrees_for(solid_tags).any? do |quadtree|
    next quadtree.collides?(object)
  end
end
update_colliding_objects_cache_for(object, solid_tags) click to toggle source
# File lib/AdventureRL/SolidsManager.rb, line 161
def update_colliding_objects_cache_for object, solid_tags
  @cache[object] ||= {}
  @cache[object][:position]          = object.get_position.dup
  @cache[object][:size]              = object.get_size.dup
  @cache[object][:colliding_objects] = get_quadtrees_for(solid_tags).map do |quadtree|
    next quadtree.get_colliding_objects(object)
  end .flatten
end