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
@@ -1,151 +1,151 @@
1
- # -*- encoding: utf-8 -*-
2
- =begin
3
- --
4
- Miyako v2.0
5
- Copyright (C) 2007-2009 Cyross Makoto
6
-
7
- This library is free software; you can redistribute it and/or
8
- modify it under the terms of the GNU Lesser General Public
9
- License as published by the Free Software Foundation; either
10
- version 2.1 of the License, or (at your option) any later version.
11
-
12
- This library is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- Lesser General Public License for more details.
16
-
17
- You should have received a copy of the GNU Lesser General Public
18
- License along with this library; if not, write to the Free Software
19
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- ++
21
- =end
22
-
23
- # 線形描画モジュール
24
- module Miyako
25
- #==線形描画モジュール
26
- module Drawing
27
- #===画像全体を指定の色で塗りつぶす
28
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
29
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
30
- #_color_:: 塗りつぶす色。Color.to_rgbメソッドのパラメータでの指定が可能
31
- #返却値:: 自分自身を返す
32
- def Drawing.fill(sprite, color)
33
- color = Color.to_rgb(color)
34
- methods = sprite.methods
35
- raise MiyakoError,
36
- "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
37
- bitmap = methods.include?(:to_unit) ? sprite.to_unit.bitmap : methods.include?(:bitmap) ? sprite.bitmap : sprite
38
- bitmap.draw_rect(0,0, bitmap.w, bitmap.h, color, true, color[3]==255 ? nil : color[3])
39
- return self
40
- end
41
-
42
- #===画像内に点を描画する
43
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
44
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
45
- #_rect_:: 描画する矩形。画像の左上を[0,0]とする。4要素の整数の配列かRect構造体を使用
46
- #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
47
- #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
48
- #返却値:: 自分自身を返す
49
- def Drawing.pset(sprite, point, color)
50
- methods = sprite.methods
51
- raise MiyakoError,
52
- "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
53
- bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
54
- bitmap[point[0], point[1]] = Color.to_rgb(color)
55
- return self
56
- end
57
-
58
- #===画像内に直線を引く
59
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
60
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
61
- #_rect_:: 描画する矩形。画像の左上を[0,0]とする。4要素の整数の配列かRect構造体を使用
62
- #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
63
- #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
64
- #返却値:: 自分自身を返す
65
- def Drawing.line(sprite, rect, color, aa = false)
66
- color = Color.to_rgb(color)
67
- methods = sprite.methods
68
- raise MiyakoError,
69
- "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
70
- bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
71
- bitmap.draw_line(
72
- rect[0], rect[1], rect[0]+rect[2]-1, rect[1]+rect[3]-1,
73
- color, aa, color[3]==255 ? nil : color[3]
74
- )
75
- return self
76
- end
77
-
78
- #===画像内に矩形を描画する
79
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
80
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
81
- #_rect_:: 描画する矩形。画像の左上を[0,0]とする。4要素の整数の配列かRect構造体を使用
82
- #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
83
- #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
84
- #返却値:: 自分自身を返す
85
- def Drawing.rect(sprite, rect, color, fill = false)
86
- color = Color.to_rgb(color)
87
- methods = sprite.methods
88
- raise MiyakoError,
89
- "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
90
- bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
91
- bitmap.draw_rect(
92
- rect[0], rect[1], rect[2]-1, rect[3]-1,
93
- color, fill, color[3]==255 ? nil : color[3]
94
- )
95
- return self
96
- end
97
-
98
- #===画像内に円を描画する
99
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
100
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
101
- #_point_:: 中心の位置。2要素の整数の配列、もしくはPoint構造体を使用可能
102
- #_r_:: 円の半径。整数を使用可能。
103
- #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
104
- #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
105
- #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
106
- #返却値:: 自分自身を返す
107
- def Drawing.circle(sprite, point, r, color, fill = false, aa = false)
108
- color = Color.to_rgb(color)
109
- methods = sprite.methods
110
- raise MiyakoError,
111
- "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
112
- bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
113
- bitmap.draw_circle(*point.to_a[0..1], r, color, fill, aa, color[3]==255 ? nil : color[3])
114
- return self
115
- end
116
-
117
- #===画像内に楕円を描画する
118
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
119
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
120
- #_point_:: 楕円の中心位置。2要素の整数の配列かPoint構造体を使用
121
- #_rx_:: x方向半径。1以上の整数
122
- #_ry_:: y方向半径。1以上の整数
123
- #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
124
- #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
125
- #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
126
- #返却値:: 自分自身を返す
127
- def Drawing.ellipse(sprite, point, rx, ry, color, fill = false, aa = false)
128
- color = Color.to_rgb(color)
129
- methods = sprite.methods
130
- raise MiyakoError,
131
- "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
132
- bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
133
- bitmap.draw_ellipse(
134
- point[0], point[1], rx, ry,
135
- color, fill, aa, color[3]==255 ? nil : color[3]
136
- )
137
- end
138
-
139
- #===画像内に多角形を描画する
140
- #多角形を描画するとき、頂点のリストは、[x,y]で示した配列のリスト(配列)を渡す。
141
- #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
142
- #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
143
- #_points_:: 座標の配列。2要素の整数の配列かPoint構造体を使用
144
- #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
145
- #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
146
- #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
147
- #返却値:: 自分自身を返す
148
- def Drawing.polygon(sprite, points, color, fill = false, aa = false)
149
- end
150
- end
151
- end
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ # 線形描画モジュール
24
+ module Miyako
25
+ #==線形描画モジュール
26
+ module Drawing
27
+ #===画像全体を指定の色で塗りつぶす
28
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
29
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
30
+ #_color_:: 塗りつぶす色。Color.to_rgbメソッドのパラメータでの指定が可能
31
+ #返却値:: 自分自身を返す
32
+ def Drawing.fill(sprite, color)
33
+ color = Color.to_rgb(color)
34
+ methods = sprite.methods
35
+ raise MiyakoError,
36
+ "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
37
+ bitmap = methods.include?(:to_unit) ? sprite.to_unit.bitmap : methods.include?(:bitmap) ? sprite.bitmap : sprite
38
+ bitmap.draw_rect(0,0, bitmap.w, bitmap.h, color, true, color[3]==255 ? nil : color[3])
39
+ return self
40
+ end
41
+
42
+ #===画像内に点を描画する
43
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
44
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
45
+ #_rect_:: 描画する矩形。画像の左上を[0,0]とする。4要素の整数の配列かRect構造体を使用
46
+ #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
47
+ #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
48
+ #返却値:: 自分自身を返す
49
+ def Drawing.pset(sprite, point, color)
50
+ methods = sprite.methods
51
+ raise MiyakoError,
52
+ "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
53
+ bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
54
+ bitmap[point[0], point[1]] = Color.to_rgb(color)
55
+ return self
56
+ end
57
+
58
+ #===画像内に直線を引く
59
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
60
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
61
+ #_rect_:: 描画する矩形。画像の左上を[0,0]とする。4要素の整数の配列かRect構造体を使用
62
+ #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
63
+ #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
64
+ #返却値:: 自分自身を返す
65
+ def Drawing.line(sprite, rect, color, aa = false)
66
+ color = Color.to_rgb(color)
67
+ methods = sprite.methods
68
+ raise MiyakoError,
69
+ "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
70
+ bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
71
+ bitmap.draw_line(
72
+ rect[0], rect[1], rect[0]+rect[2]-1, rect[1]+rect[3]-1,
73
+ color, aa, color[3]==255 ? nil : color[3]
74
+ )
75
+ return self
76
+ end
77
+
78
+ #===画像内に矩形を描画する
79
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
80
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
81
+ #_rect_:: 描画する矩形。画像の左上を[0,0]とする。4要素の整数の配列かRect構造体を使用
82
+ #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
83
+ #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
84
+ #返却値:: 自分自身を返す
85
+ def Drawing.rect(sprite, rect, color, fill = false)
86
+ color = Color.to_rgb(color)
87
+ methods = sprite.methods
88
+ raise MiyakoError,
89
+ "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
90
+ bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
91
+ bitmap.draw_rect(
92
+ rect[0], rect[1], rect[2]-1, rect[3]-1,
93
+ color, fill, color[3]==255 ? nil : color[3]
94
+ )
95
+ return self
96
+ end
97
+
98
+ #===画像内に円を描画する
99
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
100
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
101
+ #_point_:: 中心の位置。2要素の整数の配列、もしくはPoint構造体を使用可能
102
+ #_r_:: 円の半径。整数を使用可能。
103
+ #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
104
+ #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
105
+ #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
106
+ #返却値:: 自分自身を返す
107
+ def Drawing.circle(sprite, point, r, color, fill = false, aa = false)
108
+ color = Color.to_rgb(color)
109
+ methods = sprite.methods
110
+ raise MiyakoError,
111
+ "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
112
+ bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
113
+ bitmap.draw_circle(*point.to_a[0..1], r, color, fill, aa, color[3]==255 ? nil : color[3])
114
+ return self
115
+ end
116
+
117
+ #===画像内に楕円を描画する
118
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
119
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
120
+ #_point_:: 楕円の中心位置。2要素の整数の配列かPoint構造体を使用
121
+ #_rx_:: x方向半径。1以上の整数
122
+ #_ry_:: y方向半径。1以上の整数
123
+ #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
124
+ #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
125
+ #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
126
+ #返却値:: 自分自身を返す
127
+ def Drawing.ellipse(sprite, point, rx, ry, color, fill = false, aa = false)
128
+ color = Color.to_rgb(color)
129
+ methods = sprite.methods
130
+ raise MiyakoError,
131
+ "this method needs sprite have to_method or bitmap method!" if !methods.include?(:to_unit) && !methods.include?(:bitmap)
132
+ bitmap = sprite.methods.include?(:to_unit) ? sprite.to_unit.bitmap : sprite.bitmap
133
+ bitmap.draw_ellipse(
134
+ point[0], point[1], rx, ry,
135
+ color, fill, aa, color[3]==255 ? nil : color[3]
136
+ )
137
+ end
138
+
139
+ #===画像内に多角形を描画する
140
+ #多角形を描画するとき、頂点のリストは、[x,y]で示した配列のリスト(配列)を渡す。
141
+ #引数spriteにto_unitもしくはbitmapメソッドが定義されていない場合は例外が発生する。
142
+ #_sprite_:: 描画対象のスプライト(to_unitもしくはbitmapメソッドを持つインスタンス)
143
+ #_points_:: 座標の配列。2要素の整数の配列かPoint構造体を使用
144
+ #_color_:: 描画色。Color.to_rgbメソッドのパラメータでの指定が可能
145
+ #_fill_:: 描画の属性。falseで縁のみ描画、trueで内部も塗りつぶす。デフォルトはfalse
146
+ #_aa_:: アンチエイリアスの指定。trueでオン。デフォルトはfalse
147
+ #返却値:: 自分自身を返す
148
+ def Drawing.polygon(sprite, points, color, fill = false, aa = false)
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,105 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ # 例外クラス群
24
+ module Miyako
25
+
26
+ #==Miyakoの汎用例外クラス
27
+ class MiyakoError < Exception
28
+ end
29
+
30
+ #==Miyakoの入出力例外クラス
31
+ class MiyakoIOError < MiyakoError
32
+ #===ファイルが見つからなかったときの例外を生成する
33
+ #「ファイルが見つからない」というエラーメッセージを発する
34
+ #例外インスタンスを生成する
35
+ #_path_:: 見つからなかったファイルパス
36
+ #返却値:: 生成した例外インスタンス
37
+ def MiyakoIOError.no_file(path)
38
+ MiyakoIOError.exception("Not found file: #{path}")
39
+ end
40
+ end
41
+
42
+ #==Miyakoのファイル形式例外クラス
43
+ class MiyakoFileFormatError < MiyakoIOError
44
+ #===ファイルが見つからなかったときの例外を生成する
45
+ #「ファイルが見つからない」というエラーメッセージを発する
46
+ #例外インスタンスを生成する
47
+ #_path_:: 見つからなかったファイルパス
48
+ #返却値:: 生成した例外インスタンス
49
+ def MiyakoIOError.illegal_file_foramt(path)
50
+ MiyakoIOError.exception("Illegal file format.: #{path}")
51
+ end
52
+ end
53
+
54
+ #==Miyakoの不正値クラス
55
+ class MiyakoValueError < MiyakoError
56
+ #===不正な値が使われたときの例外を生成する
57
+ #「不正な値が使われました」というエラーメッセージを発する
58
+ #例外インスタンスを生成する
59
+ #_value_:: 使用した値
60
+ #返却値:: 生成した例外インスタンス
61
+ def MiyakoValueError.illegal_value(value)
62
+ MiyakoValueError.exception("Illegal value: #{value}")
63
+ end
64
+
65
+ #===範囲外の値が設定されたときの例外を生成する
66
+ #「範囲外の値が参照しました」というエラーメッセージを発する
67
+ #例外インスタンスを生成する
68
+ #_value_:: 使用した値
69
+ #_min_:: 範囲の下限値
70
+ #_max_:: 範囲の上限値
71
+ #返却値:: 生成した例外インスタンス
72
+ def MiyakoValueError.over_range(value, min, max)
73
+ min = "" unless min
74
+ max = "" unless max
75
+ MiyakoValueError.exception("Out of range: #{value} (range: #{min}..#{max})")
76
+ end
77
+ end
78
+
79
+ #==Proc、ブロック関連エラー(ブロックが渡っていない、など)
80
+ class MiyakoProcError < MiyakoError
81
+
82
+ #===ブロックが必要なときの例外を生成する
83
+ #返却値:: 生成した例外インスタンス
84
+ def MiyakoProcError.need_block
85
+ MiyakoProcError.exception("This method needs block!")
86
+ end
87
+ end
88
+
89
+ #==クラス関連エラー
90
+ class MiyakoTypeError < MiyakoError
91
+ end
92
+
93
+ #==コピーエラー(複写時に起きる例外(複写禁止なのに複写した、など))
94
+ class MiyakoCopyError < MiyakoError
95
+
96
+ #===複製不可のインスタンスを複製したときの例外を生成する
97
+ #「このインスタンスは複製できません」というエラーメッセージを発する
98
+ #例外インスタンスを生成する
99
+ #_class_name_:: 複製しようとした値のクラス名
100
+ #返却値:: 生成した例外インスタンス
101
+ def MiyakoCopyError.not_copy(class_name)
102
+ MiyakoCopyError.exception("#{class_name} class instance cannot allow dup/clone!")
103
+ end
104
+ end
105
+ end
@@ -1,428 +1,462 @@
1
- # -*- encoding: utf-8 -*-
2
- =begin
3
- --
4
- Miyako v2.0
5
- Copyright (C) 2007-2009 Cyross Makoto
6
-
7
- This library is free software; you can redistribute it and/or
8
- modify it under the terms of the GNU Lesser General Public
9
- License as published by the Free Software Foundation; either
10
- version 2.1 of the License, or (at your option) any later version.
11
-
12
- This library is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- Lesser General Public License for more details.
16
-
17
- You should have received a copy of the GNU Lesser General Public
18
- License along with this library; if not, write to the Free Software
19
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- ++
21
- =end
22
-
23
- require 'csv'
24
- require 'forwardable'
25
-
26
- module Miyako
27
- #==スクロールしないマップクラス
28
- class FixedMap
29
- include Layout
30
-
31
- @@idx_ix = [-1, 2, 4]
32
- @@idx_iy = [-1, 0, 6]
33
-
34
- attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
35
- attr_reader :name, :map_layers, :mapchips, :pos, :size, :w, :h
36
-
37
- #==あとで書く
38
- class FixedMapLayer #:nodoc: all
39
- extend Forwardable
40
-
41
- @@use_chip_list = Hash.new(nil)
42
-
43
- attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
44
- attr_accessor :mapchip, :mapchip_units
45
- attr_reader :pos
46
-
47
- def round(v, max) #:nodoc:
48
- v = max + (v % max) if v < 0
49
- v %= max if v >= max
50
- return v
51
- end
52
-
53
- def reSize #:nodoc:
54
- @cw = @real_size.w % @ow == 0 ? @real_size.w / @ow : (@real_size.w + @ow - 1)/ @ow + 1
55
- @ch = @real_size.h % @oh == 0 ? @real_size.h / @oh : (@real_size.h + @oh - 1)/ @oh + 1
56
- end
57
-
58
- def initialize(mapchip, mapdat, layer_size) #:nodoc:
59
- @mapchip = mapchip
60
- @pos = Point.new(0, 0)
61
- @size = layer_size.dup
62
- @ow = @mapchip.chip_size.w
63
- @oh = @mapchip.chip_size.h
64
- @real_size = Size.new(@size.w * @ow, @size.h * @oh)
65
- @mapdat = mapdat
66
- @baseimg = nil
67
- @baseimg = @mapchip.chip_image
68
- @units = nil
69
- @visible = true
70
- @divpx = get_div_array(0, @real_size.w, @ow)
71
- @divpy = get_div_array(0, @real_size.h, @oh)
72
- @modpx = get_mod_array(0, @real_size.w, @ow)
73
- @modpy = get_mod_array(0, @real_size.h, @oh)
74
- @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
75
- @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
76
- @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
77
- @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
78
- @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
79
- @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
80
- @cdivsx = @cdivsx.map{|v| v * @ow }
81
- @cdivsy = @cdivsy.map{|v| v * @oh }
82
- @cmodsx = @cmodsx.map{|v| v * @ow }
83
- @cmodsy = @cmodsy.map{|v| v * @oh }
84
- @mapchip_units = Array.new(@mapchip.chips){|idx|
85
- SpriteUnitFactory.create(:bitmap=>@baseimg.bitmap,
86
- :ox => (idx % @mapchip.size.w) * @ow, :oy => (idx / @mapchip.size.w) * @oh,
87
- :ow => @ow, :oh => @oh)
88
- }
89
- reSize
90
- end
91
-
92
- def get_div_array(s, t, v) #:nodoc:
93
- a = Array.new
94
- (s..t).each{|i| a.push(i / v)}
95
- return a
96
- end
97
-
98
- def get_mod_array(s, t, v) #:nodoc:
99
- a = Array.new
100
- (s..t).each{|i| a.push(i % v)}
101
- return a
102
- end
103
-
104
- def convert_position(x, y) #:nodoc:
105
- return Point.new(@modpx2[round(x, @size.w)],
106
- @modpy2[round(y, @size.h)])
107
- end
108
-
109
- #===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
110
- #但し、引数には、Rect(x,y,w,h)形式のインスタンスを渡す
111
- #_rect_:: キャラクタの矩形
112
- #返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
113
- def product_position(rect)
114
- return Utility.product_position(rect, @mapchip.chip_size)
115
- end
116
-
117
- #===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
118
- #但し、引数には、Square([x1,y1,x2,y2])形式のインスタンスを渡す
119
- #_square_:: キャラクタの矩形
120
- #返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
121
- def product_position_by_square(square)
122
- return Utility.product_position_by_square(square, @mapchip.chip_size)
123
- end
124
-
125
- #===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
126
- #イベントレイヤーでの番号はイベント番号と一致する
127
- #_x_:: マップチップ単位での位置(ピクセル単位)
128
- #_y_:: マップチップ単位での位置(ピクセル単位)
129
- #返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
130
- def get_code(x, y)
131
- pos = convert_position(x / @mapchip.chip_size[0], y / @mapchip.chip_size[1])
132
- return @mapdat[pos.y][pos.x]
133
- end
134
-
135
- #===キャラクタとマップチップが重なっているかどうか問い合わせる
136
- #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと重なっているかどうか問い合わせる
137
- #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
138
- #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
139
- #_type_:: 移動形式(0以上の整数)
140
- #_pos_:: 調査対象のマップチップの位置
141
- #_collision_:: キャラクタのコリジョン
142
- #_rect_:: キャラクタの矩形
143
- #返却値:: コリジョンが重なっていればtrueを返す
144
- def collision?(type, pos, collision, rect)
145
- code = get_code(*pos.to_a)
146
- return false if code == -1
147
- return @mapchip.collision_table[type][code].collision?(pos, collision, rect)
148
- end
149
-
150
- #===キャラクタとマップチップが隣り合っているかどうか問い合わせる
151
- #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと隣り合っているかどうか問い合わせる
152
- #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
153
- #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
154
- #_type_:: 移動形式(0以上の整数)
155
- #_pos_:: 調査対象のマップチップの位置
156
- #_collision_:: キャラクタのコリジョン
157
- #_rect_:: キャラクタの矩形
158
- #返却値:: コリジョンが隣り合っていればtrueを返す
159
- def meet?(type, pos, collision, rect)
160
- code = get_code(*pos.to_a)
161
- return false if code == -1
162
- return @mapchip.collision_table[type][code].meet?(pos, collision, rect)
163
- end
164
-
165
- #===キャラクタとマップチップが覆い被さっているかどうか問い合わせる
166
- #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンを覆い被さっているかどうか問い合わせる
167
- #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
168
- #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
169
- #_type_:: 移動形式(0以上の整数)
170
- #_pos_:: 調査対象のマップチップの位置
171
- #_collision_:: キャラクタのコリジョン
172
- #_rect_:: キャラクタの矩形
173
- #返却値:: どちらかのコリジョンが覆い被さっていればtrueを返す
174
- def cover?(type, pos, collision, rect)
175
- code = get_code(*pos.to_a)
176
- return false if code == -1
177
- return @mapchip.collision_table[type][code].cover?(pos, collision, rect)
178
- end
179
-
180
- #===キャラクタとマップチップが重なっているかどうか問い合わせる
181
- #指定の位置と方向で、指定の位置のマップチップ上で移動できるかどうか問い合わせる
182
- #指定の位置のマップチップ番号が-1(未定義)のとき、移動していない(dx==0 and dy==0)ときはtrueを返す
183
- #_type_:: 移動形式(0以上の整数)
184
- #_inout_:: 入退形式(:in もしくは :out)
185
- #_pos_:: 調査対象のマップチップの位置
186
- #_dx_:: 移動量(x座標)
187
- #_dy_:: 移動量(y座標)
188
- #返却値:: 移動可能ならばtrueを返す
189
- def can_access?(type, inout, pos, dx, dy)
190
- code = get_code(pos[0]+dx, pos[1]+dy)
191
- return true if code == -1
192
- index = AccessIndex.index2(inout, dx, dy)
193
- return true if index == -1
194
- return @mapchip.access_table[type][code][index]
195
- end
196
-
197
- def dispose #:nodoc:
198
- @mapdat = nil
199
- @baseimg = nil
200
- end
201
-
202
- #===マップレイヤーを画面に描画する
203
- #すべてのマップチップを画面に描画する
204
- #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
205
- #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
206
- #ブロックの引数は、|画面のSpriteUnit|となる。
207
- #visibleメソッドの値がfalseのときは描画されない。
208
- #返却値:: 自分自身を返す
209
- def render
210
- end
211
-
212
- #===マップを画像に描画する
213
- #すべてのマップチップを画像に描画する
214
- #各レイヤ-を、レイヤーインデックス番号の若い順に描画する
215
- #但し、マップイベントは描画しない
216
- #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
217
- #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
218
- #ブロックの引数は、|転送先のSpriteUnit|となる。
219
- #visibleメソッドの値がfalseのときは描画されない。
220
- #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
221
- #返却値:: 自分自身を返す
222
- def render_to(dst)
223
- end
224
-
225
- def_delegators(:@size, :w, :h)
226
- end
227
-
228
-
229
- #===インスタンスを生成する
230
- #各レイヤにMapChip構造体を渡す
231
- #但し、すべてのレイヤーに同一のMapChip構造体を使うときは、単体で渡すことも可能
232
- #第1引数にto_aメソッドが実装されていれば、配列化した要素をMapChip構造体として各レイヤに渡す
233
- #また、各レイヤにMapChip構造体を渡すとき、レイヤ数より要素数が少ないときは、
234
- #先頭に戻って繰り返し渡す仕様になっている
235
- #各MapChip構造体のマップチップの大きさを同じにしておく必要がある
236
- #_mapchips_:: マップチップ構造体群(MapChip構造体単体もしくは配列)
237
- #_layer_csv_:: レイヤーファイル(CSVファイル)
238
- #_event_manager_:: MapEventManagerクラスのインスタンス
239
- #返却値:: 生成したインスタンス
240
- def initialize(mapchips, layer_csv, event_manager)
241
- init_layout
242
- @visible = true
243
- @event_layers = []
244
- @em = event_manager.dup
245
- @em.set(self)
246
- @mapchips = mapchips.to_a
247
- layer_data = CSV.readlines(layer_csv)
248
-
249
- raise MiyakoError, "This file is not Miyako Map Layer file! : #{layer_csv}" unless layer_data.shift[0] == "Miyako Maplayer"
250
-
251
- tmp = layer_data.shift # 空行の空読み込み
252
-
253
- @size = Size.new(tmp[0].to_i, tmp[1].to_i)
254
- @w = @size.w * @mapchips.first.chip_size.w
255
- @h = @size.h * @mapchips.first.chip_size.h
256
-
257
- layers = layer_data.shift[0].to_i
258
-
259
- evlist = []
260
- brlist = []
261
- layers.times{|n|
262
- name = layer_data.shift[0]
263
- values = []
264
- @size.h.times{|y|
265
- values << layer_data.shift.map{|m| m.to_i}
266
- }
267
- if name == "<event>"
268
- evlist << values
269
- else
270
- brlist << values
271
- end
272
- }
273
-
274
- @event_layer = nil
275
-
276
- evlist.each{|events|
277
- event_layer = Array.new
278
- events.each_with_index{|ly, y|
279
- ly.each_with_index{|code, x|
280
- next unless @em.include?(code)
281
- event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
282
- }
283
- }
284
- @event_layers << event_layer
285
- }
286
-
287
- mc = @mapchips.cycle
288
- @mapchips = mc.take(layers)
289
- @map_layers = []
290
- brlist.each{|br|
291
- br = br.map{|b| b.map{|bb| bb >= @mapchips.first.chips ? -1 : bb } }
292
- @map_layers.push(FixedMapLayer.new(mc.next, br, @size))
293
- }
294
- set_layout_size(@w, @h)
295
- end
296
-
297
- #===マップにイベントを追加する
298
- #_idx_:: 追加するイベントレイヤの指標
299
- #_code_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
300
- #_x_:: マップ上の位置(x方向)
301
- #_y_:: マップ常温位置(y方向)
302
- #返却値:: 自分自身を返す
303
- def add_event(idx, code, x, y)
304
- return self unless @em.include?(code)
305
- @event_layers[idx].push(@em.create(code, x, y))
306
- return self
307
- end
308
-
309
- def update_layout_position #:nodoc:
310
- @map_layers.each{|ml| ml.pos.move_to(*@layout.pos) }
311
- end
312
-
313
- def [](idx) #:nodoc:
314
- return @map_layers[idx]
315
- end
316
-
317
- #===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
318
- #イベントレイヤーでの番号はイベント番号と一致する
319
- #ブロックを渡すと、求めたマップチップ番号をブロック引数として受け取る評価を行える
320
- #_idx_:: マップレイヤー配列のインデックス
321
- #_x_:: マップチップ単位での位置(ピクセル単位)
322
- #_y_:: マップチップ単位での位置(ピクセル単位)
323
- #返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
324
- def get_code(idx, x = 0, y = 0)
325
- code = @map_layers[idx].get_code(x, y)
326
- yield code if block_given?
327
- return code
328
- end
329
-
330
- #===対象のマップチップ番号の画像を置き換える
331
- #_idx_:: 置き換えるマップチップレイヤー番号
332
- #_code_:: 置き換えるマップチップ番号
333
- #_base_:: 置き換え対象の画像・アニメーション
334
- #返却値:: 自分自身を返す
335
- def set_mapchip_base(idx, code, base)
336
- @map_layers[idx].mapchip_units[code] = base
337
- return self
338
- end
339
-
340
- #===現在の画面の最大の大きさを矩形で取得する
341
- #但し、FixedMapの場合は最大の大きさ=画面の大きさなので、rectと同じ値が得られる
342
- #返却値:: 画像の大きさ(Rect構造体のインスタンス)
343
- def broad_rect
344
- return self.rect
345
- end
346
-
347
- #===スプライトに変換した画像を表示する
348
- #すべてのパーツを貼り付けた、1枚のスプライトを返す
349
- #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
350
- #返却値:: 描画したスプライト
351
- def to_sprite
352
- rect = self.broad_rect
353
- sprite = Sprite.new(:size=>rect.to_a[2,2], :type=>:ac)
354
- Drawing.fill(sprite, [0,0,0])
355
- Bitmap.ck_to_ac!(sprite, [0,0,0])
356
- self.render_to(sprite){|sunit, dunit| sunit.x -= rect.x; sunit.y -= rect.y }
357
- yield sprite if block_given?
358
- return sprite
359
- end
360
-
361
- #===SpriteUnit構造体を生成する
362
- #いったんSpriteインスタンスを作成し、それをもとにSpriteUnit構造体を生成する。
363
- #返却値:: 生成したSpriteUnit構造体
364
- def to_unit
365
- return self.to_sprite.to_unit
366
- end
367
-
368
- #===マップチップ1枚の大きさを取得する
369
- #マップチップの大きさが32×32ピクセルの場合は、[32,32]のSize構造体が返る
370
- #返却値:: マップチップのサイズ(Size構造体)
371
- def chipSize
372
- return @mapchips.first.chip_size
373
- end
374
-
375
- #===すべてのマップイベントを終了させる
376
- #マップに登録しているイベントすべてのfinalメソッドを呼び出す
377
- def final
378
- @event_layers.each{|ee| ee.each{|e| e.final }}
379
- end
380
-
381
- #===マップ情報を解放する
382
- def dispose
383
- @map_layers.each{|l|
384
- l.dispose
385
- l = nil
386
- }
387
- @map_layers = Array.new
388
-
389
- @event_layers.each{|ee|
390
- ee.each{|e| e.dispose }
391
- ee.clear
392
- }
393
- @event_layers.clear
394
-
395
- @mapchips.clear
396
- @mapchips = nil
397
- end
398
-
399
- #===マップに登録しているイベントインスタンス(マップイベント)を取得する
400
- #返却値:: マップイベントの配列
401
- def events
402
- return @event_layers
403
- end
404
-
405
- #===マップを画面に描画する
406
- #すべてのマップチップを画面に描画する
407
- #各レイヤ-を、レイヤーインデックス番号の若い順に描画する
408
- #但し、マップイベントは描画しない
409
- #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
410
- #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
411
- #ブロックの引数は、|画面のSpriteUnit|となる。
412
- #visibleメソッドの値がfalseのときは描画されない。
413
- #返却値:: 自分自身を返す
414
- def render
415
- end
416
-
417
- #===マップレイヤーを画像に転送する
418
- #すべてのマップチップを画像に描画する
419
- #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
420
- #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
421
- #ブロックの引数は、|転送先のSpriteUnit|となる。
422
- #visibleメソッドの値がfalseのときは描画されない。
423
- #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
424
- #返却値:: 自分自身を返す
425
- def render_to(dst)
426
- end
427
- end
428
- end
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ require 'csv'
24
+ require 'forwardable'
25
+
26
+ module Miyako
27
+ #==スクロールしないマップクラス
28
+ class FixedMap
29
+ include SpriteBase
30
+ include Animation
31
+ include Layout
32
+
33
+ @@idx_ix = [-1, 2, 4]
34
+ @@idx_iy = [-1, 0, 6]
35
+
36
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
37
+ attr_reader :name, :map_layers, :mapchips, :pos, :size, :w, :h
38
+
39
+ #==あとで書く
40
+ class FixedMapLayer #:nodoc: all
41
+ include SpriteBase
42
+ include Animation
43
+ extend Forwardable
44
+
45
+ @@use_chip_list = Hash.new(nil)
46
+
47
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
48
+ attr_accessor :mapchip, :mapchip_units
49
+ attr_reader :pos
50
+
51
+ def round(v, max) #:nodoc:
52
+ v = max + (v % max) if v < 0
53
+ v %= max if v >= max
54
+ return v
55
+ end
56
+
57
+ def reSize #:nodoc:
58
+ @cw = @real_size.w % @ow == 0 ? @real_size.w / @ow : (@real_size.w + @ow - 1)/ @ow + 1
59
+ @ch = @real_size.h % @oh == 0 ? @real_size.h / @oh : (@real_size.h + @oh - 1)/ @oh + 1
60
+ end
61
+
62
+ def initialize(mapchip, mapdat, layer_size) #:nodoc:
63
+ @mapchip = mapchip
64
+ @pos = Point.new(0, 0)
65
+ @size = layer_size.dup
66
+ @ow = @mapchip.chip_size.w
67
+ @oh = @mapchip.chip_size.h
68
+ @real_size = Size.new(@size.w * @ow, @size.h * @oh)
69
+ @mapdat = mapdat
70
+ @baseimg = nil
71
+ @baseimg = @mapchip.chip_image
72
+ @units = nil
73
+ @visible = true
74
+ @divpx = get_div_array(0, @real_size.w, @ow)
75
+ @divpy = get_div_array(0, @real_size.h, @oh)
76
+ @modpx = get_mod_array(0, @real_size.w, @ow)
77
+ @modpy = get_mod_array(0, @real_size.h, @oh)
78
+ @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
79
+ @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
80
+ @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
81
+ @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
82
+ @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
83
+ @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
84
+ @cdivsx = @cdivsx.map{|v| v * @ow }
85
+ @cdivsy = @cdivsy.map{|v| v * @oh }
86
+ @cmodsx = @cmodsx.map{|v| v * @ow }
87
+ @cmodsy = @cmodsy.map{|v| v * @oh }
88
+ @mapchip_units = Array.new(@mapchip.chips){|idx|
89
+ SpriteUnitFactory.create(:bitmap=>@baseimg.bitmap,
90
+ :ox => (idx % @mapchip.size.w) * @ow, :oy => (idx / @mapchip.size.w) * @oh,
91
+ :ow => @ow, :oh => @oh)
92
+ }
93
+ reSize
94
+ end
95
+
96
+ def initialize_copy(obj) #:nodoc:
97
+ @mapchip = @mapchip.dup
98
+ @size = @size.dup
99
+ @mapchip_unit = @mapchip_unit.dup
100
+ @divpx = get_div_array(0, @real_size.w, @ow)
101
+ @divpy = get_div_array(0, @real_size.h, @oh)
102
+ @modpx = get_mod_array(0, @real_size.w, @ow)
103
+ @modpy = get_mod_array(0, @real_size.h, @oh)
104
+ @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
105
+ @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
106
+ @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
107
+ @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
108
+ @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
109
+ @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
110
+ @cdivsx = @cdivsx.map{|v| v * @ow }
111
+ @cdivsy = @cdivsy.map{|v| v * @oh }
112
+ @cmodsx = @cmodsx.map{|v| v * @ow }
113
+ @cmodsy = @cmodsy.map{|v| v * @oh }
114
+ end
115
+
116
+ def get_div_array(s, t, v) #:nodoc:
117
+ a = Array.new
118
+ (s..t).each{|i| a.push(i / v)}
119
+ return a
120
+ end
121
+
122
+ def get_mod_array(s, t, v) #:nodoc:
123
+ a = Array.new
124
+ (s..t).each{|i| a.push(i % v)}
125
+ return a
126
+ end
127
+
128
+ def convert_position(x, y) #:nodoc:
129
+ return Point.new(@modpx2[round(x, @size.w)],
130
+ @modpy2[round(y, @size.h)])
131
+ end
132
+
133
+ #===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
134
+ #但し、引数には、Rect(x,y,w,h)形式のインスタンスを渡す
135
+ #_rect_:: キャラクタの矩形
136
+ #返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
137
+ def product_position(rect)
138
+ return Utility.product_position(rect, @mapchip.chip_size)
139
+ end
140
+
141
+ #===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
142
+ #但し、引数には、Square([x1,y1,x2,y2])形式のインスタンスを渡す
143
+ #_square_:: キャラクタの矩形
144
+ #返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
145
+ def product_position_by_square(square)
146
+ return Utility.product_position_by_square(square, @mapchip.chip_size)
147
+ end
148
+
149
+ #===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
150
+ #イベントレイヤーでの番号はイベント番号と一致する
151
+ #_x_:: マップチップ単位での位置(ピクセル単位)
152
+ #_y_:: マップチップ単位での位置(ピクセル単位)
153
+ #返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
154
+ def get_code(x, y)
155
+ pos = convert_position(x / @mapchip.chip_size[0], y / @mapchip.chip_size[1])
156
+ return @mapdat[pos.y][pos.x]
157
+ end
158
+
159
+ #===キャラクタとマップチップが重なっているかどうか問い合わせる
160
+ #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと重なっているかどうか問い合わせる
161
+ #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
162
+ #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
163
+ #_type_:: 移動形式(0以上の整数)
164
+ #_pos_:: 調査対象のマップチップの位置
165
+ #_collision_:: キャラクタのコリジョン
166
+ #_rect_:: キャラクタの矩形
167
+ #返却値:: コリジョンが重なっていればtrueを返す
168
+ def collision?(type, pos, collision, rect)
169
+ code = get_code(*pos.to_a)
170
+ return false if code == -1
171
+ return @mapchip.collision_table[type][code].collision?(pos, collision, rect)
172
+ end
173
+
174
+ #===キャラクタとマップチップが隣り合っているかどうか問い合わせる
175
+ #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと隣り合っているかどうか問い合わせる
176
+ #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
177
+ #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
178
+ #_type_:: 移動形式(0以上の整数)
179
+ #_pos_:: 調査対象のマップチップの位置
180
+ #_collision_:: キャラクタのコリジョン
181
+ #_rect_:: キャラクタの矩形
182
+ #返却値:: コリジョンが隣り合っていればtrueを返す
183
+ def meet?(type, pos, collision, rect)
184
+ code = get_code(*pos.to_a)
185
+ return false if code == -1
186
+ return @mapchip.collision_table[type][code].meet?(pos, collision, rect)
187
+ end
188
+
189
+ #===キャラクタとマップチップが覆い被さっているかどうか問い合わせる
190
+ #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンを覆い被さっているかどうか問い合わせる
191
+ #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
192
+ #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
193
+ #_type_:: 移動形式(0以上の整数)
194
+ #_pos_:: 調査対象のマップチップの位置
195
+ #_collision_:: キャラクタのコリジョン
196
+ #_rect_:: キャラクタの矩形
197
+ #返却値:: どちらかのコリジョンが覆い被さっていればtrueを返す
198
+ def cover?(type, pos, collision, rect)
199
+ code = get_code(*pos.to_a)
200
+ return false if code == -1
201
+ return @mapchip.collision_table[type][code].cover?(pos, collision, rect)
202
+ end
203
+
204
+ #===キャラクタとマップチップが重なっているかどうか問い合わせる
205
+ #指定の位置と方向で、指定の位置のマップチップ上で移動できるかどうか問い合わせる
206
+ #指定の位置のマップチップ番号が-1(未定義)のとき、移動していない(dx==0 and dy==0)ときはtrueを返す
207
+ #_type_:: 移動形式(0以上の整数)
208
+ #_inout_:: 入退形式(:in もしくは :out)
209
+ #_pos_:: 調査対象のマップチップの位置
210
+ #_dx_:: 移動量(x座標)
211
+ #_dy_:: 移動量(y座標)
212
+ #返却値:: 移動可能ならばtrueを返す
213
+ def can_access?(type, inout, pos, dx, dy)
214
+ code = get_code(pos[0]+dx, pos[1]+dy)
215
+ return true if code == -1
216
+ index = AccessIndex.index2(inout, dx, dy)
217
+ return true if index == -1
218
+ return @mapchip.access_table[type][code][index]
219
+ end
220
+
221
+ def dispose #:nodoc:
222
+ @mapdat = nil
223
+ @baseimg = nil
224
+ end
225
+
226
+ #===マップレイヤーを画面に描画する
227
+ #すべてのマップチップを画面に描画する
228
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
229
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
230
+ #ブロックの引数は、|画面のSpriteUnit|となる。
231
+ #visibleメソッドの値がfalseのときは描画されない。
232
+ #返却値:: 自分自身を返す
233
+ def render
234
+ end
235
+
236
+ #===マップを画像に描画する
237
+ #すべてのマップチップを画像に描画する
238
+ #各レイヤ-を、レイヤーインデックス番号の若い順に描画する
239
+ #但し、マップイベントは描画しない
240
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
241
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
242
+ #ブロックの引数は、|転送先のSpriteUnit|となる。
243
+ #visibleメソッドの値がfalseのときは描画されない。
244
+ #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
245
+ #返却値:: 自分自身を返す
246
+ def render_to(dst)
247
+ end
248
+
249
+ def_delegators(:@size, :w, :h)
250
+ end
251
+
252
+
253
+ #===インスタンスを生成する
254
+ #各レイヤにMapChip構造体を渡す
255
+ #但し、すべてのレイヤーに同一のMapChip構造体を使うときは、単体で渡すことも可能
256
+ #第1引数にto_aメソッドが実装されていれば、配列化した要素をMapChip構造体として各レイヤに渡す
257
+ #また、各レイヤにMapChip構造体を渡すとき、レイヤ数より要素数が少ないときは、
258
+ #先頭に戻って繰り返し渡す仕様になっている
259
+ #各MapChip構造体のマップチップの大きさを同じにしておく必要がある
260
+ #_mapchips_:: マップチップ構造体群(MapChip構造体単体もしくは配列)
261
+ #_layer_csv_:: レイヤーファイル(CSVファイル)
262
+ #_event_manager_:: MapEventManagerクラスのインスタンス
263
+ #返却値:: 生成したインスタンス
264
+ def initialize(mapchips, layer_csv, event_manager)
265
+ raise MiyakoIOError.no_file(layer_csv) unless File.exist?(layer_csv)
266
+ init_layout
267
+ @visible = true
268
+ @event_layers = []
269
+ @em = event_manager.dup
270
+ @em.set(self)
271
+ @mapchips = mapchips.to_a
272
+ layer_data = CSV.readlines(layer_csv)
273
+
274
+ raise MiyakoFileFormatError, "This file is not Miyako Map Layer file! : #{layer_csv}" unless layer_data.shift[0] == "Miyako Maplayer"
275
+
276
+ tmp = layer_data.shift # 空行の空読み込み
277
+
278
+ @size = Size.new(tmp[0].to_i, tmp[1].to_i)
279
+ @w = @size.w * @mapchips.first.chip_size.w
280
+ @h = @size.h * @mapchips.first.chip_size.h
281
+
282
+ layers = layer_data.shift[0].to_i
283
+
284
+ evlist = []
285
+ brlist = []
286
+ layers.times{|n|
287
+ name = layer_data.shift[0]
288
+ values = []
289
+ @size.h.times{|y|
290
+ values << layer_data.shift.map{|m| m.to_i}
291
+ }
292
+ if name == "<event>"
293
+ evlist << values
294
+ else
295
+ brlist << values
296
+ end
297
+ }
298
+
299
+ @event_layer = nil
300
+
301
+ evlist.each{|events|
302
+ event_layer = Array.new
303
+ events.each_with_index{|ly, y|
304
+ ly.each_with_index{|code, x|
305
+ next unless @em.include?(code)
306
+ event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
307
+ }
308
+ }
309
+ @event_layers << event_layer
310
+ }
311
+
312
+ mc = @mapchips.cycle
313
+ @mapchips = mc.take(layers)
314
+ @map_layers = []
315
+ brlist.each{|br|
316
+ br = br.map{|b| b.map{|bb| bb >= @mapchips.first.chips ? -1 : bb } }
317
+ @map_layers.push(FixedMapLayer.new(mc.next, br, @size))
318
+ }
319
+ set_layout_size(@w, @h)
320
+ end
321
+
322
+ def initialize_copy(obj) #:nodoc:
323
+ @map_layers = @map_layers.dup
324
+ @event_layers = @event_layers.dup
325
+ @em = em.dup
326
+ @mapchips = @mapchips.dup
327
+ @size = @size.dup
328
+ copy_layout
329
+ end
330
+
331
+ #===マップにイベントを追加する
332
+ #_idx_:: 追加するイベントレイヤの指標
333
+ #_code_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
334
+ #_x_:: マップ上の位置(x方向)
335
+ #_y_:: マップ常温位置(y方向)
336
+ #返却値:: 自分自身を返す
337
+ def add_event(idx, code, x, y)
338
+ return self unless @em.include?(code)
339
+ @event_layers[idx].push(@em.create(code, x, y))
340
+ return self
341
+ end
342
+
343
+ def update_layout_position #:nodoc:
344
+ @map_layers.each{|ml| ml.pos.move_to!(*@layout.pos) }
345
+ end
346
+
347
+ def [](idx) #:nodoc:
348
+ return @map_layers[idx]
349
+ end
350
+
351
+ #===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
352
+ #イベントレイヤーでの番号はイベント番号と一致する
353
+ #ブロックを渡すと、求めたマップチップ番号をブロック引数として受け取る評価を行える
354
+ #_idx_:: マップレイヤー配列のインデックス
355
+ #_x_:: マップチップ単位での位置(ピクセル単位)
356
+ #_y_:: マップチップ単位での位置(ピクセル単位)
357
+ #返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
358
+ def get_code(idx, x = 0, y = 0)
359
+ code = @map_layers[idx].get_code(x, y)
360
+ yield code if block_given?
361
+ return code
362
+ end
363
+
364
+ #===対象のマップチップ番号の画像を置き換える
365
+ #_idx_:: 置き換えるマップチップレイヤー番号
366
+ #_code_:: 置き換えるマップチップ番号
367
+ #_base_:: 置き換え対象の画像・アニメーション
368
+ #返却値:: 自分自身を返す
369
+ def set_mapchip_base(idx, code, base)
370
+ @map_layers[idx].mapchip_units[code] = base
371
+ return self
372
+ end
373
+
374
+ #===現在の画面の最大の大きさを矩形で取得する
375
+ #但し、FixedMapの場合は最大の大きさ=画面の大きさなので、rectと同じ値が得られる
376
+ #返却値:: 画像の大きさ(Rect構造体のインスタンス)
377
+ def broad_rect
378
+ return self.rect
379
+ end
380
+
381
+ #===スプライトに変換した画像を表示する
382
+ #すべてのパーツを貼り付けた、1枚のスプライトを返す
383
+ #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
384
+ #返却値:: 描画したスプライト
385
+ def to_sprite
386
+ rect = self.broad_rect
387
+ sprite = Sprite.new(:size=>rect.to_a[2,2], :type=>:ac)
388
+ Drawing.fill(sprite, [0,0,0])
389
+ Bitmap.ck_to_ac!(sprite, [0,0,0])
390
+ self.render_to(sprite){|sunit, dunit| sunit.x -= rect.x; sunit.y -= rect.y }
391
+ yield sprite if block_given?
392
+ return sprite
393
+ end
394
+
395
+ #===SpriteUnit構造体を生成する
396
+ #いったんSpriteインスタンスを作成し、それをもとにSpriteUnit構造体を生成する。
397
+ #返却値:: 生成したSpriteUnit構造体
398
+ def to_unit
399
+ return self.to_sprite.to_unit
400
+ end
401
+
402
+ #===マップチップ1枚の大きさを取得する
403
+ #マップチップの大きさが32×32ピクセルの場合は、[32,32]のSize構造体が返る
404
+ #返却値:: マップチップのサイズ(Size構造体)
405
+ def chipSize
406
+ return @mapchips.first.chip_size
407
+ end
408
+
409
+ #===すべてのマップイベントを終了させる
410
+ #マップに登録しているイベントすべてのfinalメソッドを呼び出す
411
+ def final
412
+ @event_layers.each{|ee| ee.each{|e| e.final }}
413
+ end
414
+
415
+ #===マップ情報を解放する
416
+ def dispose
417
+ @map_layers.each{|l|
418
+ l.dispose
419
+ l = nil
420
+ }
421
+ @map_layers = Array.new
422
+
423
+ @event_layers.each{|ee|
424
+ ee.each{|e| e.dispose }
425
+ ee.clear
426
+ }
427
+ @event_layers.clear
428
+
429
+ @mapchips.clear
430
+ @mapchips = nil
431
+ end
432
+
433
+ #===マップに登録しているイベントインスタンス(マップイベント)を取得する
434
+ #返却値:: マップイベントの配列
435
+ def events
436
+ return @event_layers
437
+ end
438
+
439
+ #===マップを画面に描画する
440
+ #すべてのマップチップを画面に描画する
441
+ #各レイヤ-を、レイヤーインデックス番号の若い順に描画する
442
+ #但し、マップイベントは描画しない
443
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
444
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
445
+ #ブロックの引数は、|画面のSpriteUnit|となる。
446
+ #visibleメソッドの値がfalseのときは描画されない。
447
+ #返却値:: 自分自身を返す
448
+ def render
449
+ end
450
+
451
+ #===マップレイヤーを画像に転送する
452
+ #すべてのマップチップを画像に描画する
453
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
454
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
455
+ #ブロックの引数は、|転送先のSpriteUnit|となる。
456
+ #visibleメソッドの値がfalseのときは描画されない。
457
+ #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
458
+ #返却値:: 自分自身を返す
459
+ def render_to(dst)
460
+ end
461
+ end
462
+ end