ruby-miyako 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/README +1115 -0
  2. data/Rakefile +7 -0
  3. data/defines.h +144 -0
  4. data/extconf.rb +44 -0
  5. data/extern.h +29 -0
  6. data/img/cursor.png +0 -0
  7. data/img/cursors.png +0 -0
  8. data/img/dice.png +0 -0
  9. data/img/wait_cursor.png +0 -0
  10. data/img/win_base.png +0 -0
  11. data/img/window.png +0 -0
  12. data/install_miyako.rb +87 -0
  13. data/lib/Miyako/API/audio.rb +584 -0
  14. data/lib/Miyako/API/basic_data.rb +1026 -0
  15. data/lib/Miyako/API/bitmap.rb +534 -0
  16. data/lib/Miyako/API/choices.rb +481 -0
  17. data/lib/Miyako/API/collision.rb +638 -0
  18. data/lib/Miyako/API/diagram.rb +586 -0
  19. data/lib/Miyako/API/drawing.rb +151 -0
  20. data/lib/Miyako/API/exceptions.rb +105 -0
  21. data/lib/Miyako/API/fixedmap.rb +462 -0
  22. data/lib/Miyako/API/font.rb +430 -0
  23. data/lib/Miyako/API/input.rb +456 -0
  24. data/lib/Miyako/API/layout.rb +644 -0
  25. data/lib/Miyako/API/map.rb +583 -0
  26. data/lib/Miyako/API/map_event.rb +222 -0
  27. data/lib/Miyako/API/modules.rb +357 -0
  28. data/lib/Miyako/API/movie.rb +166 -0
  29. data/lib/Miyako/API/parts.rb +188 -0
  30. data/lib/Miyako/API/plane.rb +205 -0
  31. data/lib/Miyako/API/screen.rb +341 -0
  32. data/lib/Miyako/API/shape.rb +443 -0
  33. data/lib/Miyako/API/sprite.rb +773 -0
  34. data/lib/Miyako/API/sprite_animation.rb +494 -0
  35. data/lib/Miyako/API/sprite_list.rb +1135 -0
  36. data/lib/Miyako/API/spriteunit.rb +168 -0
  37. data/lib/Miyako/API/story.rb +350 -0
  38. data/lib/Miyako/API/textbox.rb +773 -0
  39. data/lib/Miyako/API/utility.rb +419 -0
  40. data/lib/Miyako/API/viewport.rb +190 -0
  41. data/lib/Miyako/API/yuki.rb +1180 -0
  42. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  43. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  44. data/lib/Miyako/EXT/slides.rb +157 -0
  45. data/lib/Miyako/miyako.rb +201 -0
  46. data/lib/Miyako/miyako_require_only.rb +35 -0
  47. data/logo/EGSR_logo.png +0 -0
  48. data/logo/EGSR_logo_bg.png +0 -0
  49. data/logo/EGSR_logo_fg.png +0 -0
  50. data/logo/EGSR_title_banner.png +0 -0
  51. data/logo/EGSR_title_logo.png +0 -0
  52. data/logo/miyako.png +0 -0
  53. data/logo/miyako_banner.png +0 -0
  54. data/logo/space.png +0 -0
  55. data/miyako_basicdata.c +484 -0
  56. data/miyako_bitmap.c +1225 -0
  57. data/miyako_collision.c +403 -0
  58. data/miyako_drawing.c +187 -0
  59. data/miyako_font.c +334 -0
  60. data/miyako_hsv.c +830 -0
  61. data/miyako_input_audio.c +254 -0
  62. data/miyako_layout.c +191 -0
  63. data/miyako_no_katana.c +1086 -0
  64. data/miyako_sprite2.c +431 -0
  65. data/miyako_transform.c +438 -0
  66. data/miyako_utility.c +288 -0
  67. data/sample/Animation1/m1ku.rb +68 -0
  68. data/sample/Animation1/m1ku_arm_0.png +0 -0
  69. data/sample/Animation1/m1ku_arm_1.png +0 -0
  70. data/sample/Animation1/m1ku_arm_2.png +0 -0
  71. data/sample/Animation1/m1ku_arm_3.png +0 -0
  72. data/sample/Animation1/m1ku_back.jpg +0 -0
  73. data/sample/Animation1/m1ku_body.png +0 -0
  74. data/sample/Animation1/m1ku_eye_0.png +0 -0
  75. data/sample/Animation1/m1ku_eye_1.png +0 -0
  76. data/sample/Animation1/m1ku_eye_2.png +0 -0
  77. data/sample/Animation1/m1ku_eye_3.png +0 -0
  78. data/sample/Animation1/m1ku_hair_front.png +0 -0
  79. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  80. data/sample/Animation1/readme.txt +72 -0
  81. data/sample/Animation2/lex.rb +96 -0
  82. data/sample/Animation2/lex_back.png +0 -0
  83. data/sample/Animation2/lex_body.png +0 -0
  84. data/sample/Animation2/lex_roadroller.png +0 -0
  85. data/sample/Animation2/lex_wheel_0.png +0 -0
  86. data/sample/Animation2/lex_wheel_1.png +0 -0
  87. data/sample/Animation2/lex_wheel_2.png +0 -0
  88. data/sample/Animation2/readme.txt +72 -0
  89. data/sample/Animation2/song_title.png +0 -0
  90. data/sample/Diagram_sample/back.png +0 -0
  91. data/sample/Diagram_sample/chr01.png +0 -0
  92. data/sample/Diagram_sample/chr02.png +0 -0
  93. data/sample/Diagram_sample/cursor.png +0 -0
  94. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  95. data/sample/Diagram_sample/readme.txt +90 -0
  96. data/sample/Diagram_sample/wait_cursor.png +0 -0
  97. data/sample/Room3/blue.rb +297 -0
  98. data/sample/Room3/ending.rb +180 -0
  99. data/sample/Room3/green.rb +220 -0
  100. data/sample/Room3/image/akamatsu.png +0 -0
  101. data/sample/Room3/image/aoyama.png +0 -0
  102. data/sample/Room3/image/congra.png +0 -0
  103. data/sample/Room3/image/congratulation.png +0 -0
  104. data/sample/Room3/image/congratulation_bg.png +0 -0
  105. data/sample/Room3/image/cursor.png +0 -0
  106. data/sample/Room3/image/midori.png +0 -0
  107. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  108. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  109. data/sample/Room3/image/room_blue.png +0 -0
  110. data/sample/Room3/image/room_green.png +0 -0
  111. data/sample/Room3/image/room_red.png +0 -0
  112. data/sample/Room3/image/start.png +0 -0
  113. data/sample/Room3/image/three_doors.png +0 -0
  114. data/sample/Room3/image/wait_cursor.png +0 -0
  115. data/sample/Room3/main.rb +120 -0
  116. data/sample/Room3/main_component.rb +59 -0
  117. data/sample/Room3/readme.txt +76 -0
  118. data/sample/Room3/red.rb +227 -0
  119. data/sample/Room3/room3.rb +25 -0
  120. data/sample/Room3/title.rb +184 -0
  121. data/sample/ball_action_sample.rb +204 -0
  122. data/sample/blit_rop.rb +70 -0
  123. data/sample/cairo_sample.rb +25 -0
  124. data/sample/circle_collision_test.rb +66 -0
  125. data/sample/collision_test.rb +33 -0
  126. data/sample/collision_test2.rb +108 -0
  127. data/sample/fixed_map_test/cursor.png +0 -0
  128. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  129. data/sample/fixed_map_test/map.csv +19 -0
  130. data/sample/fixed_map_test/map_01.png +0 -0
  131. data/sample/fixed_map_test/mapchip.csv +23 -0
  132. data/sample/fixed_map_test/monster.png +0 -0
  133. data/sample/fixed_map_test/readme.txt +72 -0
  134. data/sample/map_test/chara.rb +58 -0
  135. data/sample/map_test/chr1.png +0 -0
  136. data/sample/map_test/cursor.png +0 -0
  137. data/sample/map_test/main_parts.rb +69 -0
  138. data/sample/map_test/main_scene.rb +153 -0
  139. data/sample/map_test/map.png +0 -0
  140. data/sample/map_test/map2.png +0 -0
  141. data/sample/map_test/map_layer.csv +127 -0
  142. data/sample/map_test/map_manager.rb +75 -0
  143. data/sample/map_test/map_test.rb +23 -0
  144. data/sample/map_test/mapchip.csv +21 -0
  145. data/sample/map_test/oasis.rb +71 -0
  146. data/sample/map_test/readme.txt +89 -0
  147. data/sample/map_test/route.rb +157 -0
  148. data/sample/map_test/sea.png +0 -0
  149. data/sample/map_test/town.rb +74 -0
  150. data/sample/map_test/wait_cursor.png +0 -0
  151. data/sample/map_test/window.png +0 -0
  152. data/sample/polygon_test.rb +35 -0
  153. data/sample/rasterscroll.rb +25 -0
  154. data/sample/takahashi.rb +42 -0
  155. data/sample/text.png +0 -0
  156. data/sample/textbox_sample.rb +192 -0
  157. data/sample/transform.rb +54 -0
  158. data/sample/utility_test.rb +73 -0
  159. data/sample/utility_test2.rb +61 -0
  160. data/sample/utility_test3.rb +64 -0
  161. data/sample/utility_test4.rb +73 -0
  162. data/uninstall_miyako.rb +19 -0
  163. data/win/miyako_no_katana.so +0 -0
  164. metadata +216 -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