cyross-ruby-miyako 2.0.5.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 (91) hide show
  1. data/README +1092 -929
  2. data/Rakefile +7 -7
  3. data/defines.h +144 -144
  4. data/extern.h +29 -29
  5. data/install_miyako.rb +87 -87
  6. data/lib/Miyako/API/audio.rb +572 -198
  7. data/lib/Miyako/API/basic_data.rb +825 -573
  8. data/lib/Miyako/API/bitmap.rb +534 -507
  9. data/lib/Miyako/API/choices.rb +481 -475
  10. data/lib/Miyako/API/collision.rb +486 -460
  11. data/lib/Miyako/API/diagram.rb +586 -561
  12. data/lib/Miyako/API/drawing.rb +151 -151
  13. data/lib/Miyako/API/exceptions.rb +105 -0
  14. data/lib/Miyako/API/fixedmap.rb +462 -428
  15. data/lib/Miyako/API/font.rb +430 -403
  16. data/lib/Miyako/API/input.rb +456 -447
  17. data/lib/Miyako/API/layout.rb +636 -433
  18. data/lib/Miyako/API/map.rb +583 -529
  19. data/lib/Miyako/API/map_event.rb +222 -198
  20. data/lib/Miyako/API/modules.rb +357 -109
  21. data/lib/Miyako/API/movie.rb +166 -154
  22. data/lib/Miyako/API/parts.rb +276 -189
  23. data/lib/Miyako/API/plane.rb +205 -166
  24. data/lib/Miyako/API/screen.rb +341 -325
  25. data/lib/Miyako/API/shape.rb +443 -443
  26. data/lib/Miyako/API/sprite.rb +771 -752
  27. data/lib/Miyako/API/sprite_animation.rb +490 -481
  28. data/lib/Miyako/API/sprite_list.rb +1135 -0
  29. data/lib/Miyako/API/spriteunit.rb +168 -147
  30. data/lib/Miyako/API/story.rb +350 -300
  31. data/lib/Miyako/API/textbox.rb +770 -725
  32. data/lib/Miyako/API/utility.rb +419 -388
  33. data/lib/Miyako/API/viewport.rb +189 -139
  34. data/lib/Miyako/API/yuki.rb +1226 -996
  35. data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
  36. data/lib/Miyako/EXT/raster_scroll.rb +138 -138
  37. data/lib/Miyako/EXT/slides.rb +157 -157
  38. data/lib/Miyako/miyako.rb +201 -171
  39. data/lib/Miyako/miyako_require_only.rb +35 -0
  40. data/miyako_basicdata.c +590 -590
  41. data/miyako_bitmap.c +1225 -1225
  42. data/miyako_collision.c +403 -403
  43. data/miyako_drawing.c +187 -187
  44. data/miyako_font.c +334 -334
  45. data/miyako_hsv.c +830 -830
  46. data/miyako_input_audio.c +254 -0
  47. data/miyako_layout.c +191 -191
  48. data/miyako_no_katana.c +1078 -1074
  49. data/miyako_sprite2.c +431 -0
  50. data/miyako_transform.c +438 -438
  51. data/miyako_utility.c +288 -288
  52. data/sample/Animation1/m1ku.rb +68 -68
  53. data/sample/Animation2/lex.rb +96 -96
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
  55. data/sample/Room3/blue.rb +297 -297
  56. data/sample/Room3/ending.rb +180 -180
  57. data/sample/Room3/green.rb +220 -220
  58. data/sample/Room3/main.rb +119 -119
  59. data/sample/Room3/main_component.rb +59 -59
  60. data/sample/Room3/red.rb +227 -227
  61. data/sample/Room3/room3.rb +25 -27
  62. data/sample/Room3/title.rb +184 -184
  63. data/sample/ball_action_sample.rb +204 -204
  64. data/sample/blit_rop.rb +70 -70
  65. data/sample/cairo_sample.rb +25 -25
  66. data/sample/circle_collision_test.rb +66 -66
  67. data/sample/collision_test.rb +33 -33
  68. data/sample/collision_test2.rb +108 -108
  69. data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
  70. data/sample/fixed_map_test/readme.txt +72 -72
  71. data/sample/map_test/chara.rb +58 -58
  72. data/sample/map_test/main_parts.rb +69 -69
  73. data/sample/map_test/main_scene.rb +153 -153
  74. data/sample/map_test/map_manager.rb +75 -75
  75. data/sample/map_test/map_test.rb +23 -23
  76. data/sample/map_test/oasis.rb +71 -71
  77. data/sample/map_test/readme.txt +89 -89
  78. data/sample/map_test/route.rb +157 -157
  79. data/sample/map_test/town.rb +74 -74
  80. data/sample/polygon_test.rb +35 -35
  81. data/sample/rasterscroll.rb +24 -24
  82. data/sample/takahashi.rb +42 -42
  83. data/sample/textbox_sample.rb +189 -189
  84. data/sample/transform.rb +54 -54
  85. data/sample/utility_test.rb +73 -73
  86. data/sample/utility_test2.rb +61 -61
  87. data/sample/utility_test3.rb +64 -64
  88. data/sample/utility_test4.rb +73 -73
  89. data/uninstall_miyako.rb +19 -19
  90. data/win/miyako_no_katana.so +0 -0
  91. metadata +7 -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,66 +1,66 @@
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
+ # 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,108 +1,108 @@
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
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