cyross-ruby-miyako-mswin32 2.0.5.1.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. data/README +1089 -929
  2. data/install_miyako.rb +87 -61
  3. data/lib/Miyako/API/audio.rb +572 -198
  4. data/lib/Miyako/API/basic_data.rb +825 -573
  5. data/lib/Miyako/API/bitmap.rb +534 -507
  6. data/lib/Miyako/API/choices.rb +481 -475
  7. data/lib/Miyako/API/collision.rb +486 -460
  8. data/lib/Miyako/API/diagram.rb +586 -561
  9. data/lib/Miyako/API/drawing.rb +151 -151
  10. data/lib/Miyako/API/exceptions.rb +105 -0
  11. data/lib/Miyako/API/fixedmap.rb +462 -428
  12. data/lib/Miyako/API/font.rb +430 -403
  13. data/lib/Miyako/API/input.rb +456 -447
  14. data/lib/Miyako/API/layout.rb +636 -433
  15. data/lib/Miyako/API/map.rb +583 -529
  16. data/lib/Miyako/API/map_event.rb +222 -198
  17. data/lib/Miyako/API/modules.rb +305 -109
  18. data/lib/Miyako/API/movie.rb +166 -154
  19. data/lib/Miyako/API/parts.rb +276 -189
  20. data/lib/Miyako/API/plane.rb +205 -166
  21. data/lib/Miyako/API/screen.rb +341 -325
  22. data/lib/Miyako/API/shape.rb +443 -443
  23. data/lib/Miyako/API/sprite.rb +771 -752
  24. data/lib/Miyako/API/sprite_animation.rb +490 -481
  25. data/lib/Miyako/API/sprite_list.rb +884 -0
  26. data/lib/Miyako/API/spriteunit.rb +168 -147
  27. data/lib/Miyako/API/story.rb +350 -300
  28. data/lib/Miyako/API/textbox.rb +770 -725
  29. data/lib/Miyako/API/utility.rb +419 -388
  30. data/lib/Miyako/API/viewport.rb +189 -139
  31. data/lib/Miyako/API/yuki.rb +1226 -996
  32. data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
  33. data/lib/Miyako/EXT/raster_scroll.rb +138 -138
  34. data/lib/Miyako/EXT/slides.rb +157 -157
  35. data/lib/Miyako/miyako.rb +201 -171
  36. data/lib/Miyako/miyako_no_katana.so +0 -0
  37. data/lib/Miyako/miyako_require_only.rb +35 -0
  38. data/sample/Animation1/m1ku.rb +68 -68
  39. data/sample/Animation2/lex.rb +96 -96
  40. data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
  41. data/sample/Room3/blue.rb +297 -297
  42. data/sample/Room3/ending.rb +180 -180
  43. data/sample/Room3/green.rb +220 -220
  44. data/sample/Room3/main.rb +119 -119
  45. data/sample/Room3/main_component.rb +59 -59
  46. data/sample/Room3/red.rb +227 -227
  47. data/sample/Room3/room3.rb +25 -27
  48. data/sample/Room3/title.rb +184 -184
  49. data/sample/ball_action_sample.rb +205 -204
  50. data/sample/blit_rop.rb +70 -70
  51. data/sample/cairo_sample.rb +25 -25
  52. data/sample/circle_collision_test.rb +66 -62
  53. data/sample/collision_test.rb +33 -33
  54. data/sample/collision_test2.rb +108 -104
  55. data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
  56. data/sample/fixed_map_test/readme.txt +72 -72
  57. data/sample/map_test/chara.rb +58 -58
  58. data/sample/map_test/main_parts.rb +69 -69
  59. data/sample/map_test/main_scene.rb +153 -153
  60. data/sample/map_test/map_manager.rb +75 -75
  61. data/sample/map_test/map_test.rb +23 -23
  62. data/sample/map_test/oasis.rb +71 -71
  63. data/sample/map_test/readme.txt +89 -89
  64. data/sample/map_test/route.rb +157 -157
  65. data/sample/map_test/town.rb +74 -74
  66. data/sample/polygon_test.rb +35 -35
  67. data/sample/rasterscroll.rb +24 -24
  68. data/sample/takahashi.rb +42 -42
  69. data/sample/textbox_sample.rb +189 -189
  70. data/sample/transform.rb +54 -54
  71. data/sample/utility_test.rb +73 -73
  72. data/sample/utility_test2.rb +61 -61
  73. data/sample/utility_test3.rb +64 -64
  74. data/sample/utility_test4.rb +73 -73
  75. data/uninstall_miyako.rb +19 -19
  76. metadata +5 -2
data/sample/blit_rop.rb CHANGED
@@ -1,70 +1,70 @@
1
- # 画像ビット操作サンプル
2
- # 2009.4.17 Cyross Makoto
3
-
4
- require 'Miyako/miyako'
5
-
6
- include Miyako
7
-
8
- # 画像が画面をはみ出そうになったら移動量を+-反転
9
- # spr:: 移動対象のスプライト
10
- # amt:: 移動量配列
11
- # 返却値:: 変更した移動量配列
12
- def turn(spr, amt)
13
- amt[0] = -amt[0] if (spr.x + spr.ow) >= Screen.w
14
- amt[0] = -amt[0] if spr.x <= 0
15
- amt[1] = -amt[1] if (spr.y + spr.oh) >= Screen.h
16
- amt[1] = -amt[1] if spr.y <= 0
17
- return amt
18
- end
19
-
20
- # マスク画像を作成
21
- bmask = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
22
- Drawing.circle(bmask, [50,50], 50, [255,255,255], :fill)
23
-
24
- # 描画用スプライトを作成
25
- spr1 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
26
- spr2 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
27
- spr3 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
28
-
29
- # 転送元背景を準備
30
- bk = Sprite.new(:file=>"Animation1/m1ku_back.jpg", :type=>:as)
31
- text = Sprite.new(:file=>"text.png", :type=>:ac)
32
- # 表示用背景を準備(元画像を反転)
33
- bk2 = bk.inverse
34
-
35
- spr2.centering
36
- spr3.right.bottom
37
-
38
- # 移動量配列を設定
39
- @amt1 = [ 4, 4]
40
- @amt2 = [ 4,-4]
41
- @amt3 = [-4,-4]
42
-
43
- # Main Routine
44
- Miyako.main_loop do
45
- break if Input.quit_or_escape?
46
- # マスク画像の転送
47
- bmask.render_to(spr1)
48
- bk.render_to(spr2){|src, dst| src.ox = spr2.x; src.oy = spr2.y}
49
- bk2.render_to(spr3){|src, dst| src.ox = spr3.x; src.oy = spr3.y}
50
- # 元画像をandして描画用スプライトへ転送
51
- spr1.and!(bk){|src, dst| src.ox = spr1.x; src.oy = spr1.y}
52
- # 元画像をorして描画用スプライトへ転送
53
- spr2.or!(text)
54
- # 元画像をxorして描画用スプライトへ転送
55
- spr3.xor!(text)
56
-
57
- # 画像を画面に描画
58
- bk2.render
59
- spr1.render
60
- spr2.render
61
- spr3.render
62
- # スプライトの移動
63
- spr1.move(*@amt1)
64
- spr2.move(*@amt2)
65
- spr3.move(*@amt3)
66
- # 画像が画面をはみ出そうになったら移動量を+-反転
67
- @amt1 = turn(spr1, @amt1)
68
- @amt2 = turn(spr2, @amt2)
69
- @amt3 = turn(spr3, @amt3)
70
- end
1
+ # 画像ビット操作サンプル
2
+ # 2009.4.17 Cyross Makoto
3
+
4
+ require 'Miyako/miyako'
5
+
6
+ include Miyako
7
+
8
+ # 画像が画面をはみ出そうになったら移動量を+-反転
9
+ # spr:: 移動対象のスプライト
10
+ # amt:: 移動量配列
11
+ # 返却値:: 変更した移動量配列
12
+ def turn(spr, amt)
13
+ amt[0] = -amt[0] if (spr.x + spr.ow) >= Screen.w
14
+ amt[0] = -amt[0] if spr.x <= 0
15
+ amt[1] = -amt[1] if (spr.y + spr.oh) >= Screen.h
16
+ amt[1] = -amt[1] if spr.y <= 0
17
+ return amt
18
+ end
19
+
20
+ # マスク画像を作成
21
+ bmask = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
22
+ Drawing.circle(bmask, [50,50], 50, [255,255,255], :fill)
23
+
24
+ # 描画用スプライトを作成
25
+ spr1 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
26
+ spr2 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
27
+ spr3 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
28
+
29
+ # 転送元背景を準備
30
+ bk = Sprite.new(:file=>"Animation1/m1ku_back.jpg", :type=>:as)
31
+ text = Sprite.new(:file=>"text.png", :type=>:ac)
32
+ # 表示用背景を準備(元画像を反転)
33
+ bk2 = bk.inverse
34
+
35
+ spr2.centering!
36
+ spr3.right!.bottom!
37
+
38
+ # 移動量配列を設定
39
+ @amt1 = [ 4, 4]
40
+ @amt2 = [ 4,-4]
41
+ @amt3 = [-4,-4]
42
+
43
+ # Main Routine
44
+ Miyako.main_loop do
45
+ break if Input.quit_or_escape?
46
+ # マスク画像の転送
47
+ bmask.render_to(spr1)
48
+ bk.render_to(spr2){|src, dst| src.ox = spr2.x; src.oy = spr2.y}
49
+ bk2.render_to(spr3){|src, dst| src.ox = spr3.x; src.oy = spr3.y}
50
+ # 元画像をandして描画用スプライトへ転送
51
+ spr1.and!(bk){|src, dst| src.ox = spr1.x; src.oy = spr1.y}
52
+ # 元画像をorして描画用スプライトへ転送
53
+ spr2.or!(text)
54
+ # 元画像をxorして描画用スプライトへ転送
55
+ spr3.xor!(text)
56
+
57
+ # 画像を画面に描画
58
+ bk2.render
59
+ spr1.render
60
+ spr2.render
61
+ spr3.render
62
+ # スプライトの移動
63
+ spr1.move!(*@amt1)
64
+ spr2.move!(*@amt2)
65
+ spr3.move!(*@amt3)
66
+ # 画像が画面をはみ出そうになったら移動量を+-反転
67
+ @amt1 = turn(spr1, @amt1)
68
+ @amt2 = turn(spr2, @amt2)
69
+ @amt3 = turn(spr3, @amt3)
70
+ end
@@ -1,25 +1,25 @@
1
- # encoding: utf-8
2
- # MiyakoCairoサンプル
3
- # 2009.4.12 Cyross Makoto
4
-
5
- require 'Miyako/miyako'
6
- require 'Miyako/EXT/miyako_cairo'
7
-
8
- sprite = Miyako::Sprite.new(:file=>"Animation2/lex_body.png", :type=>:ck)
9
- sprite.bitmap.saveBMP("./sample.bmp")
10
-
11
- surface = Miyako::MiyakoCairo.to_cairo_surface(sprite)
12
- surface.write_to_png("./sample.png")
13
-
14
- surface = Cairo::ImageSurface.new(Cairo::Format::ARGB32, 320, 240)
15
- context = Cairo::Context.new(surface)
16
-
17
- context.set_source_rgb(1.0, 0.5, 0.8)
18
- context.fill{
19
- context.rectangle(50, 50, 150, 100)
20
- }
21
-
22
- surface.write_to_png("./sample2.png")
23
-
24
- sprite = Miyako::MiyakoCairo.to_sprite(surface)
25
- sprite.bitmap.saveBMP("./sample2.bmp")
1
+ # encoding: utf-8
2
+ # MiyakoCairoサンプル
3
+ # 2009.4.12 Cyross Makoto
4
+
5
+ require 'Miyako/miyako'
6
+ require 'Miyako/EXT/miyako_cairo'
7
+
8
+ sprite = Miyako::Sprite.new(:file=>"Animation2/lex_body.png", :type=>:ck)
9
+ sprite.bitmap.saveBMP("./sample.bmp")
10
+
11
+ surface = Miyako::MiyakoCairo.to_cairo_surface(sprite)
12
+ surface.write_to_png("./sample.png")
13
+
14
+ surface = Cairo::ImageSurface.new(Cairo::Format::ARGB32, 320, 240)
15
+ context = Cairo::Context.new(surface)
16
+
17
+ context.set_source_rgb(1.0, 0.5, 0.8)
18
+ context.fill{
19
+ context.rectangle(50, 50, 150, 100)
20
+ }
21
+
22
+ surface.write_to_png("./sample2.png")
23
+
24
+ sprite = Miyako::MiyakoCairo.to_sprite(surface)
25
+ sprite.bitmap.saveBMP("./sample2.bmp")
@@ -1,62 +1,66 @@
1
- # encoding: utf-8
2
- # 円コリジョン(CircleCollision)サンプル
3
- # 2009.4.25 Cyross Makoto
4
-
5
- require 'Miyako/miyako'
6
-
7
- include Miyako
8
-
9
- Screen.fps = 60
10
-
11
- # Utility.in_bounds?引数生成
12
- def segments(sprite, amounts, idx)
13
- [
14
- [sprite.pos[idx], sprite.pos[idx] + sprite.size[idx] - 1],
15
- [0, Screen.size[idx]],
16
- amounts[idx]
17
- ]
18
- end
19
-
20
- radius = 16
21
- size = [32, 32]
22
- pos = [16, 16]
23
- sprite1 = Sprite.new({:size=>size, :type=>:as})
24
- Drawing.circle(sprite1, pos, radius, [255,0,0], true)
25
- collision1 = CircleCollision.new(pos, radius)
26
- sprite2 = Sprite.new({:size=>size, :type=>:as})
27
- Drawing.circle(sprite2, pos, radius, [0,255,0], true)
28
- collision2 = CircleCollision.new(pos, radius)
29
- caution = Shape.text({:font => Font.serif }){ text "collision!" }
30
-
31
- sprite1.center.move(0, 128)
32
- sprite2.move_to(176, 0)
33
-
34
- amounts = [8, -8]
35
-
36
- amount1 = [amounts.sample, amounts.sample]
37
- amount2 = [amounts.sample, amounts.sample]
38
-
39
- Miyako.main_loop do
40
- break if Input.quit_or_escape?
41
- if collision1.collision?(sprite1.pos, collision2, sprite2.pos)
42
- amount1 = [amounts.sample, amounts.sample]
43
- amount2 = [amounts.sample, amounts.sample]
44
- caution.render
45
- end
46
- amount1[0] = -amount1[0] unless Utility.in_bounds?(*segments(sprite1, amount1, 0))
47
- amount1[1] = -amount1[1] unless Utility.in_bounds?(*segments(sprite1, amount1, 1))
48
- amount2[0] = -amount2[0] unless Utility.in_bounds?(*segments(sprite2, amount2, 0))
49
- amount2[1] = -amount2[1] unless Utility.in_bounds?(*segments(sprite2, amount2, 1))
50
-
51
- sprite1.move(*amount1)
52
- sprite2.move(*amount2)
53
-
54
- sprite1.render
55
- sprite2.render
56
-
57
- Font.serif.draw_text(Screen,
58
- "distance = #{collision1.interval(sprite1.pos, collision2, sprite2.pos)}",
59
- 0,
60
- Screen.h - Font.serif.line_height
61
- )
62
- end
1
+ # encoding: utf-8
2
+ # 円コリジョン(CircleCollision)サンプル
3
+ # 2009.4.26 Cyross Makoto
4
+
5
+ require 'Miyako/miyako'
6
+
7
+ include Miyako
8
+
9
+ Screen.fps = 60
10
+
11
+ AMOUNT_MIN = -8
12
+ AMOUNT_MAX = 8
13
+
14
+ # Utility.in_bounds?引数生成
15
+ def segments(sprite, amounts, idx)
16
+ [sprite.segment[idx], Screen.segment[idx], amounts[idx]]
17
+ end
18
+
19
+ # 移動量の決定
20
+ def get_amount
21
+ range = AMOUNT_MAX - AMOUNT_MIN
22
+ [[rand(range)+AMOUNT_MIN,
23
+ rand(range)+AMOUNT_MIN],
24
+ [rand(range)+AMOUNT_MIN,
25
+ rand(range)+AMOUNT_MIN]]
26
+ end
27
+
28
+ radius = 32
29
+ size = [radius*2, radius*2]
30
+ pos = [radius, radius]
31
+ sprite1 = Sprite.new({:size=>size, :type=>:as})
32
+ Drawing.circle(sprite1, pos, radius, [255,0,0], true)
33
+ collision1 = CircleCollision.new(pos, radius)
34
+ sprite2 = Sprite.new({:size=>size, :type=>:as})
35
+ Drawing.circle(sprite2, pos, radius, [0,255,0], true)
36
+ collision2 = CircleCollision.new(pos, radius)
37
+ caution = Shape.text({:font => Font.serif }){ text "collision!" }
38
+
39
+ sprite1.move_to!(rand(Screen.w-size[0]), rand(Screen.h-size[1]))
40
+ sprite2.move_to!(rand(Screen.w-size[0]), rand(Screen.h-size[1]))
41
+
42
+ amount1, amount2 = get_amount
43
+
44
+ Miyako.main_loop do
45
+ break if Input.quit_or_escape?
46
+ if collision1.collision?(sprite1.pos, collision2, sprite2.pos)
47
+ amount1, amount2 = get_amount
48
+ caution.render
49
+ end
50
+ amount1[0] = -amount1[0] unless Utility.in_bounds?(*segments(sprite1, amount1, 0))
51
+ amount1[1] = -amount1[1] unless Utility.in_bounds?(*segments(sprite1, amount1, 1))
52
+ amount2[0] = -amount2[0] unless Utility.in_bounds?(*segments(sprite2, amount2, 0))
53
+ amount2[1] = -amount2[1] unless Utility.in_bounds?(*segments(sprite2, amount2, 1))
54
+
55
+ sprite1.move!(*amount1)
56
+ sprite2.move!(*amount2)
57
+
58
+ sprite1.render
59
+ sprite2.render
60
+
61
+ Font.serif.draw_text(Screen,
62
+ "distance = #{collision1.interval(sprite1.pos, collision2, sprite2.pos)}",
63
+ 0,
64
+ Screen.h - Font.serif.line_height
65
+ )
66
+ end
@@ -1,33 +1,33 @@
1
- # encoding: utf-8
2
- # コリジョン(Collision)サンプル
3
- # 2009.4.12 Cyross Makoto
4
-
5
- require 'Miyako/miyako'
6
-
7
- include Miyako
8
-
9
- size = [32, 32]
10
- rect = [0, 0] + size
11
- sprite1 = Sprite.new({:size=>size, :type=>:as})
12
- sprite1.fill([255,0,0])
13
- collision1 = Collision.new(rect)
14
- sprite2 = Sprite.new({:size=>size, :type=>:as})
15
- sprite2.fill([0,255,0])
16
- collision2 = Collision.new(rect)
17
- caution = Shape.text({:font => Font.serif }){ text "collision!" }
18
-
19
- sprite1.center.move(0, 128)
20
- sprite2.center
21
-
22
- amount = 8
23
-
24
- Miyako.main_loop do
25
- break if Input.quit_or_escape?
26
- if Collision.collision?(collision1, sprite1.pos, collision2, sprite2.pos)
27
- caution.render
28
- else
29
- sprite2.move(0, amount)
30
- end
31
- sprite1.render
32
- sprite2.render
33
- end
1
+ # encoding: utf-8
2
+ # コリジョン(Collision)サンプル
3
+ # 2009.4.12 Cyross Makoto
4
+
5
+ require 'Miyako/miyako'
6
+
7
+ include Miyako
8
+
9
+ size = [32, 32]
10
+ rect = [0, 0] + size
11
+ sprite1 = Sprite.new({:size=>size, :type=>:as})
12
+ sprite1.fill([255,0,0])
13
+ collision1 = Collision.new(rect)
14
+ sprite2 = Sprite.new({:size=>size, :type=>:as})
15
+ sprite2.fill([0,255,0])
16
+ collision2 = Collision.new(rect)
17
+ caution = Shape.text({:font => Font.serif }){ text "collision!" }
18
+
19
+ sprite1.center!.move!(0, 128)
20
+ sprite2.center!
21
+
22
+ amount = 8
23
+
24
+ Miyako.main_loop do
25
+ break if Input.quit_or_escape?
26
+ if Collision.collision?(collision1, sprite1.pos, collision2, sprite2.pos)
27
+ caution.render
28
+ else
29
+ sprite2.move!(0, amount)
30
+ end
31
+ sprite1.render
32
+ sprite2.render
33
+ end
@@ -1,104 +1,108 @@
1
- # encoding: utf-8
2
- # コリジョン(Collision・CircleCollision混合)サンプル
3
- # 2009.4.24 Cyross Makoto
4
-
5
- require 'Miyako/miyako'
6
-
7
- include Miyako
8
-
9
- Screen.fps = 60
10
-
11
- # Utility.in_bounds?引数生成
12
- def segments(sprite, amounts, idx)
13
- [
14
- [sprite.pos[idx], sprite.pos[idx] + sprite.size[idx] - 1],
15
- [0, Screen.size[idx]],
16
- amounts[idx]
17
- ]
18
- end
19
-
20
- # 矩形衝突判定と円形衝突判定との切り替え
21
- collision_list = [Collision, CircleCollision].cycle
22
-
23
- # 同時表示スプライト数
24
- Sprites = 20
25
-
26
- # スプライトサイズ
27
- size = [64, 64]
28
- # スプライト矩形(当たり判定生成用)
29
- rect = [0, 0] + size
30
- # 移動量切り替え
31
- amount = [4, -4]
32
-
33
- sprites = Array.new(Sprites){|n|
34
- # スプライトの生成
35
- sprite = Sprite.new({:size=>size, :type=>:as})
36
- Drawing.circle(sprite, [size[0]/2, size[1]/2], size[0]/2, [rand(256),rand(256),rand(256)], true)
37
- sprite.move_to(rand(Screen.w-size[0]), rand(Screen.h-size[1]))
38
-
39
- # コリジョンの生成
40
- collision = Collision.new(rect)
41
-
42
- # :collisioned => 当たり判定した?
43
- {
44
- :sprite => sprite,
45
- :collision => collision,
46
- :amount => [amount.sample, amount.sample]
47
- }
48
- }
49
-
50
- # 衝突判定用の組み合わせ行列を作成
51
- matrix = sprites.combination(2)
52
-
53
- cautions = {
54
- Collision => Shape.text({:font => Font.serif }){ text "矩形衝突判定中" },
55
- CircleCollision => Shape.text({:font => Font.serif }){ text "円形衝突判定中" }
56
- }
57
-
58
- # 初期の衝突判定方法を設定
59
- collision_type = collision_list.next
60
-
61
- # 一気にレンダリング
62
- Screen.pre_render_array << sprites.map{|m| m[:sprite]}
63
-
64
- # 判定を切り替えるタイミングを決めるタイマー
65
- wait = WaitCounter.new(1.0)
66
- wait.start
67
-
68
- Miyako.main_loop do
69
- break if Input.quit_or_escape?
70
-
71
- # 一定時間ごとに衝突判定方法を切り替え
72
- if wait.finish?
73
- collision_type = collision_list.next
74
- wait.start
75
- end
76
-
77
- # 衝突判定
78
- # 衝突していたら方向を反転
79
- matrix.each{|pair|
80
- p0 = pair[0]
81
- p1 = pair[1]
82
- if collision_type.collision?(p0[:collision],
83
- p0[:sprite].pos,
84
- p1[:collision],
85
- p1[:sprite].pos)
86
- p0[:amount][0] = -p0[:amount][0]
87
- p0[:amount][1] = -p0[:amount][1]
88
- p1[:amount][0] = -p1[:amount][0]
89
- p1[:amount][1] = -p1[:amount][1]
90
- end
91
- }
92
-
93
- # 移動
94
- sprites.each{|s|
95
- # 画面の端に来たら方向転換
96
- s[:amount][0] = -s[:amount][0] unless Utility.in_bounds?(*segments(s[:sprite], s[:amount], 0))
97
- s[:amount][1] = -s[:amount][1] unless Utility.in_bounds?(*segments(s[:sprite], s[:amount], 1))
98
- s[:sprite].move(*s[:amount])
99
- }
100
-
101
- # 画面への描画
102
- Screen.pre_render
103
- cautions[collision_type].render
104
- end
1
+ # encoding: utf-8
2
+ # コリジョン(Collision・CircleCollision混合)サンプル
3
+ # 2009.4.26 Cyross Makoto
4
+
5
+ require 'Miyako/miyako'
6
+
7
+ include Miyako
8
+
9
+ AMOUNT_MIN = -8
10
+ AMOUNT_MAX = 8
11
+
12
+ Screen.fps = 60
13
+
14
+ # Utility.in_bounds?引数生成
15
+ def segments(sprite, amounts, idx)
16
+ [sprite.segment[idx], Screen.segment[idx], amounts[idx]]
17
+ end
18
+
19
+ # 移動量の決定
20
+ def get_amount_one
21
+ range = AMOUNT_MAX - AMOUNT_MIN
22
+ [rand(range)+AMOUNT_MIN, rand(range)+AMOUNT_MIN]
23
+ end
24
+ def get_amount
25
+ range = AMOUNT_MAX - AMOUNT_MIN
26
+ [get_amount_one, get_amount_one]
27
+ end
28
+
29
+ # 矩形衝突判定と円形衝突判定との切り替え
30
+ collision_list = [Collision, CircleCollision].cycle
31
+
32
+ # 同時表示スプライト数
33
+ Sprites = 20
34
+
35
+ # スプライトサイズ
36
+ size = [64, 64]
37
+ # スプライト矩形(当たり判定生成用)
38
+ rect = [0, 0] + size
39
+
40
+ sprites = Array.new(Sprites){|n|
41
+ # スプライトの生成
42
+ sprite = Sprite.new({:size=>size, :type=>:as})
43
+ Drawing.circle(sprite, [size[0]/2, size[1]/2], size[0]/2, [rand(256),rand(256),rand(256)], true)
44
+ sprite.move_to(rand(Screen.w-size[0]), rand(Screen.h-size[1]))
45
+
46
+ # コリジョンの生成
47
+ collision = Collision.new(rect)
48
+
49
+ # :collisioned => 当たり判定した?
50
+ {
51
+ :sprite => sprite,
52
+ :collision => collision,
53
+ :amount => get_amount_one
54
+ }
55
+ }
56
+
57
+ # 衝突判定用の組み合わせ行列を作成
58
+ matrix = sprites.combination(2)
59
+
60
+ cautions = {
61
+ Collision => Shape.text({:font => Font.serif }){ text "矩形衝突判定中" },
62
+ CircleCollision => Shape.text({:font => Font.serif }){ text "円形衝突判定中" }
63
+ }
64
+
65
+ # 初期の衝突判定方法を設定
66
+ collision_type = collision_list.next
67
+
68
+ # 一気にレンダリング
69
+ Screen.pre_render_array << sprites.map{|m| m[:sprite]}
70
+
71
+ # 判定を切り替えるタイミングを決めるタイマー
72
+ wait = WaitCounter.new(1.0)
73
+ wait.start
74
+
75
+ Miyako.main_loop do
76
+ break if Input.quit_or_escape?
77
+
78
+ # 一定時間ごとに衝突判定方法を切り替え
79
+ if wait.finish?
80
+ collision_type = collision_list.next
81
+ wait.start
82
+ end
83
+
84
+ # 衝突判定
85
+ # 衝突していたら方向を反転
86
+ matrix.each{|pair|
87
+ p0 = pair[0]
88
+ p1 = pair[1]
89
+ if collision_type.collision?(p0[:collision],
90
+ p0[:sprite].pos,
91
+ p1[:collision],
92
+ p1[:sprite].pos)
93
+ p0[:amount], p1[:amount] = get_amount
94
+ end
95
+ }
96
+
97
+ # 移動
98
+ sprites.each{|s|
99
+ # 画面の端に来たら方向転換
100
+ s[:amount][0] = -s[:amount][0] unless Utility.in_bounds?(*segments(s[:sprite], s[:amount], 0))
101
+ s[:amount][1] = -s[:amount][1] unless Utility.in_bounds?(*segments(s[:sprite], s[:amount], 1))
102
+ s[:sprite].move!(*s[:amount])
103
+ }
104
+
105
+ # 画面への描画
106
+ Screen.pre_render
107
+ cautions[collision_type].render
108
+ end