Двойной курсор в оконной игре OpenGL под доком - PullRequest
4 голосов
/ 06 июля 2011

Я создал игру в opengl, и у меня проблема с двойным курсором (мой и системный) в оконном режиме. Я скрываю системный курсор и использую только мой курсор в игре.

Когда окно находится под док-станцией, и я перемещаю курсор над док-станцией (курсор все еще находится внутри окна), отображается системный курсор. С этого момента у меня есть двойной курсор (мой и системный).

Я пробую три решения:

  1. Использовать события при наведении курсора и нахождении курсора на доке, но я не нашел таких событий: (* ​​1008 *
  2. Использовать события, когда системный курсор отображается или скрывается, но я тоже не нашел таких событий: (* ​​1010 *
  3. Получить информацию о подсчете курсора. Когда я делаю "CGDisplayHideCursor" скрыть количество курсоров уменьшается. Когда курсор находится над док-станцией, я не знаю об этом, потому что у меня нет событий, но я могу проверить в таймере, должен ли курсор быть скрытым, чтобы я мог скрыть его, но таким образом у меня будет много раз скрывать курсор , так что я не знаю о подсчете курсора и неправильно отображаю: (

Может быть, это должно быть решено совершенно по-другому.

Ответы [ 2 ]

0 голосов
/ 10 августа 2014

Вместо того, чтобы обходиться с CGDisplayHideCursor, с его таинственным нечитаемым количеством скрытий, решение состоит в том, чтобы установить прямоугольник курсора, покрывающий все ваше окно прозрачным курсором. Это действительно надежно - оно надежно скрывает курсор, когда мышь находится внутри окна, и показывает его в любое другое время.

Я в конце концов понял это, посмотрев на исходный код Simple 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()];
}
0 голосов
/ 20 января 2012

вы можете попробовать любое из следующих действий:

  • Не отображать игровой курсор в оконном режиме (хотя это может быть не очень хорошо для вашей игры)
  • Сделать окно игры верхним-почти так, что он находится над док-станцией (не уверен, что это возможно на Mac)
  • Не разрешайте игровому окну отображать что-либо под док-станцией, поэтому пользователю не нужно нажимать там (или не разрешатьВаше игровое окно должно быть расположено под доком в первую очередь)
  • Используйте таймер для опроса координат курсора на экране, чтобы определить, находится ли курсор над доком или нет

Это не строгопроблема программирования, но проблема юзабилити.Вы должны решить, что вы хотите, чтобы пользователь сделал, и реализовать это.Я считаю, что не стоит отображать игровой курсор в оконном режиме (если вы не пишите, например, стратегическую игру, в которой вам нужно много разных курсоров).

...