ruby-miyako-mswin32 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 (148) hide show
  1. data/README +1115 -0
  2. data/img/cursor.png +0 -0
  3. data/img/cursors.png +0 -0
  4. data/img/dice.png +0 -0
  5. data/img/wait_cursor.png +0 -0
  6. data/img/win_base.png +0 -0
  7. data/img/window.png +0 -0
  8. data/install_miyako.rb +87 -0
  9. data/lib/Miyako/API/audio.rb +584 -0
  10. data/lib/Miyako/API/basic_data.rb +1026 -0
  11. data/lib/Miyako/API/bitmap.rb +534 -0
  12. data/lib/Miyako/API/choices.rb +481 -0
  13. data/lib/Miyako/API/collision.rb +638 -0
  14. data/lib/Miyako/API/diagram.rb +586 -0
  15. data/lib/Miyako/API/drawing.rb +151 -0
  16. data/lib/Miyako/API/exceptions.rb +105 -0
  17. data/lib/Miyako/API/fixedmap.rb +462 -0
  18. data/lib/Miyako/API/font.rb +430 -0
  19. data/lib/Miyako/API/input.rb +456 -0
  20. data/lib/Miyako/API/layout.rb +644 -0
  21. data/lib/Miyako/API/map.rb +583 -0
  22. data/lib/Miyako/API/map_event.rb +222 -0
  23. data/lib/Miyako/API/modules.rb +357 -0
  24. data/lib/Miyako/API/movie.rb +166 -0
  25. data/lib/Miyako/API/parts.rb +188 -0
  26. data/lib/Miyako/API/plane.rb +205 -0
  27. data/lib/Miyako/API/screen.rb +341 -0
  28. data/lib/Miyako/API/shape.rb +443 -0
  29. data/lib/Miyako/API/sprite.rb +773 -0
  30. data/lib/Miyako/API/sprite_animation.rb +494 -0
  31. data/lib/Miyako/API/sprite_list.rb +1135 -0
  32. data/lib/Miyako/API/spriteunit.rb +168 -0
  33. data/lib/Miyako/API/story.rb +350 -0
  34. data/lib/Miyako/API/textbox.rb +773 -0
  35. data/lib/Miyako/API/utility.rb +419 -0
  36. data/lib/Miyako/API/viewport.rb +190 -0
  37. data/lib/Miyako/API/yuki.rb +1180 -0
  38. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  39. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  40. data/lib/Miyako/EXT/slides.rb +157 -0
  41. data/lib/Miyako/miyako.rb +201 -0
  42. data/lib/Miyako/miyako_no_katana.so +0 -0
  43. data/lib/Miyako/miyako_require_only.rb +35 -0
  44. data/logo/EGSR_logo.png +0 -0
  45. data/logo/EGSR_logo_bg.png +0 -0
  46. data/logo/EGSR_logo_fg.png +0 -0
  47. data/logo/EGSR_title_banner.png +0 -0
  48. data/logo/EGSR_title_logo.png +0 -0
  49. data/logo/miyako.png +0 -0
  50. data/logo/miyako_banner.png +0 -0
  51. data/logo/space.png +0 -0
  52. data/sample/Animation1/m1ku.rb +68 -0
  53. data/sample/Animation1/m1ku_arm_0.png +0 -0
  54. data/sample/Animation1/m1ku_arm_1.png +0 -0
  55. data/sample/Animation1/m1ku_arm_2.png +0 -0
  56. data/sample/Animation1/m1ku_arm_3.png +0 -0
  57. data/sample/Animation1/m1ku_back.jpg +0 -0
  58. data/sample/Animation1/m1ku_body.png +0 -0
  59. data/sample/Animation1/m1ku_eye_0.png +0 -0
  60. data/sample/Animation1/m1ku_eye_1.png +0 -0
  61. data/sample/Animation1/m1ku_eye_2.png +0 -0
  62. data/sample/Animation1/m1ku_eye_3.png +0 -0
  63. data/sample/Animation1/m1ku_hair_front.png +0 -0
  64. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  65. data/sample/Animation1/readme.txt +72 -0
  66. data/sample/Animation2/lex.rb +96 -0
  67. data/sample/Animation2/lex_back.png +0 -0
  68. data/sample/Animation2/lex_body.png +0 -0
  69. data/sample/Animation2/lex_roadroller.png +0 -0
  70. data/sample/Animation2/lex_wheel_0.png +0 -0
  71. data/sample/Animation2/lex_wheel_1.png +0 -0
  72. data/sample/Animation2/lex_wheel_2.png +0 -0
  73. data/sample/Animation2/readme.txt +72 -0
  74. data/sample/Animation2/song_title.png +0 -0
  75. data/sample/Diagram_sample/back.png +0 -0
  76. data/sample/Diagram_sample/chr01.png +0 -0
  77. data/sample/Diagram_sample/chr02.png +0 -0
  78. data/sample/Diagram_sample/cursor.png +0 -0
  79. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  80. data/sample/Diagram_sample/readme.txt +90 -0
  81. data/sample/Diagram_sample/wait_cursor.png +0 -0
  82. data/sample/Room3/blue.rb +297 -0
  83. data/sample/Room3/ending.rb +180 -0
  84. data/sample/Room3/green.rb +220 -0
  85. data/sample/Room3/image/akamatsu.png +0 -0
  86. data/sample/Room3/image/aoyama.png +0 -0
  87. data/sample/Room3/image/congra.png +0 -0
  88. data/sample/Room3/image/congratulation.png +0 -0
  89. data/sample/Room3/image/congratulation_bg.png +0 -0
  90. data/sample/Room3/image/cursor.png +0 -0
  91. data/sample/Room3/image/midori.png +0 -0
  92. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  93. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  94. data/sample/Room3/image/room_blue.png +0 -0
  95. data/sample/Room3/image/room_green.png +0 -0
  96. data/sample/Room3/image/room_red.png +0 -0
  97. data/sample/Room3/image/start.png +0 -0
  98. data/sample/Room3/image/three_doors.png +0 -0
  99. data/sample/Room3/image/wait_cursor.png +0 -0
  100. data/sample/Room3/main.rb +120 -0
  101. data/sample/Room3/main_component.rb +59 -0
  102. data/sample/Room3/readme.txt +76 -0
  103. data/sample/Room3/red.rb +227 -0
  104. data/sample/Room3/room3.rb +25 -0
  105. data/sample/Room3/title.rb +184 -0
  106. data/sample/ball_action_sample.rb +204 -0
  107. data/sample/blit_rop.rb +70 -0
  108. data/sample/cairo_sample.rb +25 -0
  109. data/sample/circle_collision_test.rb +66 -0
  110. data/sample/collision_test.rb +33 -0
  111. data/sample/collision_test2.rb +108 -0
  112. data/sample/fixed_map_test/cursor.png +0 -0
  113. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  114. data/sample/fixed_map_test/map.csv +19 -0
  115. data/sample/fixed_map_test/map_01.png +0 -0
  116. data/sample/fixed_map_test/mapchip.csv +23 -0
  117. data/sample/fixed_map_test/monster.png +0 -0
  118. data/sample/fixed_map_test/readme.txt +72 -0
  119. data/sample/map_test/chara.rb +58 -0
  120. data/sample/map_test/chr1.png +0 -0
  121. data/sample/map_test/cursor.png +0 -0
  122. data/sample/map_test/main_parts.rb +69 -0
  123. data/sample/map_test/main_scene.rb +153 -0
  124. data/sample/map_test/map.png +0 -0
  125. data/sample/map_test/map2.png +0 -0
  126. data/sample/map_test/map_layer.csv +127 -0
  127. data/sample/map_test/map_manager.rb +75 -0
  128. data/sample/map_test/map_test.rb +23 -0
  129. data/sample/map_test/mapchip.csv +21 -0
  130. data/sample/map_test/oasis.rb +71 -0
  131. data/sample/map_test/readme.txt +89 -0
  132. data/sample/map_test/route.rb +157 -0
  133. data/sample/map_test/sea.png +0 -0
  134. data/sample/map_test/town.rb +74 -0
  135. data/sample/map_test/wait_cursor.png +0 -0
  136. data/sample/map_test/window.png +0 -0
  137. data/sample/polygon_test.rb +35 -0
  138. data/sample/rasterscroll.rb +25 -0
  139. data/sample/takahashi.rb +42 -0
  140. data/sample/text.png +0 -0
  141. data/sample/textbox_sample.rb +190 -0
  142. data/sample/transform.rb +54 -0
  143. data/sample/utility_test.rb +73 -0
  144. data/sample/utility_test2.rb +61 -0
  145. data/sample/utility_test3.rb +64 -0
  146. data/sample/utility_test4.rb +73 -0
  147. data/uninstall_miyako.rb +19 -0
  148. metadata +199 -0
@@ -0,0 +1,227 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class Red
3
+ include Story::Scene
4
+ include MainComponent
5
+
6
+ def init
7
+ @yuki = Yuki.new(message_box[:box], command_box[:box]) do |box, cbox|
8
+ select_textbox(box)
9
+ select_commandbox(cbox)
10
+ end
11
+ def @yuki.text_wait(txt, w = 0.3)
12
+ text txt
13
+ wait w
14
+ end
15
+
16
+ @akamatsu = Sprite.new(:file => "image/akamatsu.png", :type => :ck)
17
+ @akamatsu.center!.bottom!
18
+ @yuki.regist_parts(:akamatsu, @akamatsu)
19
+
20
+ @room = Sprite.new(:file=>"image/room_red.png", :type=>:as)
21
+ @room.center!.bottom!
22
+
23
+ var[:akamatsu_aisatsu] = false if var[:akamatsu_aisatsu] == nil
24
+ var[:release_akamatsu_book] = false if var[:release_akamatsu_book] == nil
25
+ var[:search_bookmark] = false if var[:search_bookmark] == nil
26
+ var[:get_bookmark] = false if var[:get_bookmark] == nil
27
+
28
+ @yuki.vars[:var] = var
29
+ @yuki.vars[:command] = get_command
30
+ @yuki.vars[:main_loop] = main_loop
31
+ end
32
+
33
+ def setup
34
+ @yuki.setup
35
+ message_box.start
36
+ command_box.start
37
+ @yuki.start_plot(plot)
38
+ end
39
+
40
+ def get_command
41
+ return [Yuki::Command.new("挨拶する", nil, lambda{var[:akamatsu_aisatsu] == false}, red2),
42
+ Yuki::Command.new("辺りを見る", nil, lambda{var[:akamatsu_aisatsu]==true }, look),
43
+ Yuki::Command.new("話す", nil, lambda{var[:akamatsu_aisatsu]==true }, talk),
44
+ Yuki::Command.new("渡す", nil, lambda{var[:akamatsu_aisatsu] && var[:release_akamatsu_book] && var[:search_bookmark]==false}, send1),
45
+ Yuki::Command.new("渡す", nil, lambda{var[:search_bookmark] && var[:get_bookmark] && var[:aikotoba]==false}, send2),
46
+ Yuki::Command.new("戻る", nil, lambda{var[:akamatsu_aisatsu]==true}, MainScene)]
47
+ end
48
+
49
+ def update
50
+ return nil if Input.quit_or_escape?
51
+ message_box.update_animation
52
+ command_box.update_animation
53
+ @yuki.update
54
+ r = @yuki.executing? ? @now : @yuki.result
55
+ if @yuki.is_scenario?(r)
56
+ @yuki.start_plot(r)
57
+ r = @now
58
+ end
59
+ return r
60
+ end
61
+
62
+ def render
63
+ @room.render
64
+ @yuki.render
65
+ message_box.render
66
+ command_box.render if @yuki.selecting?
67
+ end
68
+
69
+ def plot
70
+ yuki_plot do
71
+ text "赤の扉から中に入った。"
72
+ pause.clear
73
+ show :akamatsu
74
+ text "目の前には"
75
+ color(:red){vars[:var][:akamatsu_aisatsu] ? "赤松さん" : "男の人"}
76
+ text "が居る。"
77
+ cr
78
+ vars[:main_loop]
79
+ end
80
+ end
81
+
82
+ def main_loop
83
+ yuki_plot do
84
+ loop do
85
+ text "どうする?"
86
+ command vars[:command]
87
+ break select_result if is_scene?(select_result)
88
+ call_plot(select_result) if is_scenario?(select_result)
89
+ end
90
+ end
91
+ end
92
+
93
+ def red2
94
+ yuki_plot do
95
+ clear
96
+ text_wait "「はっ、"
97
+ text_wait "私の、"
98
+ text_wait "名前は、"
99
+ text_wait "赤松と、"
100
+ text_wait "申します!"
101
+ cr
102
+ text_wait " よろしく、"
103
+ text "お願いします!」"
104
+ pause.clear
105
+ vars[:var][:akamatsu_aisatsu] = true
106
+ end
107
+ end
108
+
109
+ def look
110
+ yuki_plot do
111
+ clear
112
+ text "部屋を見回すと、勉強家らしく、"
113
+ cr
114
+ text "机と数々の本が本棚にしまってある。"
115
+ pause.clear
116
+ end
117
+ end
118
+
119
+ def talk
120
+ yuki_plot do
121
+ clear
122
+ text_wait "「はっ、"
123
+ text_wait "私は、"
124
+ text_wait "某大学の、"
125
+ text_wait "はっ、"
126
+ text "8年生です!"
127
+ pause.cr
128
+ text_wait " 今年こそ、"
129
+ text_wait "無事、"
130
+ text_wait "卒業、"
131
+ text_wait "できるよう!"
132
+ cr
133
+ text_wait " 精進する、"
134
+ text_wait "所存で、"
135
+ text_wait "ございます!」"
136
+ pause.clear
137
+ end
138
+ end
139
+
140
+ def send1
141
+ yuki_plot do
142
+ clear
143
+ text "あなたは、青山君から受け取っていた本を返した。"
144
+ pause.clear
145
+ text_wait "「あっ、"
146
+ text_wait "青山くんから、"
147
+ text "本を受け取って頂いたのですね!"
148
+ pause.cr
149
+ text_wait " あ、"
150
+ text_wait "ありがとうございます!"
151
+ pause.clear
152
+ text_wait " あ、"
153
+ text_wait "あのひと、"
154
+ text "ちょっとビビるでしょ?"
155
+ pause.cr
156
+ text_wait " ・・・おっとと、"
157
+ text_wait "聞こえてちゃ、"
158
+ text "困るな。」"
159
+ pause.clear
160
+ text " それでは・・・・・。"
161
+ pause.clear
162
+ text " ・・・・・。"
163
+ pause.clear
164
+ text_wait " おや、"
165
+ text_wait "栞が、"
166
+ text_wait "入って、"
167
+ text "ないですね。"
168
+ pause.cr
169
+ text_wait " あれは、"
170
+ text_wait "僕の、"
171
+ text_wait "大事な、"
172
+ text "宝物なんです!"
173
+ pause.cr
174
+ text_wait " 青山君の、"
175
+ text_wait "部屋に、"
176
+ text_wait "戻って、"
177
+ cr
178
+ text_wait " 栞を、"
179
+ text_wait "探して、"
180
+ text_wait "きてください!」"
181
+ pause.clear
182
+ vars[:var][:search_bookmark]=true
183
+ end
184
+ end
185
+
186
+ def send2
187
+ yuki_plot do
188
+ clear
189
+ text_wait "「あっ、"
190
+ text_wait "これは、"
191
+ text "無くなっていた栞!"
192
+ pause.cr
193
+ text_wait " ありがとうございます!"
194
+ cr
195
+ text_wait " あの、"
196
+ text_wait "お礼といっては、"
197
+ text "何ですが、"
198
+ pause.cr
199
+ text_wait " 合言葉を、"
200
+ text_wait "教えて、"
201
+ text "差し上げます!」"
202
+ pause.clear
203
+ text_wait "「『こんなゲーム", 0.5
204
+ text_wait " まじになっちゃって", 0.5
205
+ cr
206
+ text_wait "  どうするの』", 0.5
207
+ cr
208
+ text_wait " これが、"
209
+ text_wait "合い言葉です!"
210
+ cr
211
+ text_wait " それでは、"
212
+ text "お元気で!」"
213
+ pause.clear
214
+ vars[:var][:aikotoba]=true
215
+ end
216
+ end
217
+
218
+ def final
219
+ message_box.stop
220
+ command_box.stop
221
+ end
222
+
223
+ def dispose
224
+ @akamatsu.dispose
225
+ @room.dispose
226
+ end
227
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #! /usr/bin/ruby
3
+ # Sample Adventure "Room 3"
4
+
5
+ $miyako_debug_mode = true
6
+
7
+ require 'Miyako/miyako'
8
+
9
+ include Miyako
10
+
11
+ Miyako.setTitle("Room 3")
12
+ Screen.set_size(640, 480)
13
+
14
+ require 'main_component'
15
+ require 'title'
16
+ require 'main'
17
+ require 'red'
18
+ require 'green'
19
+ require 'blue'
20
+ require 'ending'
21
+
22
+ r3 = Story.new
23
+ r3.run(Title)
24
+ #for debug
25
+ #r3.run(MainScene)
@@ -0,0 +1,184 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class Title
3
+ include Story::Scene
4
+
5
+ def self.scene_type
6
+ return :scene
7
+ end
8
+
9
+ def init
10
+ font = Font.sans_serif
11
+ font.size = 24
12
+ font.color = Color[:white]
13
+ @push_key = Shape.text(:text=>"Push Any Key", :font=>font)
14
+ @push_key.center!.bottom!{|body| (0.1).ratio(body) }
15
+
16
+ @copy_right = Shape.text(:text=>"2006-2008 Cyross Makoto", :font=>font)
17
+ @copy_right.center!.bottom!{|body| (0.05).ratio(body) }
18
+
19
+ @visible = false
20
+
21
+ @title = Sprite.new(:file=>"image/mittsu_no_oheya.png", :type=>:ck)
22
+
23
+ @exec = self.method(:view_in)
24
+ end
25
+
26
+ def setup
27
+ @title.move_to!(Screen.w, 0)
28
+ end
29
+
30
+ def view_in
31
+ if @title.x > 0
32
+ @title.move!(-8, 0)
33
+ return @now
34
+ end
35
+ @visible = true
36
+ @exec = self.method(:waiting)
37
+ return @now
38
+ end
39
+
40
+ def waiting
41
+ if Input.pushed_any? || Input.click?(:left)
42
+ @exec = self.method(:view_out)
43
+ @visible = false
44
+ end
45
+ return @now
46
+ end
47
+
48
+ def view_out
49
+ if @title.x > -Screen.w
50
+ @title.move!(-8, 0)
51
+ return @now
52
+ end
53
+ return TitleCall
54
+ end
55
+
56
+ def update
57
+ return nil if (Input.pushed_any?(:esc) || Input.quit?)
58
+ return @exec.call
59
+ end
60
+
61
+ def render
62
+ @title.render
63
+ if @visible
64
+ @push_key.render
65
+ @copy_right.render
66
+ end
67
+ end
68
+ end
69
+
70
+ class TitleCall
71
+ include Story::Scene
72
+ include MainComponent
73
+
74
+ def init
75
+ @yuki = Yuki.new(message_box[:box]){|box|
76
+ select_textbox(box)
77
+ }
78
+ @man = Sprite.new(:file=>"image/start.png", :type=>:ck)
79
+ @man.center!.bottom!
80
+ @alpha = 0.0
81
+ @wait = WaitCounter.new(0.2)
82
+ @exec = self.method(:view_in)
83
+ end
84
+
85
+ def setup
86
+ @yuki.setup(plot){|plot|
87
+ select_plot(plot)
88
+ }
89
+ @yuki.vars[:next] = MainScene
90
+ @wait.start
91
+ end
92
+
93
+ def update
94
+ return nil if (Input.pushed_any?(:esc) || Input.quit?)
95
+ return @exec.call
96
+ end
97
+
98
+ def final
99
+ message_box.stop
100
+ end
101
+
102
+ def view_in
103
+ if @wait.finish?
104
+ if @alpha == 1.0
105
+ @yuki.start_plot
106
+ @exec = self.method(:exec_yuki)
107
+ message_box.start
108
+ return @now
109
+ end
110
+ @alpha += 0.15
111
+ @alpha = 1.0 if @alpha >= 1.0
112
+ @wait.start
113
+ end
114
+ return @now
115
+ end
116
+
117
+ def exec_yuki
118
+ message_box.update_animation
119
+ @yuki.update
120
+ return @yuki.result ? @yuki.result : @now
121
+ end
122
+
123
+ def plot
124
+ yuki_plot do
125
+ text("「レディ〜ス エ〜ン ジェントルメ〜ン!」").pause.cr
126
+ text("「本日も、視聴者参加バラエティー").cr
127
+ text(" 『ルーム3』の時間がは〜じまりま〜した〜!」").pause.clear
128
+ text("「司会はわたくし、").cr
129
+ wait 0.3
130
+ text(" サミュエル・ボチボチデンナーが").cr
131
+ text(" お送りしま〜す!」").pause.clear
132
+ text("「本日も、難関を乗り越え、").cr
133
+ text(" 豪華賞品をゲットするだけ!").cr
134
+ wait 0.5
135
+ text(" カンタン!」").pause.clear
136
+ text("「ルールもカンタン!").cr
137
+ text(" 3つの部屋にいる住人からヒントを得て、").pause.cr
138
+ text(" 合言葉を見つけるだけ!").cr
139
+ wait 0.5
140
+ text(" ほら、カンタンでしょ?」").pause.clear
141
+ text("「でも、これらの部屋にいる住人、").cr
142
+ text(" 一筋縄じゃ合い言葉を教えてくれない。").cr
143
+ wait 0.5
144
+ text(" いろいろ話して、").cr
145
+ text(" 合い言葉をゲットしてくれ!」").pause.clear
146
+ text "「さぁ、最初の挑戦者だ。"
147
+ wait 0.5
148
+ text "お名前は?"
149
+ wait 1.5
150
+ cr
151
+ text " ・・・おおー、元気いいねー!"
152
+ wait 0.5
153
+ cr
154
+ text " じゃあ、どっから来たの?"
155
+ wait 1.0
156
+ cr
157
+ text(" ・・・オーケイ、よくできました!」").pause.clear
158
+ text "「じゃ、ルールは分かるよね?"
159
+ wait 0.5
160
+ cr
161
+ text " ・・・よし」"
162
+ pause.clear
163
+ text "「ドキドキするねぇ、"
164
+ wait 0.5
165
+ cr
166
+ text " ワクワクするねぇ"
167
+ pause.cr
168
+ text " それじゃ、元気よく、"
169
+ cr
170
+ text " 目の前のドアから入ってみよう。」"
171
+ pause.clear
172
+ text "「よーい、"
173
+ wait 0.5
174
+ text "スタート!」"
175
+ pause.clear
176
+ vars[:next]
177
+ end
178
+ end
179
+
180
+ def render
181
+ Bitmap.dec_alpha(@man, Screen, @alpha)
182
+ message_box.render if @exec == self.method(:exec_yuki)
183
+ end
184
+ end
@@ -0,0 +1,204 @@
1
+ # encoding: utf-8
2
+ # 自由落下運動サンプル
3
+ # 2009.4.19 Cyross Makoto
4
+
5
+ require 'Miyako/miyako'
6
+
7
+ include Miyako
8
+
9
+ # 基本オブジェクト
10
+ class Obj
11
+ include Layout
12
+
13
+ attr_reader :collision, :position
14
+
15
+ def initialize(size)
16
+ init_layout
17
+ set_layout_size(*size.to_a)
18
+
19
+ # スプライトの生成
20
+ @sprite = Sprite.new(size: size, type: :ac)
21
+
22
+ # コリジョンの生成
23
+ @collision = Collision.new(Rect.new(0, 0, *size.to_a))
24
+
25
+ # 位置情報の生成
26
+ @position = Point.new(0, 0)
27
+ end
28
+
29
+ def update_layout_position
30
+ # 画像はマージンが掛かっている可能性があるため、
31
+ # 補正を掛けておく
32
+ pos = @layout.pos.move(-@position[0],-@position[1])
33
+ @sprite.move!(*pos)
34
+ @position.move_to!(*@layout.pos)
35
+ end
36
+
37
+ # スプライトとコリジョン間でマージンを設定
38
+ def margin(dx, dy)
39
+ @sprite.move!(dx, dy)
40
+ return self
41
+ end
42
+
43
+ # 衝突判定
44
+ def collision?(col, pos)
45
+ return @collision.collision?(@position, col, pos)
46
+ end
47
+
48
+ # 画面へ描画
49
+ def render
50
+ @sprite.render
51
+ end
52
+ end
53
+
54
+ # ボール
55
+ class Ball < Obj
56
+ V0 = [8.0, 12.0].cycle
57
+ VX = [1, -1].cycle
58
+ G = 9.8
59
+
60
+ # 初速度の取得
61
+ attr_reader :v0
62
+
63
+ def initialize
64
+ size = Size.new(32, 32)
65
+ super(size)
66
+ Drawing.circle(@sprite,
67
+ [size.w/2,size.h/2],
68
+ size.w/2,
69
+ [255,255,255],
70
+ true)
71
+
72
+ # ジャンプ中?
73
+ @jumping = false
74
+ # y基準位置
75
+ @by = 0.0
76
+ # 元y
77
+ @oy = 0.0
78
+ # 速度
79
+ @v = 0.0
80
+ # 初速度
81
+ @v0 = 0.0
82
+ # 時間
83
+ @t = 0.0
84
+ # 時間刻み
85
+ @dt = 0.01
86
+ # 床の跳ね返り係数
87
+ # 0.9や0.8にすると永遠に跳ねる
88
+ @e = 0.5
89
+ # 拡大率
90
+ @zoom = 1.0 / @dt
91
+ # ウェイト
92
+ @wait = WaitCounter.new(@dt)
93
+ end
94
+
95
+ # ボールの更新
96
+ # 床(floor)を引数に取る
97
+ def update(floor)
98
+ if @jumping
99
+ # 放物運動の公式より。
100
+ # 当たり判定のテストも兼ねていることから、
101
+ # 整数単位の値が必要だったため、時間刻みを元に値を拡大している
102
+ y = (@v0 * @t - G * (@t ** 2) / 2) * @zoom
103
+ # 移動量の算出
104
+ dy = y - @oy
105
+ # 床とぶつかる?
106
+ # 移動範囲を作成
107
+ rect = Rect.new(@position.x,
108
+ @position.y,
109
+ 1, -dy)
110
+ # 所定の間隔で床と衝突判定
111
+ if Utility.product_liner_f(rect, floor.h).any?{|pos|
112
+ @collision.collision?(pos,
113
+ floor.collision,
114
+ floor.position)
115
+ }
116
+ # 床にぶつかれば跳ね返る
117
+ self.move_to!(self.x, @by)
118
+ # 跳ね返り時の速度を求める。
119
+ # 実数にすると何故か永遠にはねるため、整数化して強制的に値を少なくしている
120
+ @v0 = -((@v0 - G * @t) * @e).to_i
121
+ @t = @dt
122
+ @oy = 0.0
123
+ @wait.start
124
+ elsif @wait.finish?
125
+ # ぶつからなければ移動
126
+ self.move_to!(self.x, @by - y.to_i)
127
+ @t = @t + @dt
128
+ @oy = y
129
+ @wait.start
130
+ end
131
+ # 初速度がゼロ?(止まった?)
132
+ if @v0 == 0.0
133
+ # ジャンプの終了
134
+ @wait.stop
135
+ @jumping = false
136
+ end
137
+ end
138
+ end
139
+
140
+ # 飛び上がれ!
141
+ def jumpup
142
+ return if @jumping
143
+ # y基準位置の決定
144
+ @by = self.y.to_f
145
+ # 初速度の決定
146
+ @v0 = V0.next
147
+ @jumping = true
148
+ @t = @dt
149
+ @wait.start
150
+ end
151
+
152
+ # ジャンプ中?
153
+ def jumping?
154
+ return @jumping
155
+ end
156
+ end
157
+
158
+ # 床
159
+ class Floor < Obj
160
+ def initialize
161
+ size = Size.new(640, 16)
162
+ super(size)
163
+ Drawing.fill(@sprite, [255,64,64])
164
+ end
165
+ end
166
+
167
+ # ボールの用意
168
+ @ball = Ball.new
169
+
170
+ # 床の用意
171
+ @floor = Floor.new
172
+
173
+ # 床の初期位置設定
174
+ @floor.center!.bottom!
175
+
176
+ # ボールの初期位置設定
177
+ @ball.center!.bottom!{|b| @floor.size.h }
178
+
179
+ # フォントの用意
180
+ @font = Font.serif
181
+ @font.size = 16
182
+
183
+ # 情報表示用スプライトの用意
184
+ @speed = Sprite.new(size: Size.new(640, 16), type: :ac)
185
+ @info = Shape.text(font: @font, text: "1ボタンを押せばボールが跳ね上がります")
186
+ @info.snap(@speed).left!.outside_bottom!
187
+
188
+ Miyako.main_loop do
189
+ break if Input.quit_or_escape?
190
+ @ball.update(@floor)
191
+ # 1ボタンを押した時、ボールのジャンプを始める
192
+ @ball.jumpup if Input.pushed_any?(:btn1)
193
+
194
+ # 初速度表示スプライトの更新
195
+ @speed.clear!
196
+ @font.draw_text(@speed, "初速度:#{@ball.v0}", 0, 0)
197
+
198
+ # 画面への描画
199
+ @floor.render
200
+ @ball.render
201
+ @speed.render
202
+ # ジャンプ中でなければ説明を表示
203
+ @info.render unless @ball.jumping?
204
+ end
@@ -0,0 +1,70 @@
1
+ # 画像ビット操作サンプル
2
+ # 2009.4.17 Cyross Makoto
3
+
4
+ require 'Miyako/miyako'
5
+
6
+ include Miyako
7
+
8
+ # 画像が画面をはみ出そうになったら移動量を+-反転
9
+ # spr:: 移動対象のスプライト
10
+ # amt:: 移動量配列
11
+ # 返却値:: 変更した移動量配列
12
+ def turn(spr, amt)
13
+ amt[0] = -amt[0] if (spr.x + spr.ow) >= Screen.w
14
+ amt[0] = -amt[0] if spr.x <= 0
15
+ amt[1] = -amt[1] if (spr.y + spr.oh) >= Screen.h
16
+ amt[1] = -amt[1] if spr.y <= 0
17
+ return amt
18
+ end
19
+
20
+ # マスク画像を作成
21
+ bmask = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
22
+ Drawing.circle(bmask, [50,50], 50, [255,255,255], :fill)
23
+
24
+ # 描画用スプライトを作成
25
+ spr1 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
26
+ spr2 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
27
+ spr3 = Sprite.new(:size=>Size.new(100,100), :type=>:ac)
28
+
29
+ # 転送元背景を準備
30
+ bk = Sprite.new(:file=>"Animation1/m1ku_back.jpg", :type=>:as)
31
+ text = Sprite.new(:file=>"text.png", :type=>:ac)
32
+ # 表示用背景を準備(元画像を反転)
33
+ bk2 = bk.inverse
34
+
35
+ spr2.centering!
36
+ spr3.right!.bottom!
37
+
38
+ # 移動量配列を設定
39
+ @amt1 = [ 4, 4]
40
+ @amt2 = [ 4,-4]
41
+ @amt3 = [-4,-4]
42
+
43
+ # Main Routine
44
+ Miyako.main_loop do
45
+ break if Input.quit_or_escape?
46
+ # マスク画像の転送
47
+ bmask.render_to(spr1)
48
+ bk.render_to(spr2){|src, dst| src.ox = spr2.x; src.oy = spr2.y}
49
+ bk2.render_to(spr3){|src, dst| src.ox = spr3.x; src.oy = spr3.y}
50
+ # 元画像をandして描画用スプライトへ転送
51
+ spr1.and!(bk){|src, dst| src.ox = spr1.x; src.oy = spr1.y}
52
+ # 元画像をorして描画用スプライトへ転送
53
+ spr2.or!(text)
54
+ # 元画像をxorして描画用スプライトへ転送
55
+ spr3.xor!(text)
56
+
57
+ # 画像を画面に描画
58
+ bk2.render
59
+ spr1.render
60
+ spr2.render
61
+ spr3.render
62
+ # スプライトの移動
63
+ spr1.move!(*@amt1)
64
+ spr2.move!(*@amt2)
65
+ spr3.move!(*@amt3)
66
+ # 画像が画面をはみ出そうになったら移動量を+-反転
67
+ @amt1 = turn(spr1, @amt1)
68
+ @amt2 = turn(spr2, @amt2)
69
+ @amt3 = turn(spr3, @amt3)
70
+ end