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