DirectXで遊ぼう | 上のページ |
- 概要
256色環境でパレットを使用する方法を解説しています。
以下の内容について解説します。
- 恐怖のパレット
Windowsで256色グラフィックを扱う際、パレットシステムを利用する事になります。 しかし、これはものすごく厄介な物です。
何故ならWindowsはマルチタスクOS。ひとつのアプリケーションがパレットを独占する事は許されないし、それは不可能です。 パレットを使うには、他のアプリケーションの事も考えてやらなくてはなりません。
具体的にはWM_PAINT,WM_CHANGEPALETTE,WM_QUERYPALETTEあたりの通知メッセージで、パレットをリアライズしたり開放したりするのです。 しかしパレットアニメーションとかをやろうとすると、その限りではありません。
DOSアプリケーションが如何に簡単に作れるかという事を、ほぼ間違いなく実感できる瞬間です(笑)
DirectDrawに搭載しているIDirectDrawPaletteは、排他モードを使用している範囲であればDOSアプリケーション並にパレットを制御する事ができます。 それどころか、複数オブジェクトを生成できるのでいくつかのパターンを前もって用意しておいて瞬時に切り替えるってワザも使用できます。
これを使わない手は無いですねぇ・・・
- サンプルプログラム
LPDIRECTDRAWPALETTE ddpalette; // IDirectDrawPaletteオブジェクト HRESULT r; // 関数の返値 PALETTEENTRY entry[256]; // パレットテーブルの定義 entry[0].peRed = 0; entry[0].peGreen = 0; entry[0].peBlue = 0; entry[0].peFlags = PC_NOCOLLAPSE; entry[1].peRed = 255; entry[1].peGreen = 255; entry[1].peBlue = 0; entry[1].peFlags = PC_NOCOLLAPSE; : r = ddraw->CreatePalette(DDPCAPS_8BIT,entry,&ddpalette); if(r != DD_OK){ // // CreatePalette失敗(r:エラーコード) // } // パレットの定義 r = ddsurface->SetPalette(ddpalette); if(r != DD_OK){ // // SetPalette失敗(r:エラーコード) // }サーフェイスにパレットを設定してやる事以外は、GDIのパレットと良く似ています。
構造体は同じですし。
256色の場合、画像データはこのパレットテーブルの内容に依存して表示を行うので、DOSと何ら変わらない制御が可能になります。
SetPaletteを行った後は、当該サーフェイスはIDirectDrawPaletteの内容に従って描画を行います。 それはパレットテーブルの変更を行った時も同様です。
パレット変更は以下のような感じです。これも、GDIとやり方は似ています。
しかしGDIと違って、変更したらリアライズさせなければならないって事はありません。
// 10番パレットを、[100,100,200]に変更する PALETTEENTRY entry; entry.peRed = 100; entry.peGreen = 100; entry.peBlue = 200; ddpalette->SetEntries(0,10,1,&entry);- だが、恐怖は繰り返される・・・
排他モードでは、上記の方法で十分なのです。
しかしウィンドゥモードとなるとそうもいきません。結局他のウィンドゥからの干渉を考慮しない事には、ちゃんと表示してくれません。
そしてリアライズも必要なのです・・・・・
さて、どうすりゃぁいいか。
GDIのパレットシステムに逆戻り。あの恐怖はまた繰り返される事になります・・・
上のページ |