Changeset 27465 for lang/ruby/starframe

Show
Ignore:
Timestamp:
12/27/08 10:00:10 (6 years ago)
Author:
isaisstillalive
Message:
  • 当たり判定の名称を省略して使用できるように、Collisionをモジュールに変更しCollidableモジュールでインクルード
  • それに伴いCollisionの抽象クラスとしての部分をCollision::Baseに抽出
Location:
lang/ruby/starframe
Files:
2 added
1 removed
8 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/starframe/lib/starframe/sprite/collision.rb

    r27463 r27465  
    1 # = StarFrame::Sprite::Collision -- スプライト当たり判定定義 
     1require "starframe/sprite/collision/base" 
    22 
    33module StarFrame 
    44  class Sprite 
    5     # = Sprite::Collisionクラス 
    6     # スプライト当たり判定クラス。 
    7     #  
    8     # 衝突判定を行い、適切な衝突処理を実行するクラス。 
    9     class Collision 
     5    module Collision #:nodoc: 
    106      autoload :Dot,    "starframe/sprite/collision/dot" 
    117      autoload :Circle, "starframe/sprite/collision/circle" 
    128      autoload :Rect,   "starframe/sprite/collision/rect" 
    13        
    14       # 基準座標 - 当たり判定の基準座標のX座標。 
    15       attr_accessor :x 
    16       # 基準位置 - 当たり判定の基準座標のY座標。 
    17       attr_accessor :y 
    18       # 当たり判定の基準座標を[x, y]の配列で取得。 
    19       def position 
    20         [@x, @y] 
    21       end 
    22       # 当たり判定の基準座標を[x, y]の配列で設定。 
    23       def position= position 
    24         @x, @y = position 
    25       end 
    26        
    27       class << self #:nodoc: 
    28         # 指定された点が矩形の中に入っているかどうか判定する 
    29         def dot_in_rect? dot, rect 
    30           rect[0][0] <= dot[0] && dot[0] <= rect[1][0] && 
    31           rect[0][1] <= dot[1] && dot[1] <= rect[1][1] 
    32         end 
    33          
    34         # 指定された点が円の中に入っているかどうか判定する 
    35         def dot_in_circle? dot, circle 
    36           (circle[0][0]-dot[0])**2 + (circle[0][1]-dot[1])**2 <= circle[1]**2 
    37         end 
    38       end 
    39        
    40       def initialize sprite, method_name, *options #:nodoc: 
    41         @sprite, @method_name = sprite, method_name 
    42         @x = @y = 0 
    43       end 
    44        
    45       # 衝突しているかどうかを判定する 
    46       def collide? other 
    47         other.collide_dispatch? self unless @dispatched 
    48       end 
    49        
    50       # 衝突しているかどうかを判定し、衝突していれば衝突処理を実行する 
    51       def collide other 
    52         return false unless collide? other 
    53         call       other.sprite 
    54         other.call @sprite 
    55         return true 
    56       end 
    57        
    58       protected 
    59       attr_reader :sprite #:nodoc: 
    60        
    61       def call other #:nodoc: 
    62         @sprite.__send__ @method_name, other if @method_name 
    63       end 
    64        
    65       def global_position #:nodoc: 
    66         [@sprite.x+@x, @sprite.y+@y] 
    67       end 
    68        
    69       def collide_dispatch? other #:nodoc: 
    70         @dispatched = true 
    71         self.collide? other 
    72       ensure 
    73         @dispatched = nil 
    74       end 
    759    end 
    7610  end 
  • lang/ruby/starframe/lib/starframe/sprite/collision/circle.rb

    r27463 r27465  
     1require "starframe/sprite/collision/base" 
     2 
    13module StarFrame 
    24  class Sprite 
    3     class Collision 
    4       class Circle < Collision 
     5    module Collision 
     6      class Circle < Base 
    57        attr_reader :x, :y, :radius 
    68         
     
    1921            return super 
    2022          end 
    21           Collision.dot_in_circle?(other.global_position, [global_position, radius]) 
     23          dot_in_circle?(other.global_position, [global_position, radius]) 
    2224        end 
    2325      end 
  • lang/ruby/starframe/lib/starframe/sprite/collision/dot.rb

    r27463 r27465  
     1require "starframe/sprite/collision/base" 
     2 
    13module StarFrame 
    24  class Sprite 
    3     class Collision 
    4       class Dot < Collision 
     5    module Collision 
     6      class Dot < Base 
    57        attr_reader :x, :y 
    68         
  • lang/ruby/starframe/lib/starframe/sprite/collision/rect.rb

    r27463 r27465  
     1require "starframe/sprite/collision/base" 
     2 
    13module StarFrame 
    24  class Sprite 
    3     class Collision 
    4       class Rect < Collision 
     5    module Collision 
     6      class Rect < Base 
    57        attr_reader :x, :y, :width, :height 
    68         
     
    2426            return super 
    2527          end 
    26           Collision.dot_in_rect?(other.global_position, [[left, top], [right, bottom]]) 
     28          dot_in_rect?(other.global_position, [[left, top], [right, bottom]]) 
    2729        end 
    2830         
     
    4143           
    4244          other_position = other.global_position 
    43           return false unless Collision.dot_in_rect?(other_position, [[vleft, vtop], [vright, vbottom]]) 
     45          return false unless dot_in_rect?(other_position, [[vleft, vtop], [vright, vbottom]]) 
    4446           
    4547          case 
     
    6163          end 
    6264           
    63           return Collision.dot_in_circle?([x, y], [other_position, other.radius]) 
     65          return dot_in_circle?([x, y], [other_position, other.radius]) 
    6466        end 
    6567      end 
  • lang/ruby/starframe/test/starframe/sprite/collision/test_circle.rb

    r27463 r27465  
    11require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "helper")) 
    22require "starframe/sprite" 
    3 require "starframe/sprite/collision" 
    43require "starframe/sprite/collision/dot" 
    54require "starframe/sprite/collision/circle" 
     
    98    @texture = StarRuby::Texture.load "test" 
    109  end 
    11   class NoneCollision < StarFrame::Sprite::Collision 
     10  class NoneCollision < StarFrame::Sprite::Collision::Base 
    1211  end 
    1312   
  • lang/ruby/starframe/test/starframe/sprite/collision/test_dot.rb

    r27463 r27465  
    11require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "helper")) 
    22require "starframe/sprite" 
    3 require "starframe/sprite/collision" 
    43require "starframe/sprite/collision/dot" 
    54 
     
    87    @texture = StarRuby::Texture.load "test" 
    98  end 
    10   class NoneCollision < StarFrame::Sprite::Collision 
     9  class NoneCollision < StarFrame::Sprite::Collision::Base 
    1110  end 
    1211   
  • lang/ruby/starframe/test/starframe/sprite/collision/test_rect.rb

    r27463 r27465  
    11require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "helper")) 
    22require "starframe/sprite" 
    3 require "starframe/sprite/collision" 
    43require "starframe/sprite/collision/dot" 
    54require "starframe/sprite/collision/circle" 
     
    109    @texture = StarRuby::Texture.load "test" 
    1110  end 
    12   class NoneCollision < StarFrame::Sprite::Collision 
     11  class NoneCollision < StarFrame::Sprite::Collision::Base 
    1312  end 
    1413   
  • lang/ruby/starframe/test/starframe/sprite/test_collidable.rb

    r27463 r27465  
    11require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "helper")) 
    22require "starframe/sprite" 
    3 require "starframe/sprite/collision" 
     3require "starframe/sprite/collidable" 
    44 
    5 class StarFrame::Sprite::Collision 
     5class StarFrame::Sprite::Collision::Base 
    66  attr_accessor :target, :method_name, :options 
    77end 
    88 
    99class TestStarFrameSpriteCollidable < Test::Unit::TestCase 
    10   class TestCollision < StarFrame::Sprite::Collision 
     10  class TestCollision < StarFrame::Sprite::Collision::Base 
    1111    attr_accessor :options 
    1212