cyross-ruby-miyako 2.0.0 → 2.0.5.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 (102) hide show
  1. data/README +106 -154
  2. data/defines.h +144 -0
  3. data/{miyako_no_katana/extconf.rb → extconf.rb} +10 -0
  4. data/extern.h +29 -0
  5. data/install_miyako.rb +26 -14
  6. data/lib/Miyako/API/audio.rb +2 -2
  7. data/lib/Miyako/API/basic_data.rb +183 -41
  8. data/lib/Miyako/API/bitmap.rb +474 -2
  9. data/lib/Miyako/API/choices.rb +215 -48
  10. data/lib/Miyako/API/collision.rb +267 -251
  11. data/lib/Miyako/API/diagram.rb +58 -70
  12. data/lib/Miyako/API/drawing.rb +93 -52
  13. data/lib/Miyako/API/fixedmap.rb +233 -120
  14. data/lib/Miyako/API/font.rb +59 -40
  15. data/lib/Miyako/API/input.rb +34 -27
  16. data/lib/Miyako/API/layout.rb +154 -172
  17. data/lib/Miyako/API/map.rb +285 -159
  18. data/lib/Miyako/API/map_event.rb +4 -4
  19. data/lib/Miyako/API/modules.rb +1 -1
  20. data/lib/Miyako/API/movie.rb +8 -5
  21. data/lib/Miyako/API/parts.rb +44 -9
  22. data/lib/Miyako/API/plane.rb +37 -2
  23. data/lib/Miyako/API/screen.rb +90 -22
  24. data/lib/Miyako/API/shape.rb +118 -37
  25. data/lib/Miyako/API/sprite.rb +475 -61
  26. data/lib/Miyako/API/sprite_animation.rb +83 -63
  27. data/lib/Miyako/API/spriteunit.rb +47 -13
  28. data/lib/Miyako/API/story.rb +123 -47
  29. data/lib/Miyako/API/textbox.rb +361 -132
  30. data/lib/Miyako/API/utility.rb +388 -0
  31. data/lib/Miyako/API/viewport.rb +54 -349
  32. data/lib/Miyako/API/yuki.rb +570 -353
  33. data/lib/Miyako/EXT/miyako_cairo.rb +5 -3
  34. data/lib/Miyako/EXT/slides.rb +22 -1
  35. data/lib/Miyako/miyako.rb +12 -13
  36. data/logo/EGSR_logo.png +0 -0
  37. data/logo/EGSR_logo_bg.png +0 -0
  38. data/logo/EGSR_logo_fg.png +0 -0
  39. data/logo/EGSR_title_banner.png +0 -0
  40. data/logo/EGSR_title_logo.png +0 -0
  41. data/logo/miyako.png +0 -0
  42. data/logo/miyako_banner.png +0 -0
  43. data/logo/space.png +0 -0
  44. data/miyako_basicdata.c +590 -0
  45. data/miyako_bitmap.c +1225 -0
  46. data/miyako_collision.c +403 -0
  47. data/miyako_drawing.c +187 -0
  48. data/miyako_font.c +334 -0
  49. data/miyako_hsv.c +830 -0
  50. data/miyako_layout.c +191 -0
  51. data/miyako_no_katana.c +1074 -0
  52. data/miyako_transform.c +438 -0
  53. data/miyako_utility.c +288 -0
  54. data/sample/Animation1/m1ku.rb +10 -31
  55. data/sample/Animation1/readme.txt +6 -6
  56. data/sample/Animation2/lex.rb +1 -0
  57. data/sample/Animation2/readme.txt +6 -6
  58. data/sample/Diagram_sample/diagram_sample_yuki2.rb +152 -48
  59. data/sample/Diagram_sample/readme.txt +9 -6
  60. data/sample/Room3/blue.rb +234 -187
  61. data/sample/Room3/ending.rb +68 -63
  62. data/sample/Room3/green.rb +159 -124
  63. data/sample/Room3/main.rb +50 -32
  64. data/sample/Room3/main_component.rb +3 -2
  65. data/sample/Room3/readme.txt +6 -6
  66. data/sample/Room3/red.rb +161 -134
  67. data/sample/Room3/room3.rb +1 -0
  68. data/sample/Room3/title.rb +75 -62
  69. data/sample/ball_action_sample.rb +204 -0
  70. data/sample/blit_rop.rb +70 -0
  71. data/sample/cairo_sample.rb +25 -0
  72. data/sample/circle_collision_test.rb +66 -0
  73. data/sample/collision_test.rb +33 -0
  74. data/sample/collision_test2.rb +108 -0
  75. data/sample/fixed_map_test/fixed_map_sample.rb +23 -32
  76. data/sample/fixed_map_test/readme.txt +38 -38
  77. data/sample/map_test/chara.rb +17 -9
  78. data/sample/map_test/main_parts.rb +30 -9
  79. data/sample/map_test/main_scene.rb +57 -41
  80. data/sample/map_test/map_manager.rb +13 -30
  81. data/sample/map_test/map_test.rb +2 -2
  82. data/sample/map_test/oasis.rb +17 -11
  83. data/sample/map_test/readme.txt +50 -48
  84. data/sample/map_test/route.rb +46 -33
  85. data/sample/map_test/town.rb +19 -13
  86. data/sample/polygon_test.rb +35 -0
  87. data/sample/rasterscroll.rb +25 -0
  88. data/sample/takahashi.rb +42 -0
  89. data/sample/text.png +0 -0
  90. data/sample/textbox_sample.rb +190 -0
  91. data/sample/transform.rb +54 -0
  92. data/sample/utility_test.rb +73 -0
  93. data/sample/utility_test2.rb +61 -0
  94. data/sample/utility_test3.rb +64 -0
  95. data/sample/utility_test4.rb +73 -0
  96. data/uninstall_miyako.rb +19 -0
  97. data/win/miyako_no_katana.so +0 -0
  98. metadata +165 -148
  99. data/miyako.png +0 -0
  100. data/miyako_banner.png +0 -0
  101. data/miyako_no_katana/miyako_no_katana.c +0 -3301
  102. data/sample/fixed_map_test/map_sample.rb +0 -121
@@ -2,7 +2,7 @@
2
2
  =begin
3
3
  --
4
4
  Miyako v1.5
5
- Copyright (C) 2007-2008 Cyross Makoto
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
6
 
7
7
  This library is free software; you can redistribute it and/or
8
8
  modify it under the terms of the GNU Lesser General Public
@@ -29,6 +29,8 @@ module Miyako
29
29
  include Layout
30
30
  include SingleEnumerable
31
31
 
32
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
33
+
32
34
  #===インスタンスの作成
33
35
  #アニメーションを行うための初期設定を行う。
34
36
  #アニメーションは2種類の方法があり、
@@ -89,6 +91,7 @@ module Miyako
89
91
 
90
92
  @slist = Array.new
91
93
  if s.kind_of?(Sprite)
94
+ @now = s.to_unit unless @now
92
95
  set_layout_size(s.ow, s.oh)
93
96
  move_to(s.x, s.y)
94
97
  s.snap(self)
@@ -101,6 +104,7 @@ module Miyako
101
104
  @pats = @pat_len / @pat_olen
102
105
  elsif s.kind_of?(Array)
103
106
  first = s[0]
107
+ @now = first.to_unit unless @now
104
108
  set_layout_size(first.ow, first.oh)
105
109
  move_to(first.x, first.y)
106
110
  @slist = s.map{|ss|
@@ -163,11 +167,7 @@ module Miyako
163
167
  if @slist.length == 0
164
168
  @slist = Array.new(@pats){|pat| s }
165
169
  @units = Array.new(@pats){|pat|
166
- u = SpriteUnitFactory.create(:bitmap=>@slist[pat].bitmap,
167
- :ox => @slist[pat].ox,
168
- :oy => @slist[pat].oy,
169
- :ow => @slist[pat].ow,
170
- :oh => @slist[pat].oh)
170
+ u = @slist[pat].to_unit.dup
171
171
  px = pat % (@pat_len / @pat_olen)
172
172
  if @dir == :h
173
173
  u.oy = @slist[pat].oh * @plist[px]
@@ -179,21 +179,9 @@ module Miyako
179
179
  elsif @slist.length < @pats
180
180
  tmp = @slist
181
181
  @slist = @slist.cycle.take(@pats)
182
- @units = Array.new(@pats){|pat|
183
- SpriteUnitFactory.create(:bitmap=>@slist[pat].bitmap,
184
- :ox => @slist[pat].ox,
185
- :oy => @slist[pat].oy,
186
- :ow => @slist[pat].ow,
187
- :oh => @slist[pat].oh)
188
- }
182
+ @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
189
183
  else
190
- @units = Array.new(@pats){|pat|
191
- SpriteUnitFactory.create(:bitmap=>@slist[p].bitmap,
192
- :ox => @slist[p].ox,
193
- :oy => @slist[p].oy,
194
- :ow => @slist[p].ow,
195
- :oh => @slist[p].oh)
196
- }
184
+ @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
197
185
  end
198
186
 
199
187
  if @move_offset.length == 0
@@ -226,7 +214,7 @@ module Miyako
226
214
  @pnum = 0
227
215
  @cnt = 0
228
216
  @exec = false
229
- @visible = false
217
+ @visible = true
230
218
 
231
219
  @now = @units[0]
232
220
  @now.move_to(@slist[@plist[@pnum]].x + @move_offset[@pnum][0],
@@ -234,9 +222,33 @@ module Miyako
234
222
  end
235
223
 
236
224
  attr_accessor :visible
225
+
226
+ #=== 現在表示しているスプライトの x 座標の値を取得する
227
+ #返却値:: x 座標の値
228
+ def x
229
+ return @now.x
230
+ end
231
+
232
+ #=== 現在表示しているスプライトの y 座標の値を取得する
233
+ #返却値:: y 座標の値
234
+ def y
235
+ return @now.y
236
+ end
237
+
238
+ #=== 現在表示しているスプライトの幅を取得する
239
+ #返却値:: 現在表示しているスプライトの幅(ピクセル単位)
240
+ def w
241
+ return @now.ow
242
+ end
243
+
244
+ #=== 現在表示しているスプライトの高さを取得する
245
+ #返却値:: 現在表示しているスプライトの高さ(ピクセル単位)
246
+ def h
247
+ return @now.oh
248
+ end
237
249
 
238
250
  def update_layout_position #:nodoc:
239
- @now.move_to(*@layout.pos) if @now
251
+ @units.each{|u| u.move_to(*@layout.pos)}
240
252
  end
241
253
 
242
254
  #===現在表示しているスプライトのowを取得する
@@ -253,8 +265,7 @@ module Miyako
253
265
 
254
266
  #===表示するパターンの番号を変更する
255
267
  #_pnum_:: パターン番号
256
- #返却値:: 自分自身
257
- def pattern(pnum)
268
+ def pattern=(pnum)
258
269
  @pnum = pnum if pnum < @pats
259
270
  set_pat
260
271
  @cnt = @waits[@plist[@pnum]] if @exec
@@ -263,18 +274,18 @@ module Miyako
263
274
 
264
275
  #===現在表示しているパターンを取得する
265
276
  #返却値:: 現在表示しているスプライトのインスタンス
266
- def get_pattern
277
+ def pattern
267
278
  return @plist[@pnum]
268
279
  end
269
280
 
270
- #===あとで書く
271
- #_cnum_:: あとで書く
272
- #返却値:: あとで書く
273
- def character(cnum)
274
- return self if cnum >= @chrs
281
+ #===キャラクター番号を設定する
282
+ #キャラクター番号(アニメーションさせるときに表示させるパターン群インデックス)
283
+ #を設定する。範囲外のキャラクター番号が設定された時は何も行わない
284
+ #_cnum_:: キャラクター番号
285
+ def character=(cnum)
286
+ return self if (cnum < 0 || cnum >= @chrs)
275
287
  @cnum = cnum
276
288
  set_chr
277
- return self
278
289
  end
279
290
 
280
291
  #===あとで書く
@@ -287,7 +298,9 @@ module Miyako
287
298
  return self
288
299
  end
289
300
 
290
- def get_character #:nodoc:
301
+ #===現在のキャラクター番号を取得する
302
+ #返却値:: キャラクター番号(0以上の整数)
303
+ def character
291
304
  return @cnum
292
305
  end
293
306
 
@@ -297,8 +310,6 @@ module Miyako
297
310
  def start
298
311
  return self if @exec
299
312
  set_pat
300
- @now.move_to(@slist[@plist[@pnum]].x + @move_offset[@pnum][0],
301
- @slist[@plist[@pnum]].y + @move_offset[@pnum][1])
302
313
  if @dir == :h
303
314
  @now.oy += @pos_offset[@pnum]
304
315
  else
@@ -342,26 +353,6 @@ module Miyako
342
353
  #但し、インスタンス生成時に:loop->falseを設定していれば、アニメーションを終了する
343
354
  #返却値:: アニメーションパターンが切り替わればtrue、切り替わらないとき、アニメーションが終了したときはfalseを返す
344
355
  def update_animation
345
- is_change = false
346
- return is_change unless @exec
347
- if @dir == :h
348
- @now.oy -= @pos_offset[@pnum]
349
- else
350
- @now.ox -= @pos_offset[@pnum]
351
- end
352
- if @cnt.kind_of?(Integer)
353
- is_change = update_frame
354
- else
355
- is_change = update_wait_counter
356
- end
357
- @now.move_to(@slist[@plist[@pnum]].x + @move_offset[@pnum][0],
358
- @slist[@plist[@pnum]].y + @move_offset[@pnum][1])
359
- if @dir == :h
360
- @now.oy += @pos_offset[@pnum]
361
- else
362
- @now.ox += @pos_offset[@pnum]
363
- end
364
- return is_change
365
356
  end
366
357
 
367
358
  def update_frame #:nodoc:
@@ -420,26 +411,34 @@ module Miyako
420
411
  return @exec
421
412
  end
422
413
 
423
- # 現在実行中のパターンの元になったスプライトユニットを返す
424
- # 返却値:: 現在表示しているスプライトユニット
414
+ #===現在実行中のパターンの元になったスプライトユニットを返す
415
+ #得られるインスタンスは複写していないので、インスタンスの値を調整するには、dupメソッドで複製する必要がある
416
+ #返却値:: 現在表示しているスプライトユニット
425
417
  def to_unit
426
- return @now.dup
418
+ return @now
427
419
  end
428
420
 
429
- # 現在実行中のパターンの画像を返す
430
- # 返却値:: 現在表示している画像(bitmap)
421
+ #=== 現在実行中のパターンの画像を返す
422
+ #返却値:: 現在表示している画像(bitmap)
431
423
  def bitmap
432
424
  return @now.bitmap
433
425
  end
434
426
 
435
427
  #===現在実行中のパターンの元になったインスタンスを返す
436
428
  #取得するパターンは、元になったインスタンスのto_spriteメソッドを呼び出した時の値となる
437
- # 返却値:: 現在表示しているスプライト
438
- def to_sprite
439
- return @slist[@plist[@pnum]].to_sprite
429
+ #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
430
+ #返却値:: 現在表示しているスプライト
431
+ def to_sprite(&block)
432
+ return @slist[@plist[@pnum]].to_sprite(&block)
440
433
  end
441
434
 
442
- #===現在の画面の最大の大きさを矩形で取得する
435
+ #===現在表示しているスプライトの大きさを矩形で取得する
436
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
437
+ def rect
438
+ return Rect.new(@now.x, @now.y, @now.ow, @now.oh)
439
+ end
440
+
441
+ #===現在表示しているスプライトの最大の大きさを矩形で取得する
443
442
  #現在のパターンの大きさと同じため、rectメソッドの値と同一となる
444
443
  #返却値:: 生成された矩形(Rect構造体のインスタンス)
445
444
  def broad_rect
@@ -456,6 +455,27 @@ module Miyako
456
455
  @move_offset.clear
457
456
  @pos_offset.clear
458
457
  end
458
+
459
+ #===アニメーションの現在の画像を画面に描画する
460
+ #転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。
461
+ #画面の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。
462
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
463
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
464
+ #ブロックの引数は、|インスタンスのSpriteUnit|となる。
465
+ #visibleメソッドの値がfalseのときは描画されない。
466
+ def render
467
+ end
468
+
469
+ #===アニメーションの現在の画像を画像に描画する
470
+ #転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。
471
+ #転送先の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。
472
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
473
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
474
+ #ブロックの引数は、|インスタンスのSpriteUnit,転送先のSpriteUnit|となる。
475
+ #visibleメソッドの値がfalseのときは描画されない。
476
+ #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
477
+ def render_to(dst)
478
+ end
459
479
  end
460
480
  end
461
481
 
@@ -2,7 +2,7 @@
2
2
  =begin
3
3
  --
4
4
  Miyako v2.0
5
- Copyright (C) 2007-2008 Cyross Makoto
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
6
 
7
7
  This library is free software; you can redistribute it and/or
8
8
  modify it under the terms of the GNU Lesser General Public
@@ -25,35 +25,63 @@ module Miyako
25
25
  #==SpriteUnitを生成するための構造体クラス
26
26
  #Structクラスからの継承
27
27
  #--
28
- #SpriteUnit = Struct.new([:dp], :bitmap, :ox, :oy, :ow, :oh, :x, :y, :dx, :dy, [:effect], [:viewport], :angle, :xscale, :yscale, :px, :py, :qx, :qy)
28
+ #SpriteUnit = Struct.new(:bitmap, :ox, :oy, :ow, :oh, :x, :y, :cx, :cy)
29
29
  #++
30
30
  class SpriteUnitBase < Struct
31
31
  #===位置を変更する(変化量を指定)
32
+ #位置を右方向へdxピクセル、下方向へdyピクセル移動する
33
+ #ブロックを渡すと、ブロック評価中の位置を変更する
32
34
  #_dx_:: 移動量(x方向)。単位はピクセル
33
35
  #_dy_:: 移動量(y方向)。単位はピクセル
34
36
  #返却値:: 自分自身を返す
35
37
  def move(dx, dy)
38
+ o = [self.x, self.y]
36
39
  self.x+=dx
37
40
  self.y+=dy
41
+ if block_given?
42
+ yield
43
+ self.x, self.y = o
44
+ end
38
45
  return self
39
46
  end
40
47
 
41
48
  #===位置を変更する(位置指定)
49
+ #左上を(0.0)として、位置を右xピクセル、下yピクセルの位置移動する
50
+ #ブロックを渡すと、ブロック評価中の位置を変更する
42
51
  #_x_:: 移動先位置(x方向)。単位はピクセル
43
52
  #_y_:: 移動先位置(y方向)。単位はピクセル
44
53
  #返却値:: 自分自身を返す
45
54
  def move_to(x, y)
55
+ o = [self.x, self.y]
46
56
  self.x=x
47
57
  self.y=y
58
+ if block_given?
59
+ yield
60
+ self.x, self.y = o
61
+ end
48
62
  return self
49
63
  end
64
+ #また、ブロックを渡せば、複製したインスタンスに補正を欠けることが出来る(画像変換も可能)
50
65
 
51
66
  #===自分自身を返す
52
67
  #SpriteUnit対応
53
68
  #ダックタイピング用のメソッド
54
- #返却値:: 自分自身(複製して返す)
69
+ #得られるインスタンスは複写していないので、インスタンスの値を調整するには、dupメソッドで複製する必要がある
70
+ #返却値:: 自分自身
55
71
  def to_unit
56
- return self.dup
72
+ return self
73
+ end
74
+
75
+ #===スプライトを生成して返す
76
+ #ダックタイピング用のメソッド
77
+ #所持しているSpriteUnitから、Spriteクラスのインスタンスを生成する
78
+ #但し、bitmapの設定は:type=>:alpha_channelのみ
79
+ #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
80
+ #返却値:: 生成したスプライト
81
+ def to_sprite
82
+ sprite = Sprite.new(:unit=>self, :type=>:ac)
83
+ yield sprite if block_given?
84
+ return sprite
57
85
  end
58
86
 
59
87
  #===画像の表示矩形を取得する
@@ -74,7 +102,7 @@ module Miyako
74
102
  #==スプライト出力情報構造体
75
103
  #基本的なことは、Sprite.renderで行うことが出来るが、凝った処理を行う場合は、SpriteUnitを使う
76
104
  #--
77
- #SpriteUnit = Struct.new([:dp], :bitmap, :ox, :oy, :ow, :oh, :x, :y, [:effect], [:viewport], :angle, :xscale, :yscale, :cx, :cy)
105
+ #SpriteUnit = Struct.new([:dp], :bitmap, :ox, :oy, :ow, :oh, :x, :y, :cx, :cy)
78
106
  #++
79
107
  #([数字])は、配列として認識したときのインデックス番号に対応(Struct#[]メソッドを呼び出した時のインデックス)
80
108
  #:bitmap([0]) -> 画像データ(SDL::Surfaceクラスのインスタンス)
@@ -84,28 +112,34 @@ module Miyako
84
112
  #:oh([4]) -> 描画高さ
85
113
  #:x([5]) -> 描画幅
86
114
  #:y([6]) -> 描画高さ
87
- #:angle([7]) -> 回転角度(ラジアン単位)
88
- #:xscale([8]) -> X方向拡大・縮小・鏡像の割合(実数。変換後の幅が32768を切る様にすること)
89
- #:yscale([9]) -> Y方向拡大・縮小・鏡像の割合(実数。変換後の幅が32768を切る様にすること)
90
- #:cx([10]) -> 回転・拡大・縮小・鏡像の中心座標(x方向)
91
- #:cy([11]) -> 回転・拡大・縮小・鏡像の中心座標(y方向)
92
- SpriteUnit = SpriteUnitBase.new(:bitmap, :ox, :oy, :ow, :oh, :x, :y, :angle, :xscale, :yscale, :cx, :cy)
115
+ #:cx([7]) -> 回転・拡大・縮小・鏡像の中心座標(x方向)
116
+ #:cy([8]) -> 回転・拡大・縮小・鏡像の中心座標(y方向)
117
+ SpriteUnit = SpriteUnitBase.new(:bitmap, :ox, :oy, :ow, :oh, :x, :y, :cx, :cy)
93
118
 
94
119
  #==SpriteUnit生成ファクトリクラス
95
120
  #SpriteUnit構造体のインスタンスを生成するためのクラス
96
121
  class SpriteUnitFactory
97
- PARAMS = [:bitmap, :ox, :oy, :ow, :oh, :x, :y, :angle, :xscale, :yscale, :cx, :cy]
122
+ PARAMS = [:bitmap, :ox, :oy, :ow, :oh, :x, :y, :cx, :cy]
98
123
  #==SpriteUnitのインスタンスを生成する
99
124
  #params: 初期化するSpriteUnit構造体の値。ハッシュ引数。引数のキーは、SpriteUnitのアクセサ名と同一。省略可能
100
125
  def SpriteUnitFactory.create(params = nil)
101
- unit = SpriteUnit.new(nil, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 0, 0)
126
+ unit = SpriteUnit.new(nil, 0, 0, 0, 0, 0, 0, 0, 0)
102
127
  return SpriteUnitFactory.apply(unit, params)
103
128
  end
104
129
 
105
130
  #==SpriteUnitの各アクセサに対応した値を設定する
131
+ #(注)bitmapアクセサに値を設定する場合、ox,oy,ow,ohの値が自動的に、
132
+ #bitmapに対応する値(ox=0,oy=0,ow=bitmap.w,oh=bitmap.h)が設定される
106
133
  #unit: 設定対象のSpriteUnit構造体
107
134
  #params: 設定するSpriteUnit構造体の値。ハッシュ引数。引数のキーは、SpriteUnitのアクセサ名と同一
108
135
  def SpriteUnitFactory.apply(unit, params)
136
+ if params && params.has_key?(:bitmap)
137
+ unit.bitmap = params[:bitmap]
138
+ unit.ox = 0
139
+ unit.oy = 0
140
+ unit.ow = unit.bitmap.w
141
+ unit.oh = unit.bitmap.h
142
+ end
109
143
  PARAMS.each{|prm| unit[prm] = params[prm] if params.has_key?(prm) } if params
110
144
  return unit
111
145
  end
@@ -3,7 +3,7 @@
3
3
  =begin
4
4
  --
5
5
  Miyako v2.0
6
- Copyright (C) 2007-2008 Cyross Makoto
6
+ Copyright (C) 2007-2009 Cyross Makoto
7
7
 
8
8
  This library is free software; you can redistribute it and/or
9
9
  modify it under the terms of the GNU Lesser General Public
@@ -26,36 +26,66 @@ module Miyako
26
26
  #==シーン実行クラス
27
27
  #用意したシーンインスタンスを実行
28
28
  class Story
29
- #===あとで書く
30
- #返却値:: あとで書く
31
- def prev_label
29
+ @@sub_scenes = [:sub_scene, :sub_routine]
30
+ @@over_scenes = [:over_scene]
31
+
32
+ def prev_label #:nodoc:
32
33
  return @prev_label
33
34
  end
34
35
 
35
- #===あとで書く
36
- #返却値:: あとで書く
37
- def next_label
36
+ def next_label #:nodoc:
38
37
  return @next_label
39
38
  end
40
39
 
41
- #===あとで書く
42
- #返却値:: あとで書く
43
- def upper_label
40
+ def upper_label #:nodoc:
44
41
  return @stack.empty? ? nil : @stack.last[0]
45
42
  end
46
43
 
47
44
  #===インスタンスの作成
48
- #
49
- #返却値:: あとで書く
45
+ #ストーリー情報の初期か
46
+ #返却値:: 生成したインスタンス
50
47
  def initialize
51
48
  @prev_label = nil
52
49
  @next_label = nil
53
50
 
54
- @stack = Array.new
55
-
51
+ @stack = []
52
+ @fibers = [nil]
53
+
56
54
  @scene_cache = Hash.new
57
55
  @scene_cache_list = Array.new
58
56
  @scene_cache_max = 20
57
+
58
+ @fiber = Proc.new{|sc, num|
59
+ raise MiyakoError, "Illegal Script-label name! : #{sc}" unless Scene.has_scene?(sc.to_s)
60
+ fnum = nil
61
+ bk_nn = sc
62
+ uu = sc.new(self)
63
+ uu.init_inner(@prev_label, self.upper_label)
64
+ uu.setup
65
+ ret = true
66
+ while ret do
67
+ nn = uu.update
68
+ uu.render
69
+ if fnum && @fibers[fnum]
70
+ @fibers[fnum].resume(true)
71
+ elsif nn && !(nn.eql?(uu.class)) && @@over_scenes.include?(nn.scene_type)
72
+ @fibers << Fiber.new(&@fiber)
73
+ fnum = @fibers.length-1
74
+ @fibers[fnum].resume(nn, fnum)
75
+ n = bk_nn
76
+ end
77
+ break unless nn
78
+ ret = Fiber.yield
79
+ end
80
+ uu.final
81
+ uu.dispose
82
+ if (fnum && @fibers[fnum])
83
+ @fibers[fnum].resume(nil)
84
+ @fibers[fnum] = nil
85
+ fnum = nil
86
+ end
87
+ @fibers[num] = nil
88
+ }
59
89
  end
60
90
 
61
91
  def get_scene(n, s) #:nodoc:
@@ -71,9 +101,9 @@ module Miyako
71
101
  return @scene_cache[class_symbol]
72
102
  end
73
103
 
74
- #===あとで書く
75
- #_n_:: あとで書く
76
- #返却値:: あとで書く
104
+ #===Storyの実行を始める
105
+ #"obj.run(MainScene)"と記述すると、SceneモジュールをmixinしたMainSceneクラスのインスタンスを作成し、評価を始める
106
+ #_n_:: 最初に実行するシーン名(クラス名を定数で)
77
107
  def run(n)
78
108
  return nil if n == nil
79
109
  u = nil
@@ -84,6 +114,7 @@ module Miyako
84
114
  on = n
85
115
 
86
116
  raise MiyakoError, "Illegal Script-label name! : #{n}" unless Scene.has_scene?(n.to_s)
117
+ raise MiyakoError, "This scene cannot use for Standard Scene! : #{n}" if n.scene_type != :scene
87
118
  u = get_scene(n, @stack.size) if u == nil
88
119
  u.init_inner(@prev_label, self.upper_label)
89
120
  u.setup
@@ -91,43 +122,81 @@ module Miyako
91
122
  loop do
92
123
  Input.update
93
124
  Screen.clear
125
+ bk_n = on
94
126
  n = u.update
95
- break unless n && on.eql?(n)
96
127
  u.render
128
+ if @fibers.first
129
+ raise MiyakoError, "Double over scene from root!" if n && @@over_scenes.include?(n.scene_type)
130
+ @fibers.first.resume(true, 0)
131
+ elsif n && @@over_scenes.include?(n.scene_type)
132
+ @fibers.clear
133
+ @fibers << Fiber.new(&@fiber)
134
+ @fibers.first.resume(n, 0)
135
+ n = bk_n
136
+ end
97
137
  Screen.render
138
+ break unless n && on.eql?(n)
98
139
  end
99
140
  u.next = n
100
141
  @next_label = n
101
142
  u.final
102
143
  if n == nil
103
- if u.scene_type == :sub_routine && @stack.empty? == false
144
+ if @@sub_scenes.include?(u.class.scene_type) && @stack.empty? == false
104
145
  n, u = @stack.pop
105
146
  next
106
147
  end
107
148
  break
108
- elsif n.new(self, false).scene_type == :sub_routine
149
+ elsif @@sub_scenes.include?(n.scene_type)
109
150
  @stack.push([on, u])
110
151
  u = nil
111
152
  else
112
153
  u = nil
113
154
  end
114
155
  end
156
+ if @fibers.length > 0
157
+ @fibers.each{|fiber| fiber.resume(nil) if fiber }
158
+ end
115
159
  @scene_cache_list.each{|sy| @scene_cache[sy].dispose }
116
160
  @scene_cache.clear
117
161
  @scene_cache_list.clear
118
162
  end
119
163
 
120
- #===あとで書く
164
+ #==="over_scene"形式のシーンが実行中かどうか判別する
165
+ #返却値:: "over_scene"形式のシーンが実行中の時はtrueを返す
166
+ def over_scene_execute?
167
+ return @now_fiber != nil
168
+ end
169
+
170
+ #===内部の情報を解放する
121
171
  def dispose
122
172
  @scene_cache.keys.each{|k| @scene_cache[del_symbol].dispose }
123
173
  end
124
174
 
125
175
  #==シーンモジュール
126
- #本モジュールをmixinすることにより、シーンを示すインスタンスを作??することができる
176
+ #本モジュールをmixinすることにより、シーンを示すインスタンスを作成することができる
177
+ #mixinするときに気をつけなければいけないのは、本モジュールでは以下のインスタンス変数・モジュール変数を
178
+ #予約しているため、これらの変数の値を勝手に変えてはいけない
179
+ #@@scenesモジュール変数(シーンクラス一覧が入っている配列)、@storyインスタンス変数(シーンを呼び出したStoryクラスインスタンス)
180
+ #@nowインスタンス変数(現在評価しているシーンクラス)、@preインスタンス変数(一つ前に評価していたシーンクラス)
181
+ #@upperインスタンス変数(sub_routineの呼び元シーンクラス)、@nextインスタンス変数(移動先のシーンクラス)
182
+ #また、シーンには「シーン形式」がある。
183
+ #種類は、シーケンスな移動が出来る「通常シーン」、終了したときに移動元に戻る「サブシーン」、
184
+ #現在実行中のシーン上で並行に実行する「オーバーシーン」の3種類。
185
+ #デフォルトは「通常シーン」となっている。
186
+ #判別は、scene_typeクラスメソッドを呼び出すことで可能。デフォルトは、通常シーンを示すシンボル":scene"が返る。
187
+ #形式を変えるには、scene_typeクラスメソッドをオーバーライドし、返却値を変える。
188
+ #サブシーンの時はシンボル":sub_scene"、オーバーシーンのときはシンボル":over_scene"を返すように実装する
189
+ #(注1)同じクラス名のシーンを繰り返し実行したいときは、いったん別のダミーシーンを介してから元のシーンへ移動する必要がある
190
+ #(注2)オーバーシーン内では、シーンの移動が出来ないが、入れ子形式で別のオーバーシーンを積み上げる形なら移動可能。
127
191
  module Scene
128
192
  @@scenes = {}
129
193
 
130
194
  def Scene.included(c) #:nodoc:
195
+ unless c.singleton_methods.include?(:scene_type)
196
+ def c.scene_type
197
+ return :scene
198
+ end
199
+ end
131
200
  @@scenes[c.to_s] = c
132
201
  end
133
202
 
@@ -139,12 +208,6 @@ module Miyako
139
208
  return @@scenes.has_key?(s)
140
209
  end
141
210
 
142
- #===あとで書く
143
- #返却値:: あとで書く
144
- def scene_type
145
- return :scene
146
- end
147
-
148
211
  def initialize(story, check_only=false) #:nodoc:
149
212
  return if check_only
150
213
  @story = story
@@ -160,34 +223,39 @@ module Miyako
160
223
  @upper = u
161
224
  end
162
225
 
163
- #===あとで書く
164
- #返却値:: あとで書く
226
+ #===シーン内で使用するオブジェクトの初期化テンプレートメソッド
227
+ #シーン内で使用するインスタンスを生成するときなどにこのメソッドを実装する
165
228
  def init
166
229
  end
167
230
 
168
- #===あとで書く
169
- #返却値:: あとで書く
231
+ #===シーン内で使用するオブジェクトの初期設定テンプレートメソッド
232
+ #シーン内で使用するインスタンスの設定を行うときにこのメソッドを実装する
233
+ #(シーン生成時に生成したインスタンスはキャッシュされ、再利用することができることに注意)
170
234
  def setup
171
235
  end
172
236
 
173
- #===あとで書く
174
- #返却値:: あとで書く
237
+ #===シーンの情報を更新するテンプレートメソッド
238
+ #
239
+ #現在実行しているシーンを繰り返し実行する場合はインスタンス変数@nowを返すように実装する
240
+ #nilを返すとシーンの処理を終了する(元のStory#runメソッド呼び出しの次に処理が移る)
241
+ #但し、scene_typeメソッドの結果が:sub_routneのとき、移動元シーンに戻る
242
+ #返却値:: 移動先シーンクラス
175
243
  def update
176
244
  return @now
177
245
  end
178
246
 
179
- #===あとで書く
180
- #返却値:: あとで書く
247
+ #===シーンで指定しているインスタンスを画面に描画するテンプレートメソッド
181
248
  def render
182
249
  end
183
250
 
184
- #===あとで書く
185
- #返却値:: あとで書く
251
+ #===シーン内で使用したオブジェクトの後始末を行うテンプレートメソッド
252
+ #ここでは、解放処理(dispose)ではなく、終了処理(値を変更するなど)に実装する
253
+ #setupメソッドと対になっているというイメージ
186
254
  def final
187
255
  end
188
256
 
189
- #===あとで書く
190
- #返却値:: あとで書く
257
+ #===シーンに使用したデータの解放を記述するテンプレートメソッド
258
+ #initメソッドと対になっているというイメージ
191
259
  def dispose
192
260
  end
193
261
 
@@ -195,14 +263,23 @@ module Miyako
195
263
  @next = label
196
264
  end
197
265
 
198
- #===あとで書く
199
- #返却値:: あとで書く
266
+ #==="over_scene"形式のシーンが実行中かどうか判別する
267
+ #返却値:: "over_scene"形式のシーンが実行中の時はtrueを返す
268
+ def over_scene_execute?
269
+ return @story.over_scene_execute?
270
+ end
271
+
272
+ #===シーンの解説を返す(テンプレートメソッド)
273
+ #Sceneモジュールをmixinしたとき、解説文を返す実装をしておくと、
274
+ #Scene.#lisutupメソッドを呼び出したときに、noticeメソッドの結果を取得できる
275
+ #返却値:: シーンの解説(文字列)
200
276
  def notice
201
277
  return ""
202
278
  end
203
279
 
204
- #===あとで書く
205
- #返却値:: あとで書く
280
+ #===登録しているシーン一覧をリストアップする
281
+ #リストの内容は、"シーンクラス名(文字列),シーンクラス(ポインタ),解説(noticeメソッドの内容)"という書式で取得できる
282
+ #返却値:: リストアップしたシーンの配列
206
283
  def Scene.listup
207
284
  list = Array.new
208
285
  sns = @@scenes
@@ -210,9 +287,8 @@ module Miyako
210
287
  return list
211
288
  end
212
289
 
213
- #===あとで書く
214
- #_csvname_:: あとで書く
215
- #返却値:: あとで書く
290
+ #===Scene.#listupメソッドの内容をCSVファイルに保存する
291
+ #_csvname_:: 保存するCSVファイルパス
216
292
  def Scene.listup2csv(csvfname)
217
293
  csvfname += ".csv" if csvfname !~ /\.csv$/
218
294
  list = self.listup