双光标在窗口opengl游戏下停靠

5lwkijsr  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(117)

我在opengl中创建游戏,在窗口模式下我有双光标问题(我的和系统的)。我隐藏系统光标,在游戏中只使用我的光标。
当窗口在dock下,我移动光标在dock上(光标仍然在窗口内),系统光标显示。从这一刻起,我有双光标(我的和系统)。
我尝试了三种解决方案:
1.使用事件当光标是在和当光标是出码头,但我没有找到这样的事件:(
1.当系统光标取消隐藏或隐藏时使用事件,但我也没有找到这样的事件:(
1.获取有关隐藏光标计数的信息。当我使“CGDisplayHideCursor”隐藏光标计数递减。当光标在停靠上取消隐藏时,我不知道它,因为我没有任何事件,但我可以检查我的计时器,如果光标应该隐藏,这样我就可以隐藏它,但这样我会有很多次隐藏光标,所以我不知道光标隐藏计数,我没有正确地取消隐藏:(
也许这个问题应该用完全不同的方式来解决。

hiz5n14c

hiz5n14c1#

您可以尝试以下任何操作:

  • 不要在窗口模式下显示游戏光标(尽管这可能不适合您的游戏)
  • 将游戏窗口放在最上面,使其位于Dock上方(不确定在Mac上是否可行)
  • 不允许游戏窗口渲染停靠栏下的任何内容,这样用户就不需要单击那里(或者一开始就不允许游戏窗口定位在停靠栏下)
  • 使用计时器轮询光标屏幕坐标,以确定光标是否位于停靠点上方

这不是一个严格的编程问题,而是一个可用性问题。你应该决定你想让用户做什么,并实现它。我相信在窗口模式下不显示游戏光标是可以的(除非你在写一个需要很多不同光标的策略游戏)。

xn1cxnb4

xn1cxnb42#

与其使用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()];
}

相关问题