|
|
2009/3/29(Sun) 21:16:10|NO.24246
はじめまして。
今、ADVを作っているのですが、画面を黒にフェードアウトさせたり、逆にフェードインさせるのはどうすればいいのでしょうか?
よろしくお願いします。
|
|
2009/3/29(Sun) 22:05:58|NO.24249
画面と同じ大きさの黒の画像を作り、透過度99%くらいで重ねてく
|
|
2009/3/29(Sun) 22:20:06|NO.24251
>tumo0bさん
それだと完全にフェードイン、フェードアウトしきっているのか分かりませんよ?
フェードイン処理では
1.フェードイン後の画像を別のバッファに作成する
2.メインウィンドウを好きな色で塗りつぶす
3.バッファの内容をメインウィンドウに透過コピーする
4.2に戻る(徐々に透過率を下げる)
フェードアウトは
1.現在の画面をバッファにコピーする
2.画面をフェードアウト後の色で塗りつぶす
3.塗りつぶした画面にバッファ内容を透過率0でコピー
4.2に戻る(徐々に透過率を上げる)
拙いスクリプトですがサンプル作ってみました。
screen 0,320,240
//フェードイン
buffer 1,320,240
mes"フェードイン"
color 255
mes"サンプル"
gsel 0
repeat 257
redraw 0
color:boxf
gmode 3,,,cnt
pos 0,0:gcopy 1,0,0,320,240
wait 1
redraw 1
loop
//フェードアウト
buffer 1,320,240
pos 0,0
gcopy 0,0,0,320,240
gsel 0
repeat 257
redraw 0
color:boxf
pos 0,0
gmode 3,,,256-cnt
gcopy 1,0,0,320,240
wait 1
redraw 1
loop
|
|
2009/3/29(Sun) 22:57:40|NO.24255
>完全にフェードイン、フェードアウトしきっているのか
何回の合成を行えば完全な白を黒にできるか(または黒を白にできるか)は、あらかじめ計算しておくことができることですから、分からないなんてことはありません。
ちゃんと計算すれば、何回の合成で透明度を何%にするとかいうことも制御はできます。
計算のしかたが解らないか、または面倒なら回数を調べるだけのスクリプトでも書いてしまえばよいです。
合成回数を数えながら pget で色を調べればよいでしょう。
|
|
2009/3/29(Sun) 23:19:53|NO.24258
間違った発言、申し訳ございませんでした。
しかし、その方法は完全な白から完全な黒へのフェードアウトの場合などには使えますが、
暗い画面に黒くフェードアウトをかけると既に黒くなっているのに何度もフェードを
かけてしまうので正確ではないように思えるのですが…
|
|
2009/3/30(Mon) 00:37:34|NO.24260
暗い画面と明るい画面でフェードアウト、フェードインの時間が異なるって言うのもどうかと。
|
|
2009/4/1(Wed) 22:25:26|NO.24325
>何回の合成を行えば完全な白を黒にできるか(または黒を白にできるか)は、あらかじめ計算しておくことがで
>きることですから、分からないなんてことはありません。
ブレンド率10の画像を10回重ねた画像とブレンド率100の画像って同じ透明度になりませんよね?
何回の合成で完全な白や黒になるかを出す計算が解からないので教えていただけませんか?
|
|
2009/4/1(Wed) 23:53:15|NO.24330
わからないけど調べられそうなことは、適当にプログラム組んで調べてみましょうよ。
そしてこれは、得られた結果から推測するのが早いと思います。
でも多分、かなり面倒な計算になるかもしれません。
onkey *s
buffer 1
boxf
gsel 0
pos 320, 0
gmode 3, 320, 480, 100 ; 右のは透明度100で黒を白にコピー
gcopy 1, 0, 0
*s
c ++
pos 0, 0
gmode 3, 320, 480, 10
gcopy 1, 0, 0
pget 0, 0
l = ginfo_r
pget 320, 0
r = ginfo_r
title "キーを押すと左に黒画像を透明度10でコピーします:回数"+c+":左のR値"+l+":右のR値:"+r
stop
|
|
2009/4/2(Thu) 00:15:56|NO.24331
>かなり面倒な計算になるかもしれません。
実際面倒です。少なくとも算数の範疇ではありません。
ちゃんと計算することはできるんですが、
count=0
col=255
ratio=128
*@
count++
col = col*(256-ratio)/256
if(col>0) : goto *@b
mes count
…まあ、こうしたほうがラクですよね…。
|
|
2009/4/2(Thu) 15:26:08|NO.24340
SYAMさんのソースは理解できませんでしたが、計算がかなり面倒だと
いうことは解かりました。
お答えいただき、ありがとうございました。
|
|
2009/4/2(Thu) 16:51:50|NO.24342
ごめんなさい orz
最高輝度(255)に対して、
濃度ratio(0〜255の整数。この例だと128で、濃度50%)で、
黒を何回合成したら最低輝度(0)になるのか計算してます。
アルファ値 ratio で count 回だけ黒を合成すれば、すべての画素が黒になっているはずです。たぶん。誤差とかなければ。
ついでに・・・
フェードアウトの場合は真っ白を減算合成するという手もあります。フェードインには使えません。
この場合、合成の回数は算数レベルの計算ですぐ求められます。また、ピクセルごとの色の計算に除算が発生しないので描画が高速です。
その代わり、消え方はかなり独特の消え方になります。
また、合成する画像にうっすら色を付けておいたり濃淡をつけておいたりすると、消え方に特徴を持たせることができます。
たとえば白から灰色のグラデーションをかけておくと、灰色のところが白より暗くなるのが遅くなります。
また、真っ白でなくうすい黄色を減算合成させると、青成分だけ遅れてフェードアウトします。
|
|
2009/4/2(Thu) 17:14:28|NO.24344
SYAM氏の言っていた減算合成
dialog "bmp",16
picload refstr
color 255,128,64
repeat
gmode 6,,,20
grect 320,240,0,640,480
await 16
loop
赤、緑、青の順に暗くなる。
|
|
2009/4/3(Fri) 11:58:14|NO.24371
checkさんにサンプル作っていただいた(ありがとうございます!)ので、もう一つの応用例、位置によって消え方を変える例も。
// 準備.
dialog "",16,"" : if(stat!=1):end
picload refstr
// 消え方を決める画像を自由に書く.
// 色があってもいい.
buffer 1,ginfo_winx,ginfo_winy,0
repeat ginfo_winy
c = 8 + cnt\32 : color c,c,c
line 0,cnt, ginfo_winx,cnt
loop
font msgothic,256
pos ginfo_winx/2-128,ginfo_winy/2-128
color 4,4,4 :mes "猫"
// 実際に消す処理.
gsel 0
gmode 6,,,256
repeat 256
pos 0,0
gcopy 1, 0,0 , ginfo_winx,ginfo_winy
wait 5
loop
#どんだけ猫好きなんだよ
|
|
2009/4/6(Mon) 04:25:50|NO.24481
はじめまして
モノブロスともうします
早速ですが僕のフェードイン・フェードアウトのやり方をのせます
buffer 1, 640, 480
color 0, 0, 0 : boxf //フェードイン・フェードアウトする色で塗りつぶし
buffer 2
picload "画像.bmp" //フェードアウト・フェードインで表示する画像ファイル
gsel 0
//フェードイン
fade = 255 //フェードレベル
fs = 5 //フェードスピード
repeat (256 - fade) / fs + 1
redraw 0
gmode 0
pos 0, 0 : gcopy 2, 0, 0, 640, 480
gmode 3, 640, 480, fade
pos 0, 0 : gcopy 1
fade -= fs
redraw 1
await 16
loop
//フェードアウト
fade = 1 //フェードレベル
fs = 5 //フェードスピード
repeat (256 - fade) / fs + 1
redraw 0
gmode 0
pos 0, 0 : gcopy 2, 0, 0, 640, 480
gmode 3, 640, 480, fade
pos 0, 0 : gcopy 1
fade += fs
redraw 1
await 16
loop
|
|