root/lang/ruby/starframe/test/starframe/sprite/test_collidable.rb @ 28001

Revision 28001, 6.3 kB (checked in by isaisstillalive, 4 years ago)
  • AnimatableとCollidableをinitイベント方式からinitializeメソッド方式に変更。
Line 
1require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "helper"))
2require "starframe/sprite"
3require "starframe/sprite/collidable"
4
5class TestStarFrameSpriteCollidable < Test::Unit::TestCase
6  class TestCollision < StarFrame::Sprite::Collision::Base
7    attr_accessor :options
8   
9    def initialize target, method_name, options1, options2
10      super
11    end
12   
13    def collide? other
14      (global_position == other.global_position)
15    end
16  end
17 
18  class CollisionSprite < StarFrame::Sprite
19    include StarFrame::Sprite::Collidable
20    attr_reader :collisions
21   
22    @texture = StarRuby::Texture.load "texture"
23   
24    attr_reader :others
25    init do |*args|
26      @others = []
27    end
28    collision :test, TestCollision, :options1, :options2 do |other|
29      @others << other
30    end
31  end
32  class CollisionSpriteSub < CollisionSprite
33    collision :test2, TestCollision, :options_sub do |other|
34    end
35  end
36  class EmptyCollisionSpriteSub < CollisionSprite
37    collision :test3, TestCollision, :options
38  end
39 
40  def test_class_variables
41    assert_equal 1, CollisionSprite.collisions.size
42    assert_equal TestCollision,          CollisionSprite.collisions[:test][0]
43    assert_equal true,                   CollisionSprite.method_defined?(CollisionSprite.collisions[:test][1])
44    assert_equal [:options1, :options2], CollisionSprite.collisions[:test][2]
45  end
46 
47  def test_class_variables_subclass
48    assert_not_equal   CollisionSprite.collisions.__id__, CollisionSpriteSub.collisions.__id__
49    assert_equal CollisionSprite.collisions, CollisionSpriteSub.collisions.reject{|k,v| k == :test2 }
50   
51    assert_equal 2, CollisionSpriteSub.collisions.size
52    assert_equal [:options_sub], CollisionSpriteSub.collisions[:test2][2]
53  end
54 
55  def test_class_variables_empty_collision
56    assert_equal true,  EmptyCollisionSpriteSub.collisions.key?(:test3)
57    assert_equal false, EmptyCollisionSpriteSub.method_defined?(:_starframe_sprite_collidable__collision_test3)
58    assert_nil          EmptyCollisionSpriteSub.collisions[:test3][1]
59  end
60 
61  def test_initialize
62    sprite = CollisionSprite.new(10, 10)
63    assert_equal       1,             sprite.collisions.size
64    assert_equal       true,          sprite.collisions.key?(:test)
65    assert_instance_of TestCollision, sprite.collisions[:test]
66    assert_equal       sprite,        sprite.collisions[:test].instance_variable_get(:@sprite)
67  end
68 
69  def test_collision_reader
70    sprite = CollisionSprite.new(10, 10)
71    assert_not_nil                           sprite.collision(:test)
72    assert_equal   sprite.collisions[:test], sprite.collision(:test)
73  end
74 
75 
76  def assert_collide sprite1, sprite2, expected, &block
77    assert_equal expected, block.call(sprite1, sprite2)
78  end
79  def assert_collide_sprite_and_sprite expected, collide = false, &block
80    sprite1 = CollisionSprite.new(10, 10)
81    sprite2 = CollisionSprite.new((expected ? 10 : 11), 10)
82   
83    assert_collide sprite1, sprite2, expected, &block
84   
85    if collide
86      assert_equal [sprite2], sprite1.others
87      assert_equal [sprite1], sprite2.others
88    else
89      assert_equal [], sprite1.others
90      assert_equal [], sprite2.others
91    end
92  end
93 
94  def test_collide_true
95    assert_collide_sprite_and_sprite expected = true, collide = true do |sprite1, sprite2|
96      sprite1.collide(:test, sprite2, :test)
97    end
98  end
99  def test_collide_false
100    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
101      sprite1.collide(:test, sprite2, :test)
102    end
103  end
104  def test_collide_q_true
105    assert_collide_sprite_and_sprite expected = true, collide = false do |sprite1, sprite2|
106      sprite1.collide?(:test, sprite2, :test)
107    end
108  end
109  def test_collide_q_false
110    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
111      sprite1.collide?(:test, sprite2, :test)
112    end
113  end
114 
115  def test_collide_with_collision_true
116    assert_collide_sprite_and_sprite expected = true, collide = true do |sprite1, sprite2|
117      sprite1.collide(:test, sprite2.collision(:test))
118    end
119  end
120  def test_collide_with_collision_false
121    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
122      sprite1.collide(:test, sprite2.collision(:test))
123    end
124  end
125  def test_collide_q_with_collision_true
126    assert_collide_sprite_and_sprite expected = true, collide = false do |sprite1, sprite2|
127      sprite1.collide?(:test, sprite2.collision(:test))
128    end
129  end
130  def test_collide_q_with_collision_false
131    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
132      sprite1.collide?(:test, sprite2.collision(:test))
133    end
134  end
135 
136  def assert_collide_collection_and_sprite collide = false, &block
137    collection = StarFrame::Sprite::Collection.new
138    collection << csprite1 = CollisionSprite.new(10, 10)
139    collection << csprite2 = CollisionSprite.new(10, 10)
140    collection << csprite3 = CollisionSprite.new(11, 10)
141    sprite                 = CollisionSprite.new(10, 10)
142   
143    assert_collide collection, sprite, 2, &block
144   
145    if collide
146      assert_equal [sprite],             csprite1.others
147      assert_equal [sprite],             csprite2.others
148      assert_equal [],                   csprite3.others
149      assert_equal [csprite1, csprite2], sprite.others
150    else
151      assert_equal [], csprite1.others
152      assert_equal [], csprite2.others
153      assert_equal [], csprite3.others
154      assert_equal [], sprite.others
155    end
156  end
157  def test_collection_collide
158    assert_collide_collection_and_sprite collide = true do |collection, sprite|
159      collection.collide(:test, sprite, :test)
160    end
161  end
162  def test_collection_collide_q
163    assert_collide_collection_and_sprite collide = false do |collection, sprite|
164      collection.collide?(:test, sprite, :test)
165    end
166  end
167  def test_collide_with_collection
168    assert_collide_collection_and_sprite collide = true do |collection, sprite|
169      sprite.collide(:test, collection, :test)
170    end
171  end
172  def test_collide_q_with_collection
173    assert_collide_collection_and_sprite collide = false do |collection, sprite|
174      sprite.collide?(:test, collection, :test)
175    end
176  end
177end
Note: See TracBrowser for help on using the browser.