2011-07-06 47 views
4

我在opengl中創建了遊戲,並且在窗口模式下雙光標(我的和系統)出現問題。 我隱藏了系統光標並只在遊戲中使用了我的光標。在光標下的opengl遊戲中的雙光標

當窗口停靠在底座上時,我將光標移動到底座上(光標仍在窗口內),系統光標顯示出來。從這一刻起,我有雙光標(我和系統)。

我嘗試三種解決方案:

  1. 使用事件時光標懸停,當光標出塢,但我沒有找到這樣的事件:(
  2. 使用事件時,系統光標取消隱藏或隱藏,但我也沒有發現這樣的事件:(
  3. 獲取關於隱藏光標計數的信息當我使用「CGDisplayHideCursor」時,隱藏光標計數是遞減的。當光標被取消隱藏時,我不知道它是因爲我沒有任何事件,但我可以檢查我的計時器,如果光標應該隱藏,所以我可以隱藏它,但這樣我會多次隱藏光標,所以ID不知道光標隱藏計數,我不能正確取消隱藏:(

也許這應該以完全不同的方式解決。

回答

0

你可以嘗試以下任何一種:

  • 不顯示在窗口模式下游戲光標(儘管這可能不是好爲你的遊戲)
  • 讓遊戲窗口最上面的所以它是在碼頭上方(不確定是否可以在mac上)
  • 不要讓你的遊戲窗口在碼頭下渲染任何東西,所以用戶不需要點擊它(或者不允許你的遊戲窗口位於停靠在第一位)
  • 使用計時器輪詢光標屏幕座標ates以確定光標是否在碼頭上

這不是一個嚴格的編程問題,而是一個可用性問題。您應該決定您希望用戶執行的操作。我相信可以在窗口模式下不顯示遊標光標(除非你正在編寫一個策略遊戲,你需要許多不同的遊標)。

0

與其使用CGDisplayHideCursor和其神祕的不可讀隱藏計數來解決問題,解決方法是使用透明光標設置覆蓋整個窗口的光標矩形。這非常強大 - 當鼠標在窗口內並在其他時間顯示時,它可靠地隱藏光標。

我最終通過查看簡單DirectMedia Layer(SDL)2源代碼來了解這一點 - 這裏提供了一個最小的示例。

覆蓋resetCursorRects在您的NSView子類實現:

static NSCursor* invisibleCursor() 
{ 
    static NSCursor *invisibleCursor = NULL; 
    if (!invisibleCursor) { 
     /* RAW 16x16 transparent GIF */ 
     static unsigned char cursorBytes[] = { 
      0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04, 
      0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x10, 
      0x00, 0x10, 0x00, 0x00, 0x02, 0x0E, 0x8C, 0x8F, 0xA9, 0xCB, 0xED, 
      0x0F, 0xA3, 0x9C, 0xB4, 0xDA, 0x8B, 0xB3, 0x3E, 0x05, 0x00, 0x3B 
     }; 

     NSData *cursorData = [NSData dataWithBytesNoCopy:&cursorBytes[0] 
                length:sizeof(cursorBytes) 
              freeWhenDone:NO]; 
     NSImage *cursorImage = [[[NSImage alloc] initWithData:cursorData] autorelease]; 
     invisibleCursor = [[NSCursor alloc] initWithImage:cursorImage 
                hotSpot:NSZeroPoint]; 
    } 

    return invisibleCursor; 
} 

- (void)resetCursorRects 
{ 
    [super resetCursorRects]; 

    [self addCursorRect:[self bounds] cursor:invisibleCursor()]; 
}