1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
require 'sdl'
SDL.init( SDL::INIT_VIDEO )
screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
SDL::WM::setCaption('collision.rb','collision.rb icon')
$image = SDL::Surface.loadBMP("icon.bmp")
$image.setColorKey( SDL::SRCCOLORKEY ,0)
$image = $image.displayFormat
$cMap = $image.makeCollisionMap
class Sprite
attr_reader :x, :y
def initialize(screen)
@screen = screen
@x=rand(screen.w)
@y=rand(screen.h)
@dx=rand(11)-5
@dy=rand(11)-5
end
def move
@x, @dx = moveCoord(@x, @dx, xMax)
@y, @dy = moveCoord(@y, @dy, yMax)
end
def bounce
@dx *= -1
@dy *= -1
move
end
def draw
SDL.blitSurface($image,0,0,$image.w,$image.h,@screen,@x,@y)
end
def collidingWith(sprite)
$cMap.collisionCheck(@x, @y, $cMap, sprite.x, sprite.y) != nil
end
private
def moveCoord(coord, delta, max)
coord += delta
if coord >= max then
delta *= -1
coord = max - 1
end
if coord < 0 then
delta *= -1
coord = 0
end
[coord, delta]
end
def xMax
@screen.w - $image.w
end
def yMax
@screen.h - $image.h
end
end
def detectCollisions(sprites)
collisions = []
for i in (0 ... sprites.size - 1) do
for j in (i + 1 ... sprites.size) do
if sprites[i].collidingWith(sprites[j])
collisions << sprites[i]
collisions << sprites[j]
end
end
end
collisions.uniq
end
sprites = (1..8).collect {Sprite.new(screen)}
while true
while event = SDL::Event2.poll
case event
when SDL::Event2::KeyDown, SDL::Event2::Quit
exit
end
end
screen.fillRect(0,0,640,480,screen.mapRGB(64, 64, 64))
sprites.each {|i| i.move}
detectCollisions(sprites).each {|i| i.bounce}
sprites.each {|i| i.draw}
screen.updateRect(0,0,0,0)
end
|