Platform SDK: DirectX

ステップ 1 : パレット エントリのロード

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。

[C++]

DDEx5 の次のコードでは、All.bmp ファイルの後半部分 (赤い輪を含むビットマップ部分) の値と共にパレット エントリをロードする。

// 初めに、すべての色を未使用として設定する。
for(i=0; i<256; i++) 
{ 
    torusColors[i] = 0; 
} 
 
// サーフェスをロックし、後半部分 (トーラス領域) をスキャンする。
// 見つかったすべてのインデックスのトラックを保持する。
ddsd.dwSize = sizeof(ddsd); 
while (lpDDSOne->Lock(NULL, &ddsd, 0, NULL) == DDERR_WASSTILLDRAWING) 
    ; 
 
// トーラス フレームから検索して、使用する色をマークする。
for(y=480; y<480+384; y++) 
{ 
    for(x=0; x<640; x++) 
    { 
        torusColors[((BYTE *)ddsd.lpSurface)[y*ddsd.lPitch+x]] = 1; 
    } 
} 
 
lpDDSOne->Unlock(NULL); 
 

torusColors 配列は、All.bmp ファイルの後半部分で使うパレットのカラー インデックスのインジケータとして使用される。これが使用される前に、torusColors 配列のすべての値を 0 にリセットする。オフスクリーン バッファは、カラー インデックス値が使われるかどうかを決定する前にロックされる。

torusColors 配列を、ビットマップの 480 行 : 0 列から開始するように設定する。配列のカラー インデックス値は、ビットマップ サーフェスが配置されるメモリの位置のデータのバイトで決まる。この位置は、DDSURFACEDESC2 構造体の lpSurface メンバによって決まる。このメンバは、ビットマップの 480 行 : 0 列 (y×lPitch + x) に対応するメモリの位置を指す。特定のカラー インデックス値の位置は、1 に設定する。y の値 (行) に lPitch 値 (DDSURFACEDESC2 構造体にある) を掛けて、線形メモリにあるピクセルの実際の位置を求める。

torusColors で設定されたカラー インデックス値は、後でパレット内のどの色を循環させるかを決定する際に使用する。バックグラウンドと赤い輪には共通する色が存在しないため、赤い輪に関連付けられた色のみを循環させる。これが、true であるかどうかを調べるには、配列から "*ddsd.lPitch" を削除して、プログラムを再コンパイルして実行するときに何が起こるかを見る (y×lPitch を行わないと、赤い輪は決して循環せず、バックグラウンドを構成する色にのみインデックスが付き後で循環する)。およびピッチについての詳細情報は、「幅とピッチ」を参照すること。

次項 :ステップ 2 : パレットの回転