現在ゲーム内のエフェクトを作成しているのですが、エフェクトの処理がどうしても重くなってしまい
困っているため、相談いたします。
ゲーム内で使用する画像を、時間経過とともに
最初は画像を白塗りにする+透明にする → 白塗りにした画像の色を元に戻していく+透明度を下げる(表示を濃くする)
としたいと考えています。
そこで、下記のように実装しました。
int cnt = 0;
while( ProcessMessage()など ){
// まず、色が白色のまま濃さを強くしていく
// INVSRC側とADD側の強さが同じなら白色になる。
// また強さcntが小さいほど透明、大きいほど非透明になる
if(cnt < 100){
SetDrawBlendMode(DX_BLENDMODE_INVSRC, cnt * 3);
DrawGraph(x, y, handle, TRUE);
SetDrawBlendMode(DX_BLENDMODE_ADD, cnt * 3);
DrawGraph(x, y, handle, TRUE);
}
// ある程度濃くなったら、画像に少しずつ色をつけていく
// INVSRC側とADD側の強さの差分がカラーになる
else if(cnt < 200){
SetDrawBlendMode(DX_BLENDMODE_INVSRC, 255 - cnt);
DrawGraph(x, y, handle, TRUE);
SetDrawBlendMode(DX_BLENDMODE_ADD, 255);
DrawGraph(x, y, handle, TRUE);
}
// ある程度色がついたら、色の調整を行う
// 最終的にはNOBLENDで描画したいが、
// ADDで描画するとNOBLENDより鮮やかになってしまうので、
// NOBLENDに切り替えた際に違和感がないよう、ゆるやかに色をNOBLENDに近づけていく
else if(cnt < 255){
SetDrawBlendMode(DX_BLENDMODE_INVSRC, 255 - cnt - 10);
DrawGraph(x, y, handle, TRUE);
SetDrawBlendMode(DX_BLENDMODE_ADD, 255 - 10);
DrawGraph(x, y, handle, TRUE);
}
// 色のフェードが完了したらNOBLENDで描画
else{
DrawGraph(x, y, handle, TRUE);
}
cnt++;
// フェード対象以外の画像をNOBLENDで描画
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
DrawGraph(_x, _y, other_img, TRUE);
}
フェードをかける必要があります。(処理をまとめてSetDrawBlendModeの回数を減らすことができません)
画像が1枚なら1フレームにつきSetDrawBlendMode()を2回 + 1回(NOBLENDに戻す分) で済みますが、
画像が10枚になると、2回 * 10枚 + 1回 = 21回 のSetDrawBlendMode()が必要になってしまい
結果としてフェードの表示中、画面がガクガクしてしまいます。
目的の「画像を白塗りにする+透明にする」という処理にSetDrawBlendModeのような
重い処理を2回も使いたくない、というのが本音なのですが、
もう少し軽く、かつ簡潔に記述する方法は無いでしょうか。
また、今回は仕方なく濃さによって処理を4段階に分けていますが、可能であれば
処理の段階を減らし、かつ より滑らかに表示を変化させたいと思います。
(白色状態で濃さを変化→色を鮮やかにしていく→調整 のプロセスが分離しているため、
正しい意味で滑らかに変化しているわけではありません。
見た目には、ある程度滑らかに変化しているように見えるのですが。)
宜しくお願いします。