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

遊戲中滑鼠選取物件的四大演算法比較

     編輯:VC 教學

1. 包圍盒法

每物件建立包圍矩形/球體,遍歷判斷滑標座標是否落入。
優點:簡單、矩形包圍盒且物件少時效率高。
缺點:精度不足,無法像素級選取。
2D 用矩形組合,3D 用 AABB/OBB/包圍球。

2. 列舉測試法

遍歷所有可見物件,逐像素/面片測試 (2D 檢查 Alpha,3D 射線三角形相交)。
優點:像素級精確。
缺點:效率極低。
實務常配合包圍盒法先篩選候選物件,再精確測試。

3. 回饋緩衝區法

繪製時同步寫入物件 ID 至後台緩衝區 (Alpha/Z-buffer/Stencil),讀取滑標對應像素即知選中物件。
優點:精確到像素、幾乎無效能損耗。
缺點:需高度控制繪圖管線。
OpenGL 內建 glRenderMode(GL_FEEDBACK),DirectX 可用 Z-buffer/Stencil 實現。

4. 直接映射法

場景以二維陣列/多層陣列儲存,滑標座標直接換算陣列索引讀取物件。
優點:O(1) 時間複雜度。
缺點:限制物件排列方式、記憶體需求大。
適用:棋盤遊戲、固定視角策略遊戲。

綜合應用

實務常組合使用:包圍盒粗篩 → 回饋/列舉精選;範圍選取 (框選) 可由基本演算法延伸。

2D 回饋法偽碼實作

color trans = RGB(0,0,0);           // 透明色
color buf[H][W];                    // 後台緩衝
int x, y;                           // 滑標座標
object array[N];                    // 物件陣列
stack objstack;                     // 選中物件堆疊

color old = buf[y][x];
buf[y][x] = trans;
for (i = 0; i < N; i++) {
    draw(array[i]);
    if (buf[y][x] != trans) {
        old = buf[y][x];
        buf[y][x] = trans;
        objstack.push(array[i]);
    }
}
buf[y][x] = old;
// objstack 依繪製順序儲存所有滑標下物件,取所需者即可
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved