ruby-miyako 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/README +275 -20
  2. data/extern.h +21 -1
  3. data/install_miyako.rb +5 -3
  4. data/lib/Miyako/API/audio.rb +11 -6
  5. data/lib/Miyako/API/basic_data.rb +0 -985
  6. data/lib/Miyako/API/bitmap.rb +19 -22
  7. data/lib/Miyako/API/choices.rb +203 -69
  8. data/lib/Miyako/API/collision.rb +451 -9
  9. data/lib/Miyako/API/color.rb +177 -0
  10. data/lib/Miyako/API/diagram.rb +18 -20
  11. data/lib/Miyako/API/fixedmap.rb +207 -73
  12. data/lib/Miyako/API/font.rb +111 -18
  13. data/lib/Miyako/API/i_yuki.rb +1201 -0
  14. data/lib/Miyako/API/input.rb +65 -0
  15. data/lib/Miyako/API/layout.rb +41 -29
  16. data/lib/Miyako/API/map.rb +202 -157
  17. data/lib/Miyako/API/map_event.rb +86 -19
  18. data/lib/Miyako/API/map_struct.rb +268 -0
  19. data/lib/Miyako/API/modules.rb +136 -37
  20. data/lib/Miyako/API/movie.rb +8 -8
  21. data/lib/Miyako/API/parts.rb +63 -20
  22. data/lib/Miyako/API/plane.rb +4 -4
  23. data/lib/Miyako/API/screen.rb +16 -8
  24. data/lib/Miyako/API/sprite.rb +290 -23
  25. data/lib/Miyako/API/sprite_animation.rb +23 -11
  26. data/lib/Miyako/API/sprite_list.rb +406 -183
  27. data/lib/Miyako/API/story.rb +4 -65
  28. data/lib/Miyako/API/struct_point.rb +157 -0
  29. data/lib/Miyako/API/struct_rect.rb +233 -0
  30. data/lib/Miyako/API/struct_segment.rb +641 -0
  31. data/lib/Miyako/API/struct_size.rb +158 -0
  32. data/lib/Miyako/API/struct_square.rb +253 -0
  33. data/lib/Miyako/API/textbox.rb +49 -35
  34. data/lib/Miyako/API/viewport.rb +5 -5
  35. data/lib/Miyako/API/wait_counter.rb +350 -0
  36. data/lib/Miyako/API/yuki.rb +95 -60
  37. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  38. data/lib/Miyako/EXT/slides.rb +6 -6
  39. data/lib/Miyako/miyako.rb +25 -11
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/miyako_basicdata.c +201 -17
  43. data/miyako_collision.c +315 -6
  44. data/miyako_diagram.c +331 -0
  45. data/miyako_drawing.c +26 -7
  46. data/miyako_font.c +259 -129
  47. data/miyako_input_audio.c +24 -14
  48. data/miyako_layout.c +106 -8
  49. data/miyako_no_katana.c +398 -171
  50. data/miyako_sprite2.c +275 -38
  51. data/miyako_transform.c +113 -107
  52. data/miyako_utility.c +34 -48
  53. data/miyako_yuki.c +241 -0
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  55. data/sample/Room3/blue.rb +19 -19
  56. data/sample/Room3/green.rb +9 -9
  57. data/sample/Room3/main.rb +12 -12
  58. data/sample/Room3/red.rb +12 -12
  59. data/sample/Room3/title.rb +15 -10
  60. data/sample/collision_test2.rb +2 -1
  61. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  62. data/sample/map_test/main_scene.rb +12 -10
  63. data/sample/map_test/map_manager.rb +14 -13
  64. data/sample/rasterscroll.rb +5 -5
  65. data/sample/takahashi.rb +3 -3
  66. data/sample/textbox_sample.rb +7 -6
  67. data/sample/transform.rb +2 -1
  68. data/uninstall_miyako.rb +4 -1
  69. data/win/miyako_no_katana.so +0 -0
  70. metadata +15 -4
  71. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  72. data/sample/cairo_sample.rb +0 -25
@@ -34,26 +34,30 @@ module Miyako
34
34
  class Yuki
35
35
  include SpriteBase
36
36
  include Animation
37
-
37
+
38
38
  #==キャンセルを示す構造体
39
39
  #コマンド選択がキャンセルされたときに生成される構造体
40
40
  Canceled = Struct.new(:dummy)
41
-
41
+
42
42
  #==コマンド構造体
43
43
  #_body_:: コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)
44
44
  #_body_selected_:: 選択時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
45
+ #_body_disable_:: 選択不可時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
46
+ #_enabe_:: コマンド選択の時はtrue、選択不可の時はfalseを設定
45
47
  #_condition_:: 表示条件(ブロック)。評価の結果、trueのときのみ表示
46
48
  #_result_:: 選択結果(移動先シーンクラス名、シナリオ(メソッド)名他のオブジェクト)
47
- Command = Struct.new(:body, :body_selected, :condition, :result)
48
-
49
+ Command = Struct.new(:body, :body_selected, :body_disable, :enable, :condition, :result)
50
+
49
51
  #==コマンド構造体
50
52
  #_body_:: コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)
51
53
  #_body_selected_:: 選択時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
54
+ #_body_disable_:: 選択不可時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
55
+ #_enabe_:: コマンド選択の時はtrue、選択不可の時はfalseを設定
52
56
  #_condition_:: 表示条件(ブロック)。評価の結果、trueのときのみ表示
53
57
  #_result_:: 選択結果(移動先シーンクラス名、シナリオ(メソッド)名他のオブジェクト)
54
58
  #_end_select_proc_:: この選択肢を選択したときに優先的に処理するブロック。
55
59
  #ブロックは1つの引数を取る(コマンド選択テキストボックス))。デフォルトはnil
56
- CommandEX = Struct.new(:body, :body_selected, :condition, :result, :end_select_proc)
60
+ CommandEX = Struct.new(:body, :body_selected, :condition, :body_disable, :enable, :result, :end_select_proc)
57
61
 
58
62
  #===Yuki#update実行中に行わせる処理を実装するテンプレートメソッド
59
63
  #但し、メソッド本体は、update_inner=メソッドで設定する必要がある
@@ -85,7 +89,7 @@ module Miyako
85
89
 
86
90
  attr_accessor :visible
87
91
  attr_accessor :update_inner, :update_text, :update_cr, :update_clear
88
- attr_reader :valign
92
+ attr_reader :valign, :visibles
89
93
  #release_checks:: ポーズ解除を問い合わせるブロックの配列。
90
94
  #callメソッドを持ち、true/falseを返すインスタンスを配列操作で追加・削除できる。
91
95
  #ok_checks:: コマンド選択決定を問い合わせるブロックの配列。
@@ -93,7 +97,7 @@ module Miyako
93
97
  #cancel_checks:: コマンド選択解除(キャンセル)を問い合わせるブロックの配列。
94
98
  #callメソッドを持ち、true/falseを返すインスタンスを配列操作で追加・削除できる。
95
99
  attr_reader :release_checks, :ok_checks, :cancel_checks
96
- attr_reader :pre_pause, :pre_command, :pre_cancel, :post_pause, :post_command, :post_cancel
100
+ attr_reader :pre_pause, :pre_command, :pre_cancel, :post_pause, :post_command, :post_cancel, :on_disable
97
101
  #selecting_procs:: コマンド選択時に行うブロックの配列。
98
102
  #ブロックは4つの引数を取る必要がある。
99
103
  #(1)コマンド決定ボタンを押した?(true/false)
@@ -102,9 +106,10 @@ module Miyako
102
106
  #(4)マウスの位置を示す配列([x,y])
103
107
  #callメソッドを持つブロックが使用可能。
104
108
  attr_reader :selecting_procs
105
-
106
- #===Yukiにメソッドを追加する
109
+
110
+ #===Yukiにメソッドを追加する(すべてのYukiインスタンスに適応)
107
111
  #ブロックを渡すことで、Yukiに新しいメソッドを追加できる。
112
+ #追加したメソッドは、すべてのYukiインスタンスで利用可能となる。
108
113
  #コンテキストはYukiクラスのインスタンスとなるため、Yukiスクリプトと同じ感覚でメソッドを追加できる。
109
114
  #ただし、すでに追加したメソッド(もしくはYukiクラスですでに追加されているメソッド)を追加しようとすると例外が発生する
110
115
  #
@@ -117,6 +122,21 @@ module Miyako
117
122
  return nil
118
123
  end
119
124
 
125
+ #===Yukiにメソッドを追加する(指定のYukiインスタンスのみ適応)
126
+ #ブロックを渡すことで、Yukiに新しいメソッドを追加できる。
127
+ #追加したメソッドは、指定したYukiインスタンスのみ利用可能となる。
128
+ #コンテキストはYukiクラスのインスタンスとなるため、Yukiスクリプトと同じ感覚でメソッドを追加できる。
129
+ #ただし、すでに追加したメソッド(もしくはYukiクラスですでに追加されているメソッド)を追加しようとすると例外が発生する
130
+ #
131
+ #_name_:: ブロックに渡す引数リスト
132
+ #_block_:: メソッドとして実行させるブロック
133
+ def add_method(name, &block)
134
+ name = name.to_sym
135
+ raise MiyakoError, "Already added method! : #{name.to_s}" if self.methods.include?(name)
136
+ self.define_singleton_method(name, block)
137
+ return nil
138
+ end
139
+
120
140
  #===Yukiを初期化する
121
141
  #
122
142
  #ブロック引数として、テキストボックスの変更などの処理をブロック内に記述することが出来る。
@@ -132,7 +152,7 @@ module Miyako
132
152
  @executing = false
133
153
 
134
154
  @exec_plot = nil
135
-
155
+
136
156
  @pausing = false
137
157
  @selecting = false
138
158
  @waiting = false
@@ -150,7 +170,7 @@ module Miyako
150
170
  @update_text = lambda{|yuki, ch|}
151
171
  @update_cr = lambda{|yuki|}
152
172
  @update_clear = lambda{|yuki|}
153
-
173
+
154
174
  @parts = {}
155
175
  @visibles = SpriteList.new
156
176
  @vars = {}
@@ -158,7 +178,7 @@ module Miyako
158
178
 
159
179
  @executing_fiber = nil
160
180
 
161
- @text_methods = {:char => self.method(:text_by_char),
181
+ @text_methods = {:char => self.method(:text_by_char),
162
182
  :string => self.method(:text_by_str) }
163
183
  @text_method_name = :char
164
184
 
@@ -166,7 +186,7 @@ module Miyako
166
186
 
167
187
  @release_checks_default = [lambda{ Input.pushed_any?(:btn1, :spc) }, lambda{ Input.click?(:left) } ]
168
188
  @release_checks = @release_checks_default.dup
169
-
189
+
170
190
  @ok_checks_default = [lambda{ Input.pushed_any?(:btn1, :spc) },
171
191
  lambda{ self.commandbox.attach_any_command?(*Input.get_mouse_position) && Input.click?(:left) } ]
172
192
  @ok_checks = @ok_checks_default.dup
@@ -184,13 +204,14 @@ module Miyako
184
204
  @post_pause = []
185
205
  @post_command = []
186
206
  @post_cancel = []
207
+ @on_disable = []
187
208
  @selecting_procs = []
188
-
209
+
189
210
  @is_outer_height = self.method(:is_outer_height)
190
211
 
191
212
  @now_page = nil
192
213
  @first_page = nil
193
-
214
+
194
215
  raise MiyakoProcError, "Aagument count is not same block parameter count!" if proc && proc.arity.abs != params.length
195
216
  instance_exec(*params, &proc) if block_given?
196
217
  end
@@ -208,7 +229,7 @@ module Miyako
208
229
  @over_yuki.render if @over_yuki && @over_yuki.executing?
209
230
  return self
210
231
  end
211
-
232
+
212
233
  #===Yuki#showで表示指定した画像を描画する
213
234
  #描画順は、showメソッドで指定した順に描画される(先に指定した画像は後ろに表示される)
214
235
  #なお、visibleの値がfalseの時は描画されない。
@@ -218,7 +239,7 @@ module Miyako
218
239
  @over_yuki.render_to(dst) if @over_yuki && @over_yuki.executing?
219
240
  return self
220
241
  end
221
-
242
+
222
243
  #===Yuki#showで表示指定した画像のアニメーションを更新する
223
244
  #showメソッドで指定した画像のupdate_animationメソッドを呼び出す
224
245
  #返却値:: 描く画像のupdate_spriteメソッドを呼び出した結果を配列で返す
@@ -309,7 +330,7 @@ module Miyako
309
330
  @parts[name] = parts
310
331
  return self
311
332
  end
312
-
333
+
313
334
  #===表示・描画対象のテキストボックスを選択する
314
335
  #[[Yukiスクリプトとして利用可能]]
315
336
  #_box_:: テキストボックスのインスタンス
@@ -319,7 +340,7 @@ module Miyako
319
340
  @text_box = box
320
341
  return self
321
342
  end
322
-
343
+
323
344
  #===表示・描画対象のコマンドボックスを選択する
324
345
  #[[Yukiスクリプトとして利用可能]]
325
346
  #_box_:: テキストボックスのインスタンス
@@ -329,7 +350,7 @@ module Miyako
329
350
  @command_box = box
330
351
  return self
331
352
  end
332
-
353
+
333
354
  #===テキストボックスを取得する
334
355
  #[[Yukiスクリプトとして利用可能]]
335
356
  #テキストボックスが登録されていないときはnilを返す
@@ -337,7 +358,7 @@ module Miyako
337
358
  def textbox
338
359
  return @text_box
339
360
  end
340
-
361
+
341
362
  #===コマンドボックスを取得する
342
363
  #[[Yukiスクリプトとして利用可能]]
343
364
  #コマンドボックスが登録されていないときはnilを返す
@@ -345,7 +366,7 @@ module Miyako
345
366
  def commandbox
346
367
  return @command_box
347
368
  end
348
-
369
+
349
370
  #===オブジェクトの登録を解除する
350
371
  #[[Yukiスクリプトとして利用可能]]
351
372
  #パーツnameとして登録されているオブジェクトを登録から解除する。
@@ -356,7 +377,7 @@ module Miyako
356
377
  @parts.delete(name)
357
378
  return self
358
379
  end
359
-
380
+
360
381
  #===パーツで指定したオブジェクトを先頭に表示する
361
382
  #[[Yukiスクリプトとして利用可能]]
362
383
  #描画時に、指定したパーツを描画する
@@ -370,7 +391,7 @@ module Miyako
370
391
  }
371
392
  return self
372
393
  end
373
-
394
+
374
395
  #===パーツで指定したオブジェクトを隠蔽する
375
396
  #[[Yukiスクリプトとして利用可能]]
376
397
  #描画時に、指定したパーツを描画させないよう指定する
@@ -383,7 +404,7 @@ module Miyako
383
404
  }
384
405
  return self
385
406
  end
386
-
407
+
387
408
  #===パーツで指定したオブジェクトの処理を開始する
388
409
  #[[Yukiスクリプトとして利用可能]]
389
410
  #nameで指定したパーツが持つ処理(例:アニメーション)を開始する。
@@ -394,7 +415,7 @@ module Miyako
394
415
  @parts[name].start
395
416
  return self
396
417
  end
397
-
418
+
398
419
  #===パーツで指定したオブジェクトを再生する
399
420
  #[[Yukiスクリプトとして利用可能]]
400
421
  #nameで指定したパーツを再生(例:BGM)する。
@@ -405,7 +426,7 @@ module Miyako
405
426
  @parts[name].play
406
427
  return self
407
428
  end
408
-
429
+
409
430
  #===パーツで指定したオブジェクトの処理を停止する
410
431
  #[[Yukiスクリプトとして利用可能]]
411
432
  #nameで指定したパーツが持つ処理を停止する。
@@ -416,7 +437,7 @@ module Miyako
416
437
  @parts[name].stop
417
438
  return self
418
439
  end
419
-
440
+
420
441
  #===遷移図の処理が終了するまで待つ
421
442
  #[[Yukiスクリプトとして利用可能]]
422
443
  #nameで指定した遷移図の処理が終了するまで、プロットを停止する
@@ -459,7 +480,7 @@ module Miyako
459
480
  end
460
481
  return self
461
482
  end
462
-
483
+
463
484
  #===シーンのセットアップ時に実行する処理
464
485
  #
465
486
  #ブロック引数として、テキストボックスの変更などの処理をブロック内に記述することが出来る。
@@ -486,13 +507,13 @@ module Miyako
486
507
 
487
508
  @now_page = nil
488
509
  @first_page = nil
489
-
510
+
490
511
  raise MiyakoProcError, "Aagument count is not same block parameter count!" if proc && proc.arity.abs != params.length
491
512
  instance_exec(*params, &proc) if proc
492
-
513
+
493
514
  return self
494
515
  end
495
-
516
+
496
517
  #===実行するプロットと登録する
497
518
  #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
498
519
  #返却値:: 自分自身を返す
@@ -524,7 +545,7 @@ module Miyako
524
545
  @executing_fiber.resume
525
546
  return self
526
547
  end
527
-
548
+
528
549
  #===プロット処理を更新する
529
550
  #ポーズ中、コマンド選択中、 Yuki#wait メソッドによるウェイトの状態確認を行う。
530
551
  #プロット処理の実行確認は出来ない
@@ -541,7 +562,7 @@ module Miyako
541
562
  @select_amount = [0, 0]
542
563
  @executing_fiber.resume
543
564
  end
544
-
565
+
545
566
  #===プロット用ブロックをYukiへ渡すためのインスタンスを作成する
546
567
  #プロット用に用意したブロック(ブロック引数無し)を、Yukiでの選択結果や移動先として利用できる
547
568
  #インスタンスに変換する
@@ -594,7 +615,7 @@ module Miyako
594
615
  return plot_proc ? self.instance_exec(&plot_proc) :
595
616
  self.instance_exec(&plot_block)
596
617
  end
597
-
618
+
598
619
  #===プロット処理が実行中かどうかを確認する
599
620
  #返却値:: プロット処理実行中の時はtrueを返す
600
621
  def executing?
@@ -706,7 +727,7 @@ module Miyako
706
727
  def result
707
728
  return @plot_result
708
729
  end
709
-
730
+
710
731
  #===プロット処理の結果を設定する
711
732
  #[[Yukiスクリプトとして利用可能]]
712
733
  #_ret_:: 設定する結果。デフォルトはnil
@@ -740,7 +761,7 @@ module Miyako
740
761
  def canceled?
741
762
  return result == @cancel
742
763
  end
743
-
764
+
744
765
  #===ブロックを条件として設定する
745
766
  #[[Yukiスクリプトとして利用可能]]
746
767
  #メソッドをMethodクラスのインスタンスに変換する
@@ -749,28 +770,28 @@ module Miyako
749
770
  def condition(&block)
750
771
  return block
751
772
  end
752
-
773
+
753
774
  #===コマンド選択中の問い合わせメソッド
754
775
  #[[Yukiスクリプトとして利用可能]]
755
776
  #返却値:: コマンド選択中の時はtrueを返す
756
777
  def selecting?
757
778
  return @selecting
758
779
  end
759
-
780
+
760
781
  #===Yuki#waitメソッドによる処理待ちの問い合わせメソッド
761
782
  #[[Yukiスクリプトとして利用可能]]
762
783
  #返却値:: 処理待ちの時はtrueを返す
763
784
  def waiting?
764
785
  return @waiting
765
786
  end
766
-
787
+
767
788
  #===メッセージ送り待ちの問い合わせメソッド
768
789
  #[[Yukiスクリプトとして利用可能]]
769
790
  #返却値:: メッセージ送り待ちの時はtrueを返す
770
791
  def pausing?
771
792
  return @pausing
772
793
  end
773
-
794
+
774
795
  #===条件に合っていればポーズをかける
775
796
  #[[Yukiスクリプトとして利用可能]]
776
797
  #引数で設定した条件(Proc,メソッドインスタンス,ブロック)を評価した結果、trueのときはポーズを行い、
@@ -783,7 +804,7 @@ module Miyako
783
804
  return cond.call ? pause_and_clear : cr if cond
784
805
  return self
785
806
  end
786
-
807
+
787
808
  #===テキストボックスに文字を表示する方法を指定する
788
809
  #引数に、:charを渡すと1文字ごと、:stringを渡すと文字列ごとに表示される。それ以外を指定したときは例外が発生
789
810
  #ブロックを渡せば、ブロックの評価中のみ設定が有効になる。
@@ -800,7 +821,7 @@ module Miyako
800
821
  end
801
822
  return self
802
823
  end
803
-
824
+
804
825
  #===テキストボックスに文字を表示する
805
826
  #[[Yukiスクリプトとして利用可能]]
806
827
  #テキストボックスとして用意している画像に文字を描画する。
@@ -819,7 +840,7 @@ module Miyako
819
840
  return self if txt.empty?
820
841
  return @text_methods[@text_method_name].call(txt)
821
842
  end
822
-
843
+
823
844
  #===テキストボックスに文字を1文字ずつ表示する
824
845
  #[[Yukiスクリプトとして利用可能]]
825
846
  #引数txtの値は、内部で1文字ずつ分割され、1文字描画されるごとに、
@@ -843,7 +864,7 @@ module Miyako
843
864
  }
844
865
  return self
845
866
  end
846
-
867
+
847
868
  #===テキストボックスに文字を表示する
848
869
  #[[Yukiスクリプトとして利用可能]]
849
870
  #文字列が描画されるごとに、update_textメソッドが呼び出され、
@@ -881,9 +902,9 @@ module Miyako
881
902
  def is_outer_height #:nodoc:
882
903
  return @text_box.locate.y + @text_box.max_height >= @text_box.textarea.h
883
904
  end
884
-
905
+
885
906
  private :is_outer_height
886
-
907
+
887
908
  #===文字色を変更する
888
909
  #[[Yukiスクリプトとして利用可能]]
889
910
  #ブロック内で指定した文字列を、指定の色で描画する
@@ -921,7 +942,7 @@ module Miyako
921
942
  }
922
943
  return self
923
944
  end
924
-
945
+
925
946
  #===太文字を描画する
926
947
  #[[Yukiスクリプトとして利用可能]]
927
948
  #ブロック内で指定した文字列を太文字で表示する
@@ -931,7 +952,7 @@ module Miyako
931
952
  @text_box.font_bold{ text block.call }
932
953
  return self
933
954
  end
934
-
955
+
935
956
  #===斜体文字を描画する
936
957
  #[[Yukiスクリプトとして利用可能]]
937
958
  #ブロック内で指定した文字列を斜体で表示する
@@ -941,7 +962,7 @@ module Miyako
941
962
  @text_box.font_italic{ text block.call }
942
963
  return self
943
964
  end
944
-
965
+
945
966
  #===下線付き文字を描画する
946
967
  #[[Yukiスクリプトとして利用可能]]
947
968
  #ブロック内で指定した文字列を下線付きで表示する
@@ -968,7 +989,7 @@ module Miyako
968
989
  #[[Yukiスクリプトとして利用可能]]
969
990
  #開業後にupdate_clearテンプレートメソッドが1回呼ばれる
970
991
  #返却値:: 自分自身を返す
971
- def clear
992
+ def clear
972
993
  @text_box.clear
973
994
  @update_clear.call(self)
974
995
  return self
@@ -1003,7 +1024,7 @@ module Miyako
1003
1024
  @pausing = false
1004
1025
  @pause_release = false
1005
1026
  end
1006
-
1027
+
1007
1028
  #===ポーズをかけて、テキストボックスの内容を消去する
1008
1029
  #[[Yukiスクリプトとして利用可能]]
1009
1030
  #ポーズをかけ、ポーズを解除するときにテキストボックスの内容を消去する
@@ -1021,7 +1042,7 @@ module Miyako
1021
1042
  #引数無しのブロックを渡せば、コマンド選択開始前に、決定判別・キャンセル判別に必要な前処理を施すことが出来る
1022
1043
  #選択中、update_innerメソッドを呼び出し、続けて、処理をYuki#startもしくはYuki#update呼び出し直後に戻す
1023
1044
  #Yuki#updateが呼び出されても選択中の場合は、再び上記の処理を繰り返す
1024
- #_command_list_:: 表示するコマンド群。各要素はCommand構造体の配列
1045
+ #_command_list_:: 表示するコマンド群。各要素はCommand/CommandEx構造体の配列
1025
1046
  #_cancel_to_:: キャンセルボタンを押したときの結果。デフォルトはnil(キャンセル無効)
1026
1047
  #_chain_block_:: コマンドの表示方法。TextBox#create_choices_chainメソッド参照
1027
1048
  #返却値:: 自分自身を返す
@@ -1032,7 +1053,7 @@ module Miyako
1032
1053
  choices = []
1033
1054
  command_list.each{|cm|
1034
1055
  if (cm[:condition] == nil || cm[:condition].call)
1035
- cm_array = [cm[:body], cm[:body_selected], cm[:result]]
1056
+ cm_array = [cm[:body], cm[:body_selected], cm[:body_disable], cm[:enable], cm[:result]]
1036
1057
  methods = cm.methods
1037
1058
  cm_array << (methods.include?(:end_select_proc) ? cm[:end_select_proc] : nil)
1038
1059
  choices.push(cm_array)
@@ -1062,6 +1083,7 @@ module Miyako
1062
1083
  sp.call(@select_ok, @select_cansel, @select_amount, @mouse_amount)
1063
1084
  }
1064
1085
  if @select_ok
1086
+ return @on_disable.each{|proc| proc.call} unless @command_box.enable_choice?
1065
1087
  @result = @command_box.result
1066
1088
  @command_box.finish_command
1067
1089
  @text_box.release
@@ -1081,7 +1103,7 @@ module Miyako
1081
1103
  reset_selecting
1082
1104
  end
1083
1105
  end
1084
-
1106
+
1085
1107
  def reset_selecting #:nodoc:
1086
1108
  @select_ok = false
1087
1109
  @select_cancel = false
@@ -1141,7 +1163,7 @@ module Miyako
1141
1163
  @now_page = nil
1142
1164
  return name
1143
1165
  end
1144
-
1166
+
1145
1167
  #===シナリオ上の現在のページを返す
1146
1168
  #[[Yukiスクリプトとして利用可能]]
1147
1169
  #呼び出し当時、シナリオ上、pageメソッドでくくられていない場合は、nilを返す
@@ -1149,7 +1171,7 @@ module Miyako
1149
1171
  def now_page
1150
1172
  return @now_page
1151
1173
  end
1152
-
1174
+
1153
1175
  #===プロット上の最初に実行するページを指定知る
1154
1176
  #[[Yukiスクリプトとして利用可能]]
1155
1177
  #但し、ページ名を指定しないときはnilを指定する。
@@ -1157,16 +1179,29 @@ module Miyako
1157
1179
  def select_first_page(name)
1158
1180
  @first_page = name
1159
1181
  end
1160
-
1182
+
1183
+
1184
+ #===一旦処理をメインに戻す
1185
+ #[[Yukiスクリプトとして利用可能]]
1186
+ #Yukiスクリプト内で定義されているループ内処理から一旦抜け出し、メインループに戻る
1187
+ #追加したYukiスクリプトにループが含まれているとき、
1188
+ #ループを回すごとに画面更新やメイン処理を行いたいときに使う
1189
+ #但し、ページ名を指定しないときはnilを指定する。
1190
+ #_params_:: メインループに返す引数
1191
+ #返却値:: メインループから渡ってきた引数
1192
+ def process(*params)
1193
+ Fiber.yield *params
1194
+ end
1195
+
1161
1196
  #===インスタンスで使用しているオブジェクトを解放する
1162
1197
  def dispose
1163
1198
  @update_inner = nil
1164
1199
  @update_text = nil
1165
1200
  @update_cr = nil
1166
1201
  @update_clear = nil
1167
-
1202
+
1168
1203
  @executing_fiber = nil
1169
-
1204
+
1170
1205
  @parts.clear
1171
1206
  @parts = nil
1172
1207
  @visibles.clear
@@ -39,7 +39,7 @@ module Miyako
39
39
  @fo_size = 0
40
40
  @effecting = false
41
41
  end
42
-
42
+
43
43
  #===ラスタスクロールを開始する
44
44
  #ラスタスクロール実行用に設定する引数は以下の通り
45
45
  #:lines -> ライン数(:lines=>3を指定すると、3ラインずつラスタスクロールを行う)。デフォルトは1(ライン)
@@ -62,7 +62,7 @@ module Miyako
62
62
  @wait.start
63
63
  return self
64
64
  end
65
-
65
+
66
66
  #===ラスタスクロール処理を更新する
67
67
  #返却値:: 自分自身を返す
68
68
  def update
@@ -106,22 +106,44 @@ module Miyako
106
106
  #===ラスタスクロールを画面に描画する
107
107
  def render
108
108
  angle = @sangle
109
+ ty = @src.oy
110
+ th = @src.oh
111
+ pos = @src.pos
112
+ @src.oh = @lines
113
+ @src.oy = 0
109
114
  @h.times{|y|
110
115
  rsx = @size * Math.sin(angle)
111
- @src.render{|src, dst| src.x += rsx; src.y += y * @lines; src.oy += y * @lines; src.oh = @lines }
116
+ @src.render_xy @src.x + rsx, @src.y + y * @lines
117
+ ny = @src.oy + @lines
118
+ @src.oh = @src.h - ny if (@src.h - ny < @lines)
119
+ @src.oy = ny
112
120
  angle = angle + @dangle
113
121
  }
122
+ @src.oy = ty
123
+ @src.oh = th
124
+ @src.move_to!(*pos)
114
125
  end
115
-
126
+
116
127
  #===ラスタスクロールを画像に描画する
117
128
  #_dst_:: 描画先画像
118
129
  def render_to(dst)
119
- @angle = @sangle
130
+ angle = @sangle
131
+ ty = @src.oy
132
+ th = @src.oh
133
+ pos = @src.pos
134
+ @src.oh = @lines
135
+ @src.oy = 0
120
136
  @h.times{|y|
121
- rsx = @size * Math.sin(@angle)
122
- @src.render_to(dst){|src, dst| src.x += rsx; src.y += y * @lines; src.oy += y * @lines; src.oh = @lines }
123
- @angle = @angle + @dangle
137
+ rsx = @size * Math.sin(angle)
138
+ @src.render_xy_to dst, @src.x + rsx, @src.y + y * @lines
139
+ ny = @src.oy + @lines
140
+ @src.oh = @src.h - ny if (@src.h - ny < @lines)
141
+ @src.oy = ny
142
+ angle = angle + @dangle
124
143
  }
144
+ @src.oy = ty
145
+ @src.oh = th
146
+ @src.move_to!(*pos)
125
147
  end
126
148
 
127
149
  #===ラスタスクロールをフェードアウトさせる
@@ -40,7 +40,7 @@ module Miyako
40
40
  tmp[:color] ||= Color[:white]
41
41
  return Parts.new(tmp[:size]).tap{|obj| obj[:___base___] = Sprite.new(tmp).fill(tmp[:color])}
42
42
  end
43
-
43
+
44
44
  @@templates["320x240"] = {:size=>Size.new(320,240)}
45
45
  @@templates["640x480"] = {}
46
46
  @@templates["800x600"] = {:size=>Size.new(800,600)}
@@ -63,7 +63,7 @@ module Miyako
63
63
  def Slide.[](sym = "640x480")
64
64
  return Slide.create(@@templates[sym])
65
65
  end
66
-
66
+
67
67
  #===スライドのテンプレートを追加する
68
68
  #指定できるテンプレートの内容は、Sprite.newメソッドの引数がそのまま使える(Hashクラスインスタンスとして渡す)
69
69
  #また、追加として、:colorパラメータを使って塗りつぶす色を指定することが出来る。
@@ -84,13 +84,13 @@ module Miyako
84
84
  set_layout_size(*(@body.size))
85
85
  @body.snap(self)
86
86
  end
87
-
87
+
88
88
  def piece
89
89
  return self
90
90
  end
91
-
91
+
92
92
  private :piece
93
-
93
+
94
94
  #===名前に対応したパーツを取得する
95
95
  #_title_:: 取得したいパーツに対応したシンボル
96
96
  #返却値:: シンボルに対応したパーツ
@@ -151,7 +151,7 @@ module Miyako
151
151
  #===@bodyに登録したオブジェクトとは別に作成していたインスタンスを解放する
152
152
  def dispose
153
153
  end
154
-
154
+
155
155
  def_delegators(:@body, :remove, :each, :start, :stop, :reset, :update, :update_animation)
156
156
  end
157
157
  end