使用 DirectDraw Gamma Ramp 實現螢幕淡出有兩大優勢:程式碼簡潔,且不會損壞主介面上的像素資料(僅調整顯示卡輸出)。
DDGAMMARAMP 包含三個 256 元素的 WORD 陣列(Red/Green/Blue),對應 256 灰階的 Gamma 曲線。
// 宣告介面與結構 LPDIRECTDRAWGAMMACONTROL lpDDGammaControl = NULL; DDGAMMARAMP DDGammaRamp, DDGammaOld; // 取得 Gamma 控制介面 lpddsPrimary->QueryInterface(IID_IDirectDrawGammaControl, (void**)&lpDDGammaControl); // 備份原始 Gamma 設定 lpDDGammaControl->GetGammaRamp(0, &DDGammaOld); lpDDGammaControl->GetGammaRamp(0, &DDGammaRamp); // 取得可修改的副本
為追求速度,直接將 256 階全部設為 0,每階更新一次螢幕:
for (int i = 0; i < 256; i++) {
if (DDGammaRamp.red[i] > 0) {
DDGammaRamp.red[i] = 0;
lpDDGammaControl->SetGammaRamp(0, &DDGammaRamp);
}
Sleep(1);
if (DDGammaRamp.green[i] > 0) {
DDGammaRamp.green[i] = 0;
lpDDGammaControl->SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);
}
Sleep(1);
if (DDGammaRamp.blue[i] > 0) {
DDGammaRamp.blue[i] = 0;
lpDDGammaControl->SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);
}
Sleep(1);
}
淡出結束後呼叫 lpDDGammaControl->SetGammaRamp(0, &DDGammaOld) 還原。同理可修改單一色道實現受擊閃紅、中毒變綠、溺水變藍等效果,或反向操作實現淡入。