HBITMAP BackGround = (HBITMAP)LoadImage(NULL, "BackGround.bmp", IMAGE_BITMAP, 800, 600, LR_LOADFROMFILE);
HBITMAP Plane = (HBITMAP)LoadImage(NULL, "Plane.bmp", IMAGE_BITMAP, 70, 140, LR_LOADFROMFILE); // 含遮罩
HBITMAP Stone = (HBITMAP)LoadImage(NULL, "Stone.bmp", IMAGE_BITMAP, 100, 200, LR_LOADFROMFILE);
HDC hdc = GetDC(hWnd);
HDC mdc = CreateCompatibleDC(hdc); // 內存 DC
HDC bufdc = CreateCompatibleDC(hdc); // 緩衝 DC
HBITMAP bmp = CreateCompatibleBitmap(hdc, 800, 600);
// 1. 選入前景圖 (含遮罩區)
SelectObject(bufdc, Plane);
// 2. AND 操作:目標區域與遮罩相與 → 保留背景中非透明區域
BitBlt(mdc, nowX, nowY, 70, 70, bufdc, 0, 70, SRCAND); // 遮罩在圖片下半部
// 3. OR 操作:前景圖像疊加 → 形成最終透明效果
BitBlt(mdc, nowX, nowY, 70, 70, bufdc, 0, 0, SRCPAINT);

static int w = 0, tPre = 0;
BitBlt(hdc, 0, 0, 800, 600, mdc, 0, 0, SRCCOPY); // 內存 DC → 屏幕 DC
tPre = GetTickCount();
w += 10;
if (w >= 600) w = 0; // 循環滾動
case WM_MOUSEMOVE:
x = LOWORD(lParam); y = HIWORD(lParam);
// 邊界裁剪
if (x > 730) x = 730; else if (x < 0) x = 0;
if (y > 480) y = 480; else if (y < 0) y = 0;
break;
// 主循環中平滑追蹤 (每幂移動 20 像素)
if (nowX < x) { nowX += 20; if (nowX > x) nowX = x; }
else { nowX -= 20; if (nowX < x) nowX = x; }
// Y 軸同理...
// 石頭結構體數組
typedef struct { int x, y; int vy; } StoneObj;
StoneObj stones[4] = {{100,0,15}, {300,0,15}, {500,0,15}, {700,0,15}};
// 每幂更新
for (int i=0; i<4; i++) {
stones[i].y += stones[i].vy;
if (stones[i].y > 600) { stones[i].y = 0; stones[i].x = rand()%700; } // 重生
// 繪製同透明貼圖流程
}
// 飛機矩形: (nowX, nowY) 70x70
// 石頭矩形: (sx, sy) 100x100
if ( (sx < nowX+70) && (sx+100 > nowX) &&
(sy < nowY+70) && (sy+100 > nowY) ) {
// 觸發爆炸
}
HBITMAP baozha[4];
baozha[0] = LoadImage(..., "baozha0.bmp", ..., 316, 632, ...); // 含遮罩
// ...
// 碰撞瞬間播放 4 幂
SelectObject(bufdc, baozha[frame]);
BitBlt(mdc, sx-50, sy-70, 316, 316, bufdc, 0, 316, SRCAND); // 遮罩
BitBlt(mdc, sx-50, sy-70, 316, 316, bufdc, 0, 0, SRCPAINT); // 圖像
frame = (frame + 1) % 4;
| 現狀不足 | 改進方向 |
|---|---|
| 架構耦合度高,主循環混雜渲染/邏輯/輸入 | 引入遊戲循環模式:固定時間步 + 狀態機 |
| 無子彈系統、無分數/生命值、無關卡 | 實現實體組件系統 (ECS) 雛形 |
| 碰撞僅矩形,無像素級精確檢測 | 引入掩碼像素碰撞或圓形包圍盒 |
| AI 極簡 (直線下落) | 實現行為樹 / 有限狀態機 AI |
| 資源硬編碼路徑,無資源管理器 | 實現資源包加載、熱重載 |
| GDI 性能瓶頸,無硬件加速 | 遷移至 Direct2D / OpenGL / SDL2 |