Module: Chingu::Traits::CollisionDetection::ClassMethods

Defined in:
lib/chingu/traits/collision_detection.rb

Instance Method Summary collapse

Instance Method Details

#each_bounding_box_collision(klasses = []) ⇒ Object

Works like each_collsion but with explicit bounding_box collisions (inline-code for speedups)



159
160
161
162
163
164
165
166
167
168
169
# File 'lib/chingu/traits/collision_detection.rb', line 159

def each_bounding_box_collision(klasses = [])
  Array(klasses).each do |klass|
    object2_list = klass.all
    self.all.each do |object1|
      object2_list.each do |object2|
        next  if object1 == object2  # Don't collide objects with themselves
        yield object1, object2  if object1.bounding_box.collide_rect?(object2.bounding_box)
      end
    end
  end
end

#each_collision(klasses = []) ⇒ Object

Class method that will check for collisions between all instances of two classes and yield the 2 colliding game object instances.

It will not collide objects with themselves.

example:

Enemy.each_collision(Bullet).each do |enemy, bullet| enemy.die!; end


182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/chingu/traits/collision_detection.rb', line 182

def each_collision(klasses = [])
  # Make sure klasses is always an array.
  Array(klasses).each do |klass|
    object2_list = klass.all
    
    self.all.each do |object1|
      object2_list.each do |object2|
        next  if object1 == object2  # Don't collide objects with themselves
        yield object1, object2  if object1.collides?(object2)
      end
    end
  end
end

#each_radius_collision(klasses = []) ⇒ Object

Works like each_collision but with inline-code for speedups



142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/chingu/traits/collision_detection.rb', line 142

def each_radius_collision(klasses = [])
  Array(klasses).each do |klass|
    object2_list = klass.all
    #total_radius = object1.radius + object2.radius  # possible optimization?
    
    self.all.each do |object1|
      object2_list.each do |object2|
        next  if object1 == object2  # Don't collide objects with themselves
        yield object1, object2  if distance(object1.x, object1.y, object2.x, object2.y) < object1.radius + object2.radius
      end
    end
  end
end