root/lang/ruby/starframe/lib/starframe/sprite/collision/rect.rb @ 27465

Revision 27465, 2.0 kB (checked in by isaisstillalive, 6 years ago)
  • 当たり判定の名称を省略して使用できるように、Collisionをモジュールに変更しCollidableモジュールでインクルード
  • それに伴いCollisionの抽象クラスとしての部分をCollision::Baseに抽出
Line 
1require "starframe/sprite/collision/base"
2
3module StarFrame
4  class Sprite
5    module Collision
6      class Rect < Base
7        attr_reader :x, :y, :width, :height
8       
9        def initialize target, method_name, x, y, width, height
10          super
11          @x, @y, @width, @height = x, y, width, height
12        end
13       
14        def collide? other
15          case other
16          when Circle
17            return collide_circle?(other)
18          when Rect
19            left, top, right, bottom = rect
20           
21            width, height = @width+other.width, @height+other.height
22            left, top     = left-other.width, top-other.height
23          when Dot
24            left, top, right, bottom = rect
25          else
26            return super
27          end
28          dot_in_rect?(other.global_position, [[left, top], [right, bottom]])
29        end
30       
31        private
32        def rect
33          left, top = global_position
34          right, bottom = left+@width, top+@height
35          [left, top, right, bottom]
36        end
37       
38        def collide_circle? other
39          left, top, right, bottom = rect
40         
41          vleft,  vtop    = left-other.radius,  top-other.radius
42          vright, vbottom = right+other.radius, bottom+other.radius
43         
44          other_position = other.global_position
45          return false unless dot_in_rect?(other_position, [[vleft, vtop], [vright, vbottom]])
46         
47          case
48          when other_position[0] < left
49            x = left
50          when other_position[0] > right
51            x = right
52          else
53            return true
54          end
55         
56          case
57          when other_position[1] < top
58            y = top
59          when other_position[1] > bottom
60            y = bottom
61          else
62            return true
63          end
64         
65          return dot_in_circle?([x, y], [other_position, other.radius])
66        end
67      end
68    end
69  end
70end
Note: See TracBrowser for help on using the browser.