首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

DirectDraw Gamma Ramp 實現淡入淡出特效

     編輯:關於VC++

為何選擇 Gamma 控制?

  • 程式碼極簡單
  • 不會破壞主介面上的像素資料(純顯示層面調整)

前提:主介面必須為 16-bit 以上色深;效果作用於整個主介面(顯示卡層級)。

核心結構 DDGAMMARAMP

typedef struct {
    WORD red[256], green[256], blue[256];
} DDGAMMARAMP;

實作步驟

  1. 取得 IDirectDrawGammaControl 介面:lpPrimary->QueryInterface(IID_IDirectDrawGammaControl, (void**)&pGamma)
  2. 備份原始 Gamma:pGamma->GetGammaRamp(0, &oldRamp)
  3. 取得可修改副本:pGamma->GetGammaRamp(0, &ramp)
  4. 漸變迴圈:將 256 級紅/綠/藍通道逐一歸零並套用
  5. 還原:pGamma->SetGammaRamp(0, &oldRamp)

淡出核心代碼

for (int i=0; i<256; i++) {
    if (ramp.red[i] > 0) { ramp.red[i]=0; pGamma->SetGammaRamp(0, &ramp); } Sleep(1);
    if (ramp.green[i] > 0) { ramp.green[i]=0; pGamma->SetGammaRamp(DDSGR_CALIBRATE, &ramp); } Sleep(1);
    if (ramp.blue[i] > 0) { ramp.blue[i]=0; pGamma->SetGammaRamp(DDSGR_CALIBRATE, &ramp); } Sleep(1);
}
// 完成後還原
pGamma->SetGammaRamp(0, &oldRamp);

應用變化

  • 受擊閃紅:僅歸零 Green/Blue 保留 Red
  • 中毒變綠:僅歸零 Red/Blue
  • 溺水變藍:僅歸零 Red/Green
  • 淡入:反向從零遞增至原始值

注意事項

  • 若顯卡不支援硬體 Gamma,DirectDraw 會以軟體模擬
  • 全螢幕獨佔模式下效果最明顯
  • 多工環境下會影響其他視窗顏色,建議僅在遊戲獨佔模式使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved