HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0329
MR.Keyboard画面のフェードアウト・フェードインはどうやるか?13未解決


MR.Keyboard

リンク

2009/3/29(Sun) 21:16:10|NO.24246

はじめまして。
今、ADVを作っているのですが、画面を黒にフェードアウトさせたり、逆にフェードインさせるのはどうすればいいのでしょうか?
よろしくお願いします。



この記事に返信する


tumo0b

リンク

2009/3/29(Sun) 22:05:58|NO.24249

画面と同じ大きさの黒の画像を作り、透過度99%くらいで重ねてく



Sucret

リンク

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



SYAM

リンク

2009/3/29(Sun) 22:57:40|NO.24255

>完全にフェードイン、フェードアウトしきっているのか

何回の合成を行えば完全な白を黒にできるか(または黒を白にできるか)は、あらかじめ計算しておくことができることですから、分からないなんてことはありません。
ちゃんと計算すれば、何回の合成で透明度を何%にするとかいうことも制御はできます。

計算のしかたが解らないか、または面倒なら回数を調べるだけのスクリプトでも書いてしまえばよいです。
合成回数を数えながら pget で色を調べればよいでしょう。



Sucret

リンク

2009/3/29(Sun) 23:19:53|NO.24258

 間違った発言、申し訳ございませんでした。
 しかし、その方法は完全な白から完全な黒へのフェードアウトの場合などには使えますが、
暗い画面に黒くフェードアウトをかけると既に黒くなっているのに何度もフェードを
かけてしまうので正確ではないように思えるのですが…



ORZ

リンク

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



SYAM

リンク

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さんのソースは理解できませんでしたが、計算がかなり面倒だと
いうことは解かりました。
お答えいただき、ありがとうございました。



SYAM

リンク

2009/4/2(Thu) 16:51:50|NO.24342

ごめんなさい orz
最高輝度(255)に対して、
濃度ratio(0〜255の整数。この例だと128で、濃度50%)で、
黒を何回合成したら最低輝度(0)になるのか計算してます。

アルファ値 ratio で count 回だけ黒を合成すれば、すべての画素が黒になっているはずです。たぶん。誤差とかなければ。


ついでに・・・
フェードアウトの場合は真っ白を減算合成するという手もあります。フェードインには使えません。
この場合、合成の回数は算数レベルの計算ですぐ求められます。また、ピクセルごとの色の計算に除算が発生しないので描画が高速です。
その代わり、消え方はかなり独特の消え方になります。
また、合成する画像にうっすら色を付けておいたり濃淡をつけておいたりすると、消え方に特徴を持たせることができます。
たとえば白から灰色のグラデーションをかけておくと、灰色のところが白より暗くなるのが遅くなります。
また、真っ白でなくうすい黄色を減算合成させると、青成分だけ遅れてフェードアウトします。



check

リンク

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
赤、緑、青の順に暗くなる。



SYAM

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.