さて、パレットを256個作成したら、その中に色を設定してやります。考え方としては、美術で256個の皿(部屋?)のあるパレットの中に、絵の具で色を作成するが、何故か絵の具が赤、緑、青の3つしか無く、その3つの絵の具の量を調整して様々な色を作成するというもの(わけわからん)。
まぁ、とりあえずコードを見てみますか。
自作関数SetPaletteColorでは、256個のパレットの内、no番目の色を「赤」、「緑」、「青」によって設定します。
ここではPALETTEENTRY構造体を使用します。この構造体のメンバ「BYTE peRed」(BYTE = unsigned char)、「BYTE peGreen」、「BYTE peBlue」
にそれぞれ「赤」、「緑」、「青」の量を0〜255の間で指定します(peFlagsメンバは1固定)。例えば、「赤」、「緑」、「青」を255,0,255にすると、赤と青が混ざった紫、127,127,127にすると、灰色というような感じです。
そうしたら、前に作成したDirectDrawPaletteオブジェクト「lpPalette」のメンバ
であるSetEntriesという関数を呼び出して、パレットの色を変更します。SetEntriesの構文は以下の通りです。
| 書式 | HRESULT SetEntries( DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries );
|
| dwFlags | このフラグは現在使用していないらしいので0を指定しなければいけないらしい。 |
| dwStartingEntry | 何番のパレットから設定するか(変更開始パレット番号)。 |
| dwCount | 変更したいパレット数 |
| lpEntries | パレットエントリ(PALETTEENTRY構造体)へのポインタ |
| 戻り値 |
成功した場合はDD_OKが返ってくるらしい。
|
この関数は、今回作成した自作関数のように1個1個パレットを設定するのでは無く、複数一気に変更出来るように
設計されています。ですから、peEntry[0]〜peEntry[255]を全て変更し、lpPalette->SetEntries(0,0,256,peEntry);とでもすれば、全部一括してパレットを変更できます。
ただ、DirectDrawの特性上(?)0番(黒固定)と255番(白固定)のパレットは変更不可能になっています。
まぁ、白と黒は99%ゲームで使うと思うので変更出来ないからと言って気にはならないでしょう。