Module: Chingu::Traits::CollisionDetection::ClassMethods
- Defined in:
- lib/chingu/traits/collision_detection.rb,
lib/chingu/traits/collision_detection.rb
Instance Method Summary collapse
-
#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_bounding_box_collision(*klasses) ⇒ Object
Works like each_collsion but with explicit bounding_box collisions (inline-code for speedups)
178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/chingu/traits/collision_detection.rb', line 178 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
160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/chingu/traits/collision_detection.rb', line 160 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
202 203 204 205 206 207 208 209 210 211 212 213 214 215 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 |
# File 'lib/chingu/traits/collision_detection.rb', line 202 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 |