Spriteの判定が一通りできた

時間かかったけどなんとか全部できた。
細かいところでは点の判定がちょっと微妙な感じになっていて、幾何学的に点として扱うのか、画面上は1ピクセルの矩形なので矩形として扱うのかといったあたりを整理しておく必要がある。適当に作ったので多分いまは混在してる。
それはさておき、とりあえずこんな感じのものが動くようになった。

DXRubyExのときよりも判定範囲が回転できるぶん計算量は増えているが、境界ボリュームを使って枝狩りするようにしたので比較するとかなり高速になっている。高速化という意味ではいろいろと後回しにしてしまった部分があるから、いずれ地道に改良していこうと思う。必要であれば。

#!ruby -Ks
require "dxruby"

class CollisionObject < Sprite
  def initialize
    self.x = rand(Window.width-self.image.width)
    self.y = rand(Window.height-self.image.height)
    @hit = false
    @dx = (rand(4)*2-3)/4.0
    @dy = (rand(4)*2-3)/4.0
    self.angle = 0.0
    super(x, y, self.image)
  end

  def update
    self.x += @dx
    self.y += @dy
    @dx = -@dx if self.x <= 0 or self.x >= Window.width-self.image.width
    @dy = -@dy if self.y <= 0 or self.y >= Window.height-self.image.height
  end
end

# しかく
class Box < CollisionObject
  @@image1 = Image.new(30, 30, [255, 200, 0, 0])
  @@image2 = Image.new(30, 30, [255, 255, 255])
  def initialize
    self.collision = [0, 0, 29, 29]
    self.image = @@image1
    self.scale_x = rand(2.0)+1
    self.scale_y = rand(2.0)+1
    self.center_x = rand(self.image.width)
    self.center_y = rand(self.image.height)
    super
  end

  def update
    super
    self.angle += 1
    self.image = @@image1
  end

  def hit(d)
    self.image = @@image2
  end
end

# しかく2
class Box2 < CollisionObject
  @@image1 = Image.new(30, 30, [255, 200, 0, 0])
  @@image2 = Image.new(30, 30, [255, 255, 255])
  def initialize
    self.collision = [0, 0, 29, 29]
    self.image = @@image1
    super
  end
  def update
    super
    self.image = @@image1
  end

  def hit(d)
    self.image = @@image2
  end
end

# まる
class Circle < CollisionObject
  @@image1 = Image.new(30, 30).circle_fill(15, 15, 15, [255, 200, 0])
  @@image2 = Image.new(30, 30).circle_fill(15, 15, 15, [255, 255, 255])
  def initialize
    self.collision = [15, 15, 15]
    self.image = @@image1
    self.scale_x = rand(2.0)+1
    self.scale_y = rand(2.0)+1
    self.center_x = 0
    self.center_y = 0
    super
  end
  def update
    super
    self.angle += 1
    self.image = @@image1
  end
  def hit(d)
    self.image = @@image2
  end
end

# まる2
class Circle2 < CollisionObject
  @@image1 = Image.new(30, 30).circle_fill(15, 15, 15, [255, 200, 0])
  @@image2 = Image.new(30, 30).circle_fill(15, 15, 15, [255, 255, 255])
  def initialize
    self.collision = [15, 15, 15]
    self.image = @@image1
    super
  end
  def update
    super
    self.image = @@image1
  end
  def hit(d)
    self.image = @@image2
  end
end

# さんかく
class Triangle < CollisionObject
  @@image1 = Image.new(30, 30).triangle_fill(15,0,29,29,0,29,C_GREEN)
  @@image2 = Image.new(30, 30).triangle_fill(15,0,29,29,0,29,C_WHITE)
  def initialize
    self.collision = [15,0,29,29,0,29]
    self.image = @@image1
    self.scale_x = rand(2.0)+1
    self.scale_y = rand(2.0)+1
    self.center_x = rand(self.image.width)
    self.center_y = rand(self.image.height)
    super
  end

  def update
    super
    self.angle += 1
    self.image = @@image1
  end
  def hit(d)
    self.image = @@image2
  end
end

# さんかく2
class Triangle2 < CollisionObject
  @@image1 = Image.new(30, 30).triangle_fill(15,0,29,29,0,29,C_GREEN)
  @@image2 = Image.new(30, 30).triangle_fill(15,0,29,29,0,29,C_WHITE)
  def initialize
    self.collision = [15,0,29,29,0,29]
    self.image = @@image1
    super
  end
  def update
    super
    self.image = @@image1
  end
  def hit(d)
    self.image = @@image2
  end
end

Window.width, Window.height = 800, 600

font = Font.new(24)

object = Array.new(20) {Box.new} + Array.new(20) {Box2.new} + 
         Array.new(20) {Triangle.new} + Array.new(20) {Triangle2.new} + 
         Array.new(20) {Circle.new} + Array.new(20) {Circle2.new}

Window.loop do
  object.each do |o|
    o.update
  end

  Sprite.check(object)

  object.each do |o|
    o.draw
  end

  break if Input.keyPush?(K_ESCAPE)

  Window.drawFont(0, 0, Window.fps.to_s + " fps", font)
  Window.drawFont(0, 24, Window.getLoad.to_i.to_s + " %", font)
end