2011-07-06 8 views
4

私はopenglでゲームを作成しました。私はウィンドウモードでダブルカーソル(私とシステム)に問題があります。 私はシステムカーソルを隠し、ゲームで自分のカーソルだけを使用します。ドック下でウィンドウを開いたOpenGLゲームのダブルカーソル

ウィンドウがドックの下にあり、カーソルがドックの上に移動すると(カーソルはまだウィンドウの内側にあります)、システムカーソルが表示されます。この瞬間から私はダブルカーソル(私とシステム)を持っています。カーソルが終わると、カーソルが出ているドックのとき

  1. 使用したイベントが、私は、システムカーソルが再表示されたときに、このようなイベント:(
  2. 使用イベントを見つけたり、非表示にしませんでした:

    は、私は3つのソリューションを試してみてくださいしかし、私はそのようなイベントも見つけませんでした:(

  3. "CGDisplayHideCursor"を作成すると、カーソルの数が減少します。カーソルがドックを覆い隠すと、私はそれを知らないhavn't任意のイベントが、私はそれを隠すことができるようにカーソルが非表示にする必要があります私のタイマーをチェックすることができますが、このように私は何度もカーソルを隠すので、IDカーソルの隠れ回数について知りません。正しく表示されません。(

これはまったく別の方法で解決するべきでしょうか。

答えて

0

次のいずれかを試みることができる:最上位のそれはゲームのウィンドウを作成します(それがあなたのゲームのためにOKではないかもしれませんが)

  • ウィンドウモードでゲームカーソルを表示しません
  • をドックの上にあることを確認してください(Macでは可能かどうかわかりません)
  • ドックの下に何かをレンダリングさせないようにして、ユーザーがそこをクリックする必要はありません最初にドッキングする)
  • タイマーを使用してカーソルスクリーンのコーディネーションをポーリングするカーソルがドック上にあるかどうかを判断するために使用します。

これはプログラミング上の問題ではなく、使用上の問題です。あなたは、ユーザーが何をしたいのかを決定し、それを実装する必要があります。ゲームカーソルをウィンドウモードで表示しないようにしても問題ありません(たとえば、多くの異なるカーソルが必要な戦略ゲームなどを書いている場合を除きます)。

0

CGDisplayHideCursorでドークするのではなく、不可解な隠れ目カウントで、透明なカーソルでウィンドウ全体を覆うカーソルを設定するのが解決策です。これは本当に堅牢です。マウスがウィンドウ内にあるときは確実にカーソルを隠し、他のすべての時間にカーソルを表示します。

私は結局、Simple DirectMedia Layer(SDL)2のソースコードを見ることでこれを理解しました。あなたのNSViewのサブクラス実装で

オーバーライドresetCursorRects:

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()]; 
} 
関連する問題