ruby-miyako 2.1.14 → 2.1.16

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,8 +1,8 @@
1
1
  *******************************************************************************
2
2
  【 作者名 】 サイロス誠
3
3
  【 ソフト名 】 Interactive Media Authoring System "Miyako"
4
- 【 バージョン 】 2.1.14
5
- 【 作成日 】 2010/06/11
4
+ 【 バージョン 】 2.1.16
5
+ 【 作成日 】 2010/08/30
6
6
  【 種別 】 フリーウェア
7
7
  【 開発言語 】 Ruby 1.9.1
8
8
  【 ランタイム 】 Ruby 1.9.1~,Ruby/SDL 2.1~,SDL
@@ -15,7 +15,7 @@
15
15
 
16
16
  【 注意事項 】
17
17
 
18
- 本バージョンは、2.1.14公式リリース版です。
18
+ 本バージョンは、2.1.16公式リリース版です。
19
19
  本バージョンでは、ドキュメント・リファレンスは不十分ですが、「サイログ。」内や、サンプルプログラムの紹介等で随時ドキュメントを公開して行きます。
20
20
  (RDOC化を進めていますので、我こそはと思う方は是非・・・)
21
21
 
@@ -91,7 +91,7 @@ PAD : BUFFALO BGC-FC802
91
91
  OS : Microsoft WindowsXp SP3
92
92
  Microsoft WindowsVista Ultimate(x64) SP1
93
93
  DEV : Notepad++ v5.3.1-6
94
- mingw32版Ruby 1.9.2dev + Ruby/SDL 2.1.1
94
+ mingw32版Ruby 1.9.2-p0 + Ruby/SDL 2.1.1
95
95
  MinGW+MSYS(miyako_no_katanaビルド)
96
96
 
97
97
  <サブ開発PC>
@@ -101,7 +101,7 @@ MEM : 4GB(2GBx2)
101
101
  PAD : SANWA SUPPLY JY-P1W
102
102
  OS : Microsoft Windows7 x64
103
103
  DEV : Notepad++ v5.3.1-6
104
- mswin32版Ruby 1.9.2dev + Ruby/SDL 2.1.1
104
+ mswin32版Ruby 1.9.2-p0 + Ruby/SDL 2.1.1
105
105
 
106
106
  【 動作確認環境 】
107
107
 
@@ -1830,5 +1830,94 @@ v2.1.14(2010.06.11)
1830
1830
  <インスタンスメソッド廃止>
1831
1831
  <ドキュメント>
1832
1832
 
1833
+ v2.1.15(2010.07.18)
1834
+ <バグ修正>
1835
+ ・map_testサンプルで、マップと画面とのずれを算出する際に、アニメーションではなくスプライトからずれを算出していた問題を修正
1836
+  ・実際にはずれていなかったため、海の上を歩けるなどの問題があった
1837
+ <機能改善>
1838
+ ・Utility.product_liner(_f)の内部アルゴリズムを変更
1839
+ <仕様変更>
1840
+ <ファイル追加>
1841
+ <ファイル削除>
1842
+ <グローバル変数追加>
1843
+ <定数追加>
1844
+ <定数削除>
1845
+ <構造体追加>
1846
+ <クラス追加>
1847
+ <モジュール追加>
1848
+ <mixin>
1849
+ <クラス・モジュールメソッド追加>
1850
+ ・ScenarioEngine.[]
1851
+ ・ScenarioEngine.[]=
1852
+ ・InitiativeScenarioEngine.[]
1853
+ ・InitiativeScenarioEngine.[]=
1854
+ ・Utility.theta2
1855
+ ・Utility.radian
1856
+ ・Utility.radian2
1857
+ ・Utility.degree
1858
+ ・Utility.degree2
1859
+ ・Utility.product_liner_xy
1860
+ ・Utility.product_liner_xy_f
1861
+ <クラス・モジュールメソッド廃止>
1862
+ <モジュール関数追加>
1863
+ <モジュール関数廃止>
1864
+ <インスタンスメソッド追加>
1865
+ ・ScenarioEngine#[]
1866
+ ・ScenarioEngine#[]=
1867
+ ・ScenarioEngine#common_use
1868
+ ・ScenarioEngine#call_plot_params
1869
+ ・ScenarioEngine#call_plot_block
1870
+ ・InitiativeScenarioEngine#[]
1871
+ ・InitiativeScenarioEngine#[]=
1872
+ ・InitiativeScenarioEngine#common_use
1873
+ ・InitiativeScenarioEngine#call_plot_params
1874
+ ・InitiativeScenarioEngine#call_plot_block
1875
+ <インスタンスメソッド廃止>
1876
+ <ドキュメント>
1877
+ ・リファレンスマニュアルの反映
1878
+ <その他>
1879
+ ・MiyakoPackはzipファイル→自己解凍型インストーラに変更
1880
+
1881
+ v2.1.16(2010.08.30)
1882
+ <バグ修正>
1883
+ <機能改善>
1884
+ <仕様変更>
1885
+ ・プログラムの起動時と画面のフォーカス直後のマウスクリックはクリックと見なさないように変更
1886
+  (Miyako側では、フォーカスのためのクリックと判断できないために追加した処置)
1887
+ ・InitiativeScenarioEngine#selecting_innerの呼び出しタイミングを変更(システム内の選択処理を終えた直後)
1888
+ ・TextBox#attach_cursorの内部処理変更
1889
+ <ファイル追加>
1890
+ <ファイル削除>
1891
+ <グローバル変数追加>
1892
+ <定数追加>
1893
+ <定数削除>
1894
+ <構造体追加>
1895
+ <クラス追加>
1896
+ <モジュール追加>
1897
+ <mixin>
1898
+ <クラス・モジュールメソッド追加>
1899
+ ・Input.mouse_x
1900
+ ・Input.mouse_y
1901
+ ・Input.mouse_dx
1902
+ ・Input.mouse_dy
1903
+ ・Input.key_focus?
1904
+ ・Input.window_minimize?
1905
+ ・Input.mouse_cursor_inner_change?
1906
+ ・Input.key_focus_change?
1907
+ ・Input.window_minimize_change?
1908
+ ・Input.btn_state
1909
+ ・Input.mouse_state
1910
+ <クラス・モジュールメソッド廃止>
1911
+ <モジュール関数追加>
1912
+ <モジュール関数廃止>
1913
+ <インスタンスメソッド追加>
1914
+ ・TextBox#attach_cursor?
1915
+ ・InitiativeScenarioEngine#select_mouse_enable?
1916
+ ・InitiativeScenarioEngine#select_key_enable?
1917
+ <インスタンスメソッド廃止>
1918
+ <ドキュメント>
1919
+ ・リファレンスマニュアルの反映
1920
+ <その他>
1921
+
1833
1922
  *******************************************************************************
1834
1923
  このReadMeファイルは「れ~どめ~えじた~」によって作成されました。
@@ -171,6 +171,19 @@ module Miyako
171
171
  end
172
172
  end
173
173
 
174
+ #外部との共用変数を収めるところ
175
+ @@common_use = {}
176
+
177
+ def InitiativeYuki.[](key)
178
+ @@common_use[key]
179
+ end
180
+
181
+ def InitiativeYuki.[]=(key, value)
182
+ @@common_use[key] = value
183
+ value
184
+ end
185
+
186
+ attr_reader :common_use
174
187
  attr_reader :visibles, :pre_visibles, :bgs, :base
175
188
  attr_reader :valign
176
189
  #release_checks:: ポーズ解除を問い合わせるブロックの配列。
@@ -187,6 +200,9 @@ module Miyako
187
200
  #(2)キャンセルボタンを押した?(true/false)
188
201
  #(3)キーパッドの移動量を示す配列([dx,dy])
189
202
  #(4)マウスの位置を示す配列([x,y])
203
+ #<<(2.1.15-追加、省略可能)>>
204
+ #(5)現在指しているコマンドは選択可能?(true/false)
205
+ #(6)現在指しているコマンドの結果
190
206
  #callメソッドを持つブロックが使用可能。
191
207
  attr_reader :selecting_procs
192
208
 
@@ -255,6 +271,9 @@ module Miyako
255
271
 
256
272
  @mouse_enable = true
257
273
 
274
+ @select_mouse_enable = true
275
+ @select_key_enable = false
276
+
258
277
  @result = nil
259
278
  @plot_result = nil
260
279
 
@@ -300,6 +319,8 @@ module Miyako
300
319
 
301
320
  @engine_stack = []
302
321
 
322
+ @common_use = {}
323
+
303
324
  raise MiyakoProcError, "Argument count is not same block parameter count!" if proc && proc.arity.abs != params.length
304
325
  instance_exec(*params, &proc) if block_given?
305
326
  end
@@ -436,6 +457,15 @@ module Miyako
436
457
  return false
437
458
  end
438
459
 
460
+ def [](key)
461
+ @common_use[key] || @@common_use[key]
462
+ end
463
+
464
+ def []=(key, value)
465
+ @common_use[key] = value
466
+ value
467
+ end
468
+
439
469
  #===変数を参照する
440
470
  #[[Yukiスクリプトとして利用可能]]
441
471
  #変数の管理オブジェクトを、ハッシュとして参照する。
@@ -1024,6 +1054,32 @@ module Miyako
1024
1054
  self.instance_exec(&plot_block)
1025
1055
  end
1026
1056
 
1057
+ #===プロット処理中に別のプロットを呼び出す
1058
+ #呼び出し可能なプロットは以下の2種類。(上から優先度が高い順)
1059
+ #
1060
+ #1)引数prot_proc(Procクラスのインスタンス)
1061
+ #
1062
+ #2)引数として渡したブロック
1063
+ #
1064
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
1065
+ #返却値:: プロットの実行結果を返す
1066
+ def call_plot_params(plot_proc, *params)
1067
+ return self.instance_exec(*params, &plot_proc)
1068
+ end
1069
+
1070
+ #===プロット処理中に別のプロットを呼び出す
1071
+ #呼び出し可能なプロットは以下の2種類。(上から優先度が高い順)
1072
+ #
1073
+ #1)引数prot_proc(Procクラスのインスタンス)
1074
+ #
1075
+ #2)引数として渡したブロック
1076
+ #
1077
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
1078
+ #返却値:: プロットの実行結果を返す
1079
+ def call_plot_block(*params, &plot_block)
1080
+ return self.instance_exec(*params, &plot_block)
1081
+ end
1082
+
1027
1083
  #===ポーズ解除問い合わせメソッド配列を初期状態に戻す
1028
1084
  #返却値:: 自分自身を返す
1029
1085
  def reset_release_checks
@@ -1413,6 +1469,14 @@ module Miyako
1413
1469
  return pause.clear
1414
1470
  end
1415
1471
 
1472
+ def select_mouse_enable?
1473
+ @select_mouse_enable
1474
+ end
1475
+
1476
+ def select_key_enable?
1477
+ @select_key_enable
1478
+ end
1479
+
1416
1480
  #===コマンドを表示する
1417
1481
  #[[Yukiスクリプトとして利用可能]]
1418
1482
  #表示対象のコマンド群をCommand構造体の配列で示す。
@@ -1454,17 +1518,38 @@ module Miyako
1454
1518
  end
1455
1519
 
1456
1520
  @result = nil
1521
+ @select_mouse_enable = true
1522
+ @select_key_enable = false
1457
1523
  selecting = true
1458
1524
  reset_selecting
1459
1525
  while selecting
1460
1526
  pre_process
1461
- @base.selecting_inner(self) if @base
1462
- @select_ok = true if @ok_checks.inject(false){|r, c| r |= c.call }
1463
- @select_cancel = true if @cancel && @cancel_checks.inject(false){|r, c| r |= c.call }
1464
1527
  @select_amount = @key_amount_proc.call
1465
1528
  @mouse_amount = @mouse_amount_proc.call
1529
+ if @select_amount != [0,0]
1530
+ @select_mouse_enable = false
1531
+ @select_key_enable = true
1532
+ elsif Input.mouse_dx != 0 and Input.mouse_dy != 0
1533
+ @select_mouse_enable = true
1534
+ @select_key_enable = false
1535
+ else
1536
+ @select_mouse_enable = false
1537
+ @select_key_enable = false
1538
+ end
1539
+ @select_ok = true if @ok_checks.inject(false){|r, c| r |= c.call }
1540
+ @select_cancel = true if @cancel && @cancel_checks.inject(false){|r, c| r |= c.call }
1466
1541
  @selecting_procs.each{|sp|
1467
- sp.call(@select_ok, @select_cansel, @select_amount, @mouse_amount)
1542
+ case sp.arity
1543
+ when 6
1544
+ sp.call(@select_ok, @select_cansel,
1545
+ @select_amount, @mouse_amount,
1546
+ @command_box.enable_choice?, @command_box.result
1547
+ )
1548
+ else
1549
+ sp.call(@select_ok, @select_cansel,
1550
+ @select_amount, @mouse_amount
1551
+ )
1552
+ end
1468
1553
  }
1469
1554
  if @select_ok
1470
1555
  unless @command_box.enable_choice?
@@ -1485,13 +1570,16 @@ module Miyako
1485
1570
  @text_box.release
1486
1571
  selecting = false
1487
1572
  reset_selecting
1488
- elsif @select_amount != [0,0]
1573
+ elsif @select_amount != [0,0] and @select_key_enable
1489
1574
  @command_box.move_cursor(*@select_amount)
1490
1575
  reset_selecting
1491
- elsif @mouse_amount
1576
+ elsif @mouse_amount and @select_mouse_enable
1492
1577
  @command_box.attach_cursor(*@mouse_amount.to_a) if @mouse_enable
1493
1578
  reset_selecting
1579
+ elsif Input.mouse_cursor_inner?
1580
+ @command_box.attach_cursor(Input.mouse_x, Input.mouse_y) if @mouse_enable
1494
1581
  end
1582
+ @base.selecting_inner(self) if @base
1495
1583
  post_process
1496
1584
  end
1497
1585
  @post_cancel.each{|proc| proc.call}
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  =begin
3
3
  --
4
4
  Miyako v2.1
@@ -108,7 +108,10 @@ module Miyako
108
108
  :click => {:left => false, :middle => false, :right => false, :interval => 200},
109
109
  :drag => {:left => false, :middle => false, :right => false, :x => 0, :y => 0},
110
110
  :drop => {:left => false, :middle => false, :right => false, :succeed => true},
111
- :inner => true}
111
+ :inner => false, :focus => false, :mini => false}
112
+ @@mouse_inner = false
113
+ @@key_focus = false
114
+ @@app_minimize = false
112
115
 
113
116
  @@initialized = false
114
117
 
@@ -225,7 +228,7 @@ module Miyako
225
228
  def Input::process_mousebuttondown(e) #:nodoc:
226
229
  return unless @@enable_mouse
227
230
  set_mouse_button(:trigger, e.button)
228
- return unless @@mouse[:inner]
231
+ return unless @@mouse_inner
229
232
  click_mouse_button(:click, e.button)
230
233
  set_mouse_button(:drag, e.button)
231
234
  @@mouse[:drag][:x] = @@mouse[:pos][:x]
@@ -249,8 +252,20 @@ module Miyako
249
252
  end
250
253
 
251
254
  def Input::process_active(e) #:nodoc:
252
- return unless @@enable_mouse
253
- @@mouse[:inner] = e.gain if e.state == 1
255
+ if e.state & 1 == 1
256
+ return unless @@enable_mouse
257
+ @@mouse[:inner] = true
258
+ @@mouse_inner = e.gain
259
+ end
260
+ if e.state & 2 == 2
261
+ @@mouse[:focus] = true
262
+ @@key_focus = e.gain
263
+ [:left, :middle, :right].each{|key| @@mouse[:click][key] = false }
264
+ end
265
+ if e.state & 4 == 4
266
+ @@mouse[:mini] = true
267
+ @@app_minimize = !e.gain
268
+ end
254
269
  end
255
270
 
256
271
  def Input::process_default(e) #:nodoc:
@@ -297,6 +312,9 @@ module Miyako
297
312
  @@mouse[:click][e] = false
298
313
  @@mouse[:drop][e] = false
299
314
  }
315
+ @@mouse[:inner] = false
316
+ @@mouse[:focus] = false
317
+ @@mouse[:mini] = false
300
318
  e_list = []
301
319
  while e = SDL::Event2.poll
302
320
  e_list << e
@@ -311,6 +329,15 @@ module Miyako
311
329
  }
312
330
  end
313
331
 
332
+ def Input::after_exec
333
+ x = @@mouse[:pos][:x]
334
+ y = @@mouse[:pos][:y]
335
+ if (@@mouse[:click][:left] or @@mouse[:click][:middle] or @@mouse[:click][:right]) and !@@key_focus and x>=0 and x<Screen.w and y>=0 and y<Screen.h
336
+ @@key_focus = true
337
+ [:left, :middle, :right].each{|key| @@mouse[:click][key] = false }
338
+ end
339
+ end
340
+
314
341
  #===指定のボタンがすべて押下状態かを問い合わせるメソッド
315
342
  #_inputs_:: ボタンを示すシンボル。複数指定可能
316
343
  #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
@@ -414,6 +441,22 @@ module Miyako
414
441
  return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y])
415
442
  end
416
443
 
444
+ def Input::mouse_x
445
+ return @@enable_mouse ? @@mouse[:pos][:x] : -1
446
+ end
447
+
448
+ def Input::mouse_y
449
+ return @@enable_mouse ? @@mouse[:pos][:y] : -1
450
+ end
451
+
452
+ def Input::mouse_dx
453
+ return @@enable_mouse ? @@mouse[:pos][:dx] : 0
454
+ end
455
+
456
+ def Input::mouse_dy
457
+ return @@enable_mouse ? @@mouse[:pos][:dy] : 0
458
+ end
459
+
417
460
  #===マウスの移動量を取得する
418
461
  #求める値は、{:x=>n,:y=>n}で示すハッシュとする
419
462
  #移動量は、右下方向を正とする
@@ -498,10 +541,41 @@ module Miyako
498
541
  #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
499
542
  #返却値:: マウスカーソルが画面内ならtrueを返す
500
543
  def Input::mouse_cursor_inner?
544
+ return false unless @@enable_mouse
545
+ return @@mouse_inner
546
+ end
547
+
548
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
549
+ #返却値:: マウスカーソルが画面内ならtrueを返す
550
+ def Input::key_focus?
551
+ return @@key_focus
552
+ end
553
+
554
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
555
+ #返却値:: マウスカーソルが画面内ならtrueを返す
556
+ def Input::window_minimize?
557
+ return @@app_minimize
558
+ end
559
+
560
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
561
+ #返却値:: マウスカーソルが画面内ならtrueを返す
562
+ def Input::mouse_cursor_inner_change?
501
563
  return false unless @@enable_mouse
502
564
  return @@mouse[:inner]
503
565
  end
504
566
 
567
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
568
+ #返却値:: マウスカーソルが画面内ならtrueを返す
569
+ def Input::key_focus_change?
570
+ return @@mouse[:focus]
571
+ end
572
+
573
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
574
+ #返却値:: マウスカーソルが画面内ならtrueを返す
575
+ def Input::window_minimize_change?
576
+ return @@mouse[:mini]
577
+ end
578
+
505
579
  #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える
506
580
  def Input::enable_toggle_screen_mode
507
581
  @@toggle_screen_mode = true
@@ -517,5 +591,13 @@ module Miyako
517
591
  def Input::toggle_screen_mode?
518
592
  return @@toggle_screen_mode
519
593
  end
594
+
595
+ def Input::btn_state
596
+ @@btn
597
+ end
598
+
599
+ def Input::mouse_state
600
+ @@mouse
601
+ end
520
602
  end
521
603
  end
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  =begin
3
3
  --
4
4
  Miyako v2.1
@@ -592,11 +592,16 @@ module Miyako
592
592
  end
593
593
  else
594
594
  @choices.non_select if @pre_attach
595
+ @select_cursor.snap(@choices.body) if @select_cursor
595
596
  end
596
597
  @pre_attach = attach
597
598
  return self
598
599
  end
599
600
 
601
+ def attach_cursor?
602
+ @choices.attach?(Input.mouse_x, Input.mouse_y)
603
+ end
604
+
600
605
  #===マウスカーソルの位置にコマンドがあるかどうかを問い合わせる
601
606
  #マウスカーソルがどれかのコマンドの上にあるときはtrue、どれにも当たっていないときはfalseを返す
602
607
  #_x_:: マウスカーソルの位置(x軸方向)
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  =begin
3
3
  --
4
4
  Miyako v2.1
@@ -45,17 +45,11 @@ module Miyako
45
45
  return steps
46
46
  end
47
47
 
48
- def Utility.product_liner_inner_f(x1, y1, x2, y2, amount) #:nodoc:
49
- array = nil
50
- step_x = get_step_array_f(x1, x2, amount)
51
- step_y = get_step_array_f(y1, y2, amount)
52
- dx = x2 - x1
53
- dy = y2 - y1
54
- a = dx < Float::EPSILON ? dy.to_f : dy.to_f / dx.to_f
55
- b = y1.to_f - a * x1.to_f
56
- array = [[x1,y1] , [x2,y2]] + step_x.map{|x| [x, (a * x.to_f + b).to_i]}
57
- array += step_y.map{|y| [((y.to_f - b) / a).to_i, y]} if (a.abs >= Float::EPSILON)
58
- return array.uniq
48
+ def Utility.product_liner_xy_f(x1, y1, x2, y2, amount)
49
+ distance = Utility.interval2(x1,y1,x2,y2)
50
+ degree = Utility.radian2(x1,y1,x2,y2,distance)
51
+ cos, sin = Math.cos(degree), Math.sin(degree)
52
+ (0..distance).step(amount).with_object([]){|n, arr| arr << [x1 + n * cos, y1 + n * sin]} << [x2,y2]
59
53
  end
60
54
 
61
55
  #===矩形内の対角線の座標リストを実数で取得する
@@ -77,7 +71,7 @@ module Miyako
77
71
  y1 = rect[1]
78
72
  x2 = x1 + rect[2] - 1
79
73
  y2 = y1 + rect[3] - 1
80
- return product_liner_inner_f(x1, y1, x2, y2, amount)
74
+ return product_liner_xy_f(x1, y1, x2, y2, amount)
81
75
  end
82
76
 
83
77
  #===矩形内の対角線の座標リストを実数で取得する
@@ -95,29 +89,16 @@ module Miyako
95
89
  def Utility.product_liner_by_square_f(square, amount = 1.0)
96
90
  raise MiyakoValueError, "Illegal amount! #{amount}" if amount < Float::EPSILON
97
91
  return [] if (square[2] - square[0]) < Float::EPSILON || (square[3] - square[1]) < Float::EPSILON
98
- return product_liner_inner_f(*square, amount)
92
+ return product_liner_xy_f(*square, amount)
99
93
  end
100
94
 
101
- def Utility.product_liner_inner(x1, y1, x2, y2, amount) #:nodoc:
102
- array = nil
103
- step_x = []
104
- step_y = []
105
- dx = x2 - x1
106
- dy = y2 - y1
107
- a = 0.0
108
- if [x1, y1, x2, y2, amount].all?{|v| v.methods.include?(:step)}
109
- step_x = x1 < x2 ? x1.step(x2, amount).to_a : x1.step(x2, -amount).to_a
110
- step_y = y1 < y2 ? y1.step(y2, amount).to_a : y1.step(y2, -amount).to_a
111
- a = dx == 0 ? dy.to_f : dy.to_f / dx.to_f
112
- else
113
- step_x = get_step_array_f(x1, x2, amount)
114
- step_y = get_step_array_f(y1, y2, amount)
115
- a = dx < Float::EPSILON ? dy.to_f : dy.to_f / dx.to_f
116
- end
117
- b = y1.to_f - a * x1.to_f
118
- array = [[x1,y1] , [x2,y2]] + step_x.map{|x| [x, (a * x.to_f + b).to_i]}
119
- array += step_y.map{|y| [((y.to_f - b) / a).to_i, y]} if (a.abs >= Float::EPSILON)
120
- return array.uniq
95
+ # ToDo: 線形補完を使う
96
+ # -> 使った(2010.06.20)
97
+ def Utility.product_liner_xy(x1, y1, x2, y2, amount) #:nodoc:
98
+ distance = Utility.interval2(x1,y1,x2,y2)
99
+ degree = Utility.radian2(x1,y1,x2,y2,distance)
100
+ cos, sin = Math.cos(degree), Math.sin(degree)
101
+ (0..distance).step(amount).with_object([]){|n, arr| arr << [x1+(n*cos).to_i, y1+(n*sin).to_i]} << [x2,y2]
121
102
  end
122
103
 
123
104
  #===矩形内の対角線の座標リストを取得する
@@ -138,7 +119,7 @@ module Miyako
138
119
  y1 = rect[1]
139
120
  x2 = x1 + rect[2] - 1
140
121
  y2 = y1 + rect[3] - 1
141
- return product_liner_inner(x1, y1, x2, y2, amount)
122
+ return product_liner_xy(x1, y1, x2, y2, amount)
142
123
  end
143
124
 
144
125
  #===矩形内の対角線の座標リストを取得する
@@ -155,7 +136,7 @@ module Miyako
155
136
  def Utility.product_liner_by_square(square, amount = 1)
156
137
  raise MiyakoValueError, "Illegal amount! #{amount}" if amount <= 0
157
138
  return [] if (square[2] - square[0]) == 0 || (square[3] - square[1]) == 0
158
- return product_liner_inner(*square, amount)
139
+ return product_liner_xy(*square, amount)
159
140
  end
160
141
 
161
142
  def Utility.product_inner(x1, y1, x2, y2, size) #:nodoc:
@@ -244,22 +225,111 @@ module Miyako
244
225
  return d < Float::EPSILON ? 0.0 : d
245
226
  end
246
227
 
228
+ #===2点間の距離を算出する
229
+ # 2点(点1、点2)がどの程度離れているかを算出する。
230
+ # 返ってくる値は、正の実数で返ってくる
231
+ #_x1_:: 点1の位置(x)
232
+ #_y1_:: 点1の位置(y)
233
+ #_x2_:: 点2の位置(x)
234
+ #_y2_:: 点2の位置(y)
235
+ #返却値:: 2点間の距離
236
+ def Utility.interval2(x1, y1, x2, y2)
237
+ #2点間の距離を求める
238
+ d = Math.sqrt(((x1.to_f - x2.to_f) ** 2) +
239
+ ((y1.to_f - y2.to_f) ** 2))
240
+ return d < Float::EPSILON ? 0.0 : d
241
+ end
242
+
243
+ #===2点間の傾きを角度で算出する
244
+ # 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
245
+ # 角度の単位は度(0.0<=θ<360.0)
246
+ # 返ってくる値は、正の実数で返ってくる
247
+ #_point1_:: 点1の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
248
+ #_point2_:: 点2の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
249
+ #返却値:: 2点間の傾き
250
+ def Utility.theta(point1, point2, distance = nil)
251
+ theta = (Utility.radian(point1,point2,distance) / (2 * Math::PI)) * 360.0
252
+ return theta < Float::EPSILON ? 0.0 : theta
253
+ end
254
+
247
255
  #===2点間の傾きを角度で算出する
248
256
  # 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
249
257
  # 角度の単位は度(0.0<=θ<360.0)
250
258
  # 返ってくる値は、正の実数で返ってくる
259
+ #_x1_:: 点1の位置(x)
260
+ #_y1_:: 点1の位置(y)
261
+ #_x2_:: 点2の位置(x)
262
+ #_y2_:: 点2の位置(y)
263
+ #返却値:: 2点間の傾き
264
+ def Utility.theta2(x1, y1, x2, y2, distance = nil)
265
+ theta = (Utility.radian2(x1,y1,x2,y2,distance) / (2 * Math::PI)) * 360.0
266
+ return theta < Float::EPSILON ? 0.0 : theta
267
+ end
268
+
269
+ #===2点間の傾きをラジアンで算出する
270
+ # 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
271
+ # 角度の単位は度(0.0<=θ<360.0)
272
+ # 返ってくる値は、正の実数で返ってくる
251
273
  #_point1_:: 点1の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
252
274
  #_point2_:: 点2の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
253
275
  #返却値:: 2点間の傾き
254
- def Utility.theta(point1, point2)
276
+ def Utility.radian(point1, point2, distance = nil)
255
277
  #2点間の距離を求める
256
- d = Math.sqrt(((point1[0].to_f - point2[0].to_f) ** 2) +
257
- ((point1[1].to_f - point2[1].to_f) ** 2))
258
- x = point2[0].to_f - point[1].to_f
278
+ d = distance || Math.sqrt(((point1[0].to_f - point2[0].to_f) ** 2) +
279
+ ((point1[1].to_f - point2[1].to_f) ** 2))
280
+ x = point2[0].to_f - point1[0].to_f
259
281
  # 傾き・幅が0のときは傾きは0度
260
282
  return 0.0 if (x.abs < Float::EPSILON or d < Float::EPSILON)
261
- theta = (Math.acos(x / d) / (2 * Math::PI)) * 360.0
262
- return theta < Float::EPSILON ? 0.0 : theta
283
+ theta = Math.acos(x / d)
284
+ return theta < Float::EPSILON ? 0.0 : (point2[1]-point1[1]<0 ? 2*Math::PI-theta : theta)
285
+ end
286
+
287
+ #===2点間の傾きをラジアンで算出する
288
+ # 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
289
+ # 角度の単位は度(0.0<=θ<360.0)
290
+ # 返ってくる値は、正の実数で返ってくる
291
+ #_x1_:: 点1の位置(x)
292
+ #_y1_:: 点1の位置(y)
293
+ #_x2_:: 点2の位置(x)
294
+ #_y2_:: 点2の位置(y)
295
+ #返却値:: 2点間の傾き
296
+ def Utility.radian2(x1, y1, x2, y2, distance = nil)
297
+ #2点間の距離を求める
298
+ d = distance || Math.sqrt(((x1.to_f - x2.to_f) ** 2) +
299
+ ((y1.to_f - y2.to_f) ** 2))
300
+ x = x2.to_f - x1.to_f
301
+ # 傾き・幅が0のときは傾きは0度
302
+ return 0.0 if (x.abs < Float::EPSILON or d < Float::EPSILON)
303
+ theta = Math.acos(x / d)
304
+ return theta < Float::EPSILON ? 0.0 : (y2-y1<0 ? 2*Math::PI-theta : theta)
305
+ end
306
+
307
+ #===2点間の傾きを角度で算出する
308
+ # 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
309
+ # 角度の単位は度(0.0<=θ<360.0)
310
+ # 返ってくる値は、正の実数で返ってくる
311
+ #_point1_:: 点1の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
312
+ #_point2_:: 点2の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
313
+ #返却値:: 2点間の傾き
314
+ def Utility.degree(point1, point2)
315
+ return 0.0 if (point2[0].to_f-point1[0].to_f < Float::EPSILON)
316
+ degree = (point2[1]-point1[1]).to_f/(point2[0]-point1[0]).to_f
317
+ return degree < Float::EPSILON ? 0.0 : degree
318
+ end
319
+
320
+ #===2点間の傾きを角度で算出する
321
+ # 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
322
+ # 角度の単位は度(0.0<=θ<360.0)
323
+ # 返ってくる値は、正の実数で返ってくる
324
+ #_x1_:: 点1の位置(x)
325
+ #_y1_:: 点1の位置(y)
326
+ #_x2_:: 点2の位置(x)
327
+ #_y2_:: 点2の位置(y)
328
+ #返却値:: 2点間の傾き
329
+ def Utility.degree2(x1, y1, x2, y2)
330
+ return 0.0 if (x2.to_f-x1[0].to_f < Float::EPSILON)
331
+ degree = (y2-y1).to_f/(x2-x1).to_f
332
+ return degree < Float::EPSILON ? 0.0 : degree
263
333
  end
264
334
 
265
335
  #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  =begin
3
3
  --
4
4
  Miyako v2.1
@@ -136,6 +136,18 @@ module Miyako
136
136
  end
137
137
  end
138
138
 
139
+ #外部との共用変数を収めるところ
140
+ @@common_use = {}
141
+
142
+ def Yuki.[](key)
143
+ @@common_use[key]
144
+ end
145
+
146
+ def Yuki.[]=(key, value)
147
+ @@common_use[key] = value
148
+ value
149
+ end
150
+
139
151
  #===Yuki#update実行中に行わせる処理を実装するテンプレートメソッド
140
152
  #但し、メソッド本体は、update_inner=メソッドで設定する必要がある
141
153
  #_yuki_:: 実行中のYukiクラスインスタンス
@@ -164,6 +176,7 @@ module Miyako
164
176
  def update_clear(yuki)
165
177
  end
166
178
 
179
+ attr_reader :common_use
167
180
  attr_accessor :visible
168
181
  attr_accessor :update_inner, :update_text, :update_cr, :update_clear
169
182
  attr_reader :valign, :visibles, :pre_visibles, :bgs
@@ -181,6 +194,9 @@ module Miyako
181
194
  #(2)キャンセルボタンを押した?(true/false)
182
195
  #(3)キーパッドの移動量を示す配列([dx,dy])
183
196
  #(4)マウスの位置を示す配列([x,y])
197
+ #<<(2.1.15-追加、省略可能)>>
198
+ #(5)現在指しているコマンドは選択可能?(true/false)
199
+ #(6)現在指しているコマンドの結果
184
200
  #callメソッドを持つブロックが使用可能。
185
201
  attr_reader :selecting_procs
186
202
 
@@ -304,6 +320,8 @@ module Miyako
304
320
  @now_page = nil
305
321
  @first_page = nil
306
322
 
323
+ @common_use = {}
324
+
307
325
  raise MiyakoProcError, "Argument count is not same block parameter count!" if proc && proc.arity.abs != params.length
308
326
  instance_exec(*params, &proc) if block_given?
309
327
  end
@@ -429,6 +447,15 @@ module Miyako
429
447
  @over_yuki.update_animation if @over_yuki && @over_yuki.executing?
430
448
  end
431
449
 
450
+ def [](key)
451
+ @common_use[key] || @@common_use[key]
452
+ end
453
+
454
+ def []=(key, value)
455
+ @common_use[key] = value
456
+ value
457
+ end
458
+
432
459
  #===変数を参照する
433
460
  #[[Yukiスクリプトとして利用可能]]
434
461
  #変数の管理オブジェクトを、ハッシュとして参照する。
@@ -1019,6 +1046,32 @@ module Miyako
1019
1046
  self.instance_exec(&plot_block)
1020
1047
  end
1021
1048
 
1049
+ #===プロット処理中に別のプロットを呼び出す
1050
+ #呼び出し可能なプロットは以下の2種類。(上から優先度が高い順)
1051
+ #
1052
+ #1)引数prot_proc(Procクラスのインスタンス)
1053
+ #
1054
+ #2)引数として渡したブロック
1055
+ #
1056
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
1057
+ #返却値:: プロットの実行結果を返す
1058
+ def call_plot_params(plot_proc, *params)
1059
+ return self.instance_exec(*params, &plot_proc)
1060
+ end
1061
+
1062
+ #===プロット処理中に別のプロットを呼び出す
1063
+ #呼び出し可能なプロットは以下の2種類。(上から優先度が高い順)
1064
+ #
1065
+ #1)引数prot_proc(Procクラスのインスタンス)
1066
+ #
1067
+ #2)引数として渡したブロック
1068
+ #
1069
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
1070
+ #返却値:: プロットの実行結果を返す
1071
+ def call_plot_block(*params, &plot_block)
1072
+ return self.instance_exec(*params, &plot_block)
1073
+ end
1074
+
1022
1075
  #===プロット処理が実行中かどうかを確認する
1023
1076
  #返却値:: プロット処理実行中の時はtrueを返す
1024
1077
  def executing?
@@ -1490,7 +1543,19 @@ module Miyako
1490
1543
  return unless @selecting
1491
1544
  return unless @command_box.selecting?
1492
1545
  @selecting_procs.each{|sp|
1493
- sp.call(@select_ok, @select_cansel, @select_amount, @mouse_amount)
1546
+ case sp.arity
1547
+ when 6
1548
+ sp.call(
1549
+ @select_ok, @select_cansel,
1550
+ @select_amount, @mouse_amount,
1551
+ @command_box.enable_choice?, @command_box.result
1552
+ )
1553
+ else
1554
+ sp.call(
1555
+ @select_ok, @select_cansel,
1556
+ @select_amount, @mouse_amount
1557
+ )
1558
+ end
1494
1559
  }
1495
1560
  if @select_ok
1496
1561
  return @on_disable.each{|proc| proc.call} unless @command_box.enable_choice?
data/lib/Miyako/miyako.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #=コンテンツ作成ライブラリMiyako2.1
4
4
  #
5
5
  #Authors:: サイロス誠
6
- #Version:: 2.1.13
6
+ #Version:: 2.1.16
7
7
  #Copyright:: 2007-2010 Cyross Makoto
8
8
  #License:: LGPL2.1
9
9
  #
@@ -63,7 +63,7 @@ Thread.abort_on_exception = true
63
63
 
64
64
  #==Miyako基幹モジュール
65
65
  module Miyako
66
- VERSION = "2.1.14"
66
+ VERSION = "2.1.16"
67
67
 
68
68
  #===アプリケーション実行中に演奏する音楽のサンプリングレートを指定する
69
69
  #単位はHz(周波数)
data/miyako_input_audio.c CHANGED
@@ -53,6 +53,7 @@ static volatile ID id_poll = Qnil;
53
53
  static volatile ID id_call = Qnil;
54
54
  static volatile ID id_reset_ticks = Qnil;
55
55
  static volatile ID id_setup_ticks = Qnil;
56
+ static volatile ID id_after = Qnil;
56
57
  static volatile int zero = 0;
57
58
  static volatile int one = 1;
58
59
  static volatile VALUE sy_pushed = Qnil;
@@ -61,6 +62,9 @@ static volatile VALUE sy_dx = Qnil;
61
62
  static volatile VALUE sy_dy = Qnil;
62
63
  static volatile VALUE sy_click = Qnil;
63
64
  static volatile VALUE sy_drop = Qnil;
65
+ static volatile VALUE sy_inner = Qnil;
66
+ static volatile VALUE sy_focus = Qnil;
67
+ static volatile VALUE sy_mini = Qnil;
64
68
  static volatile VALUE sy_left = Qnil;
65
69
  static volatile VALUE sy_right = Qnil;
66
70
  static volatile VALUE sy_middle = Qnil;
@@ -111,6 +115,9 @@ static VALUE input_update(VALUE self)
111
115
  rb_hash_aset(drop, sy_left, Qfalse);
112
116
  rb_hash_aset(drop, sy_middle, Qfalse);
113
117
  rb_hash_aset(drop, sy_right, Qfalse);
118
+ rb_hash_aset(mouse, sy_inner, Qfalse);
119
+ rb_hash_aset(mouse, sy_focus, Qfalse);
120
+ rb_hash_aset(mouse, sy_mini, Qfalse);
114
121
 
115
122
  #if 0
116
123
  e_list = rb_ary_new();
@@ -154,6 +161,7 @@ static VALUE input_update(VALUE self)
154
161
  e = rb_funcall(cEvent, id_poll, 0);
155
162
  }
156
163
  #endif
164
+ rb_funcall(self, id_after, 0);
157
165
 
158
166
  return Qnil;
159
167
  }
@@ -288,6 +296,7 @@ void Init_miyako_input_audio()
288
296
  id_countup = rb_intern("loop_count_up");
289
297
  id_reset_ticks = rb_intern("reset_ticks");
290
298
  id_setup_ticks = rb_intern("setup_ticks");
299
+ id_after = rb_intern("after_exec");
291
300
 
292
301
  sy_pushed = ID2SYM(rb_intern("pushed"));
293
302
  sy_pos = ID2SYM(rb_intern("pos"));
@@ -295,6 +304,9 @@ void Init_miyako_input_audio()
295
304
  sy_dy = ID2SYM(rb_intern("dy"));
296
305
  sy_click = ID2SYM(rb_intern("click"));
297
306
  sy_drop = ID2SYM(rb_intern("drop"));
307
+ sy_inner = ID2SYM(rb_intern("inner"));
308
+ sy_focus = ID2SYM(rb_intern("focus"));
309
+ sy_mini = ID2SYM(rb_intern("mini"));
298
310
  sy_left = ID2SYM(rb_intern("left"));
299
311
  sy_right = ID2SYM(rb_intern("right"));
300
312
  sy_middle = ID2SYM(rb_intern("middle"));
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  #キャラクタ管理クラス
3
3
  class PChara # Player Character
4
4
  extend Forwardable
@@ -27,7 +27,7 @@ class PChara # Player Character
27
27
 
28
28
  # マップの表示座標と実座標とのマージンを設定
29
29
  def margin
30
- return Size.new(-@spr.x, -@spr.y)
30
+ return Size.new(-@anim.x, -@anim.y)
31
31
  end
32
32
 
33
33
  def turn(d)
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  class MainScene
3
3
  include Story::Scene
4
4
 
Binary file
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-miyako
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 43
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 1
9
- - 14
10
- version: 2.1.14
9
+ - 16
10
+ version: 2.1.16
11
11
  platform: ruby
12
12
  authors:
13
13
  - Cyross Makoto
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-11 00:00:00 +09:00
18
+ date: 2010-08-29 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies: []
21
21