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

C++ 實現爆炸振動特效:基於 CRT 控制器的視角偏移技術

     編輯:關於C++

效果原理

在遊戲中,爆炸伴隨畫面輕微抖動可增強沉浸感。本文實現通過修改 VGA 12H 模式下 CRT 控制器的起始顯示地址,實現整屏畫面平移,從而產生振動效果。代碼基於 Borland C++ 2.0,體積小、速度快、效果逼真。

核心函數:MoveView

通過向 CRT 控制器端口 0x3D4/0x3D5 寫入高低位地址,設置屏幕左上角顯示座標:


void MoveView(int x, int y) {
    union { unsigned int whole; char low; } adr;
    unsigned char high, low;
    adr.whole = y * 80 + x / 8;  // 計算顯存偏移(文本模式 80 列,每字符 8 像素寬)
    low = adr.low;
    high = (unsigned char)(adr.whole >> 8);
    outportb(0x3D4, 0x0C);  // CRT 起始地址高位寄存器
    outportb(0x3D5, high);
    outportb(0x3D4, 0x0D);  // CRT 起始地址低位寄存器
    outportb(0x3D5, low);
}

主程序演示


void main() {
    int gdriver = DETECT, gmode = 0;
    initgraph(&gdriver, &gmode, "BORLANDCBGI");
    rectangle(100, 100, 200, 200);
    outtextxy(100, 250, "Press Any Key to SHAKE ...");
    getch();
    for (int i = 0; i < 20; ++i) {
        MoveView(10 - random(20), 5 - random(10)); // 隨機偏移
        delay(50);
    }
    MoveView(0, 0); // 復位
    getch();
    closegraph();
}

技術細節說明

  • 模式: VGA 12H (640x480 16色) 文本模式兼容顯存佈局
  • 偏移計算: y * 80 + x/8 對應文本模式每行 80 字符,每字符佔 8 像素寬
  • 端口操作: outportb 直接操作硬件端口,繞過繪圖庫,極低延遲
  • 隨機抖動: random(20) 產生 -10~+9 像素水平抖動,random(10) 產生 -5~+4 像素垂直抖動

現代化移植提示

  • 現代 OS (Windows/Linux) 禁止用戶態直接訪問硬件端口,需內核驅動或使用繪圖 API (DirectX/OpenGL/SDL) 實現視口偏移
  • 現代引擎通常通過攝像機位置抖動或後處理位移實現同類效果
  • 本代碼具有教學價值,展示底層顯示控制原理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved