在遊戲中,爆炸伴隨畫面輕微抖動可增強沉浸感。本文實現通過修改 VGA 12H 模式下 CRT 控制器的起始顯示地址,實現整屏畫面平移,從而產生振動效果。代碼基於 Borland C++ 2.0,體積小、速度快、效果逼真。
通過向 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();
}
y * 80 + x/8 對應文本模式每行 80 字符,每字符佔 8 像素寬outportb 直接操作硬件端口,繞過繪圖庫,極低延遲random(20) 產生 -10~+9 像素水平抖動,random(10) 產生 -5~+4 像素垂直抖動