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