シューティングゲーム等では爆発などの効果に半透明を使いたい場合があります。
半透明は基本的には余りウィンドウズ向きの効果では無いのですが、やはりそれなりの場所で
決めると結構美しい物なので、基本的な実現方法(というか、考え方)を書いておこうと思います。
但し、他のTipに関してもそうですが、必ずしもこうしなければならない、とかそういったものではなく、
飽く迄こういった方法もあると言う程度の参考として読んでください。
あと、半透明効果は色を沢山使用することになるので、256色モードのゲームを作っている場合は
本当の半透明ではなくメッシュ等で誤魔化す方向で検討してください。256色で本当の半透明を
行うのは色数の制限上無理です。
では半透明の考え方ですが、ようするに単純な比例計算です。256色以上の環境と限定した場合、
色の構成要素をそのままピクセルデータに出来るので、後はRGB夫々の要素について半透明度合いに
応じて比例計算を行えば良いという事です。
では例を1つ。
RGB(10,20,30)のピクセルAとRGB(15,15,15)のピクセルBがあったとします。
このピクセルA、Bを夫々3:7の割合で半透明演算する場合、
RatioA=10/3=0.3
RatioB=10/7=0.7
R=10*RatioA+15*RatioB=13.5
G=20*RatioA+15*RatioB=16.5
B=30*RatioA+15*RatioB=19.5
となります。この時小数点以下の数値が出てしまっていますが四捨五入するのが良いと思います。
従って、半透明演算の結果のピクセルはRGB(14,17,20)となる事になります。
あとは、この結果を夫々の色数のデータにパックし直せばOKです。
現在Windows用ゲームではフルスクリーンモードとウィンドウモードの両方でゲームの出きる物が
増えてきています。しかし、フルスクリーンモードで稼動させるには普通、画面解像度の変更を行う
必要があります。これはDirectXの排他モードを使用すると簡単なのですが、DirectXを使用しない
ゲームの場合にはWindowsAPIを使用します。このAPIはChangeDisplaySettingsと言います。
LONG ChangeDisplaySettings(
LPDEVMODE lpDevMode, | |
DWORD dwflags | |
); |
このlpDevModeですが、これはEnumDisplaySettingsを使って取得してください。具体的には
// 現在の画面色数を取得する
HDC hdc ;
hdc = GetDC(hwnd) ;
int colors = GetDeviceCaps(hdc, BITSPIXEL) ;
ReleaseDC(hwnd, hdc) ;
//
ディスプレイドライバが設定出来る画面設定を見て行き、現在の色数で
// 640*480の設定を探す
DEVMODE dmode ;
{
DWORD modeno ;
for(modeno = 0 ;; modeno ++) {
if(EnumDisplaySettings(NULL, modeno, &dmode) ==
FALSE) {
//
サーチ終了。つまり変更したいモードには変えられないらしい
MessageBox(NULL, "このディスプレイカードではフルスクリーンに出来ません",
"Infomation", MB_OK) ;
return 0 ;
}
// 変更したいモードか?
if((dmode.dmPelsWidth == FULLSCR_X)
&& (dmode.dmPelsHeight == FULLSCR_Y)
&& (dmode.dmBitsPerPel == (unsigned)colors))
{
// これを採用
break ;
}
}
}
ChangeDisplaySettings(&dmode, 0) ;
上記のように行ってください。