Module: Chingu::Traits::CollisionDetection::ClassMethods
- Defined in:
- lib/chingu/traits/collision_detection.rb,
lib/chingu/traits/collision_detection.rb
Instance Method Summary collapse
-
#each_at(x, y) ⇒ Object
Yield all objects of this class that is colliding with point x,y.
-
#each_bounding_box_collision(*klasses) ⇒ Object
Works like each_collsion but with explicit bounding_box collisions (inline-code for speedups).
-
#each_bounding_circle_collision(*klasses) ⇒ Object
Works like each_collision but with inline-code for speedups.
-
#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.
- #initialize_trait(options = {}) ⇒ Object
Instance Method Details
#each_at(x, y) ⇒ Object
Yield all objects of this class that is colliding with point x,y
Example:
Enemy.each_at(sword.x, sword.y) { |enemy| enemy.die }
163 164 165 166 167 168 169 |
# File 'lib/chingu/traits/collision_detection.rb', line 163 def each_at(x,y) self.all.each do |object| next unless object.collidable yield object if object.respond_to?(:bb) && object.bb.collide_point?(x,y) yield object if object.respond_to?(:radius) && Gosu.distance(object.x, object.y, x, y) < object.radius end end |
#each_bounding_box_collision(*klasses) ⇒ Object
Works like each_collsion but with explicit bounding_box collisions (inline-code for speedups)
192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/chingu/traits/collision_detection.rb', line 192 def each_bounding_box_collision(*klasses) Array(klasses).each do |klass| object2_list = (klass.respond_to?(:all) ? klass.all : Array(klass)) self.all.each do |object1| object2_list.each do |object2| next if object1 == object2 # Don't collide objects with themselves next unless object1.collidable && object2.collidable yield object1, object2 if object1.bounding_box.collide_rect?(object2.bounding_box) end end end end |
#each_bounding_circle_collision(*klasses) ⇒ Object
Works like each_collision but with inline-code for speedups
174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/chingu/traits/collision_detection.rb', line 174 def each_bounding_circle_collision(*klasses) Array(klasses).each do |klass| object2_list = (klass.respond_to?(:all) ? klass.all : Array(klass)) #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 next unless object1.collidable && object2.collidable yield object1, object2 if Gosu.distance(object1.x, object1.y, object2.x, object2.y) < object1.radius + object2.radius 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
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
# File 'lib/chingu/traits/collision_detection.rb', line 216 def each_collision(*klasses) # Make sure klasses is always an array. Array(klasses).each do |klass| if self.respond_to?(:instance_methods) && klass.respond_to?(:instance_methods) if self.instance_methods.include?(:radius) && klass.instance_methods.include?(:radius) self.each_bounding_circle_collision(klass) do |o1, o2| yield o1, o2 end next end if self.instance_methods.include?(:bounding_box) && klass.instance_methods.include?(:bounding_box) self.each_bounding_box_collision(klass) do |o1, o2| yield o1, o2 end next end end # # Possible optimization, look into later. # # type1 = self.instance_methods.include?(:bounding_box) ? :bb : :bc # type2 = klass.instance_methods.include?(:bounding_box) ? :bb : :bc # Pointless optmization-attempts? #if type1 != type2 # 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_bounding_circle_collision?(object2) # end # end #end object2_list = (klass.respond_to?(:all) ? klass.all : Array(klass)) 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 |
#initialize_trait(options = {}) ⇒ Object
39 40 41 |
# File 'lib/chingu/traits/collision_detection.rb', line 39 def initialize_trait( = {}) [:collision_detection] = end |