場面転換 †
アドベンチャーでは、背景画像を切り替えることが頻繁にあります。
ですが、静的な背景を動的に切り替えるというのは、意外にも難しいものです。
アドベンチャーでは、背景⇒語り⇒前景、という最低限3枚のレイヤーから成るのが一般的です。
背景はレイヤーの最背面であることが保証されていますので、シーンの中で一番初めに描画されます。
つまり、画面全体を自由にベタ使用することが出来るのが特徴です。
逆に、前景は背景を塗り潰さないように描画しなくてはならないので、半透明コピーが必須になります。
画面変更の際に、消滅することをアウトと呼び、出現することをインと呼びます。
同じように、場面を変更することをチェンジと呼び、場面に効果を入れることをエフェクトと呼びます。
ちなみに、画面構成において、背景というと最背面の景色のことを指し、前景というと最前面の物体のことを指します。
※背景におけるイン・アウトは、画像を差し替えるだけなので、全く同じものになります。
密度(濃度)を少しずつ変更していく演出を【フェード】と呼びます。
+
| | 背景のフェード
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
| buffer 1
picload dirinfo(1) + "/sample/demo/sky_bg.jpg"
x = GINFO_WINX
y = GINFO_WINY
buffer 2, x, y
color
boxf
picload dirinfo(1) + "/sample/demo/logop.bmp", 1
screen
gcopy 1, 0, 0, x, y
await 1000
step = 120
repeat (step)
redraw 0
pos 0, 0
gmode 3, x, y, (256 - (cnt + 1) * 256 / step)
gcopy 1, 0, 0, x, y
gmode 3, x, y, ((cnt + 1) * 256 / step)
gcopy 2, 0, 0, x, y
redraw 1
await 5
loop
stop
|
|
- やっぱりフェードは基本中の基本です。キレイに変わります。-- りさ
画面を切り裂いていく演出を【スライス】と呼びます。
+
| | 背景のスライス_アウト
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
| buffer 1
color
boxf
screen
picload dirinfo(1) + "/sample/demo/sky_bg.jpg"
x = GINFO_WINX
y = GINFO_WINY
wait 100
repeat ( x / 4 )
c = cnt * 4
w = x - (2 + c)
pos c, 0
gcopy 1, c, 0, 2, y
pos w, 0
gcopy 1, w, 0, 2, y
await 5
loop
stop
|
|
+
| | 前景のスライス_イン
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
| buffer 1
picload dirinfo(1) + "/sample/demo/jp6girl.bmp"
x = GINFO_SX
y = GINFO_SY
screen 0, x, y
color 255, 128
boxf
gmode 2
wait 100
repeat ( x / 2 )
redraw 2
c = cnt * 2
w = x - (1 + c)
pos c, 0
gcopy 1, c, 0, 1, y
pos w, 0
gcopy 1, w, 0, 1, y
redraw 1
await 1
loop
stop
|
|
- 内容はほとんど同じですが、用途は全く逆になってます。 -- りさ
画面を少しずつ隠していく演出を【カーテン】と呼びます。
+
| | 背景のカーテン_アウト(ストライプ型)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
-
|
-
|
!
| screen
picload dirinfo(1) + "/sample/demo/sky_bg.jpg"
x = GINFO_WINX
y = GINFO_WINY
await 1000
redraw 0
color
boxf
step = 20
wide = x axis = 1 sign = 0
repeat step
if sign { i = step-1-cnt } else { i = cnt }
repeat (wide / step)
if horz {
redraw 1, 0, cnt*step+i, x, 1
} else {
redraw 1, cnt*step+i, 0, 1, y
}
loop
await 30
loop
stop
|
|
+
| | 背景のカーテン_アウト(ストリーム型)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
-
|
-
|
!
| screen
picload dirinfo(1) + "/sample/demo/sky_bg.jpg"
x = GINFO_WINX
y = GINFO_WINY
await 1000
redraw 0
color
boxf
step = 20
wide = x axis = 1 sign = 0
repeat ((wide / step) + (step + 1))
i = cnt
repeat (i + 1)
if axis {
if sign { redraw 1, 0, y-(cnt*16+i), x, 1 } else { redraw 1, 0, cnt*16+i, x, 1 }
} else {
if sign { redraw 1, x-(cnt*16+i), 0, 1, y } else { redraw 1, cnt*16+i, 0, 1, y }
}
loop
await 30
loop
stop
|
|
- 描画していく方法もアリですが、一瞬の転換ならばReDraw?命令扱った方がスピーディーで、マシンパワーにもあまり影響しないのでベターだと思います。
- ReDraw?命令を使っているので当然ですが、タイトルバーなりを掴んでウィンドウ外へ持っていって戻すと画面が更新されてしまうのが欠点です。-- りさ
(〜〜〜型というのは、適当に作った名前です)