Pygame-шутер от первого лица "взгляд" с мышью

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

Я попытался написать код, чтобы иметь те же свойства, что и функция "look", например Skyrim или Half-Life, но мышь не перемещает курсор - она позволяет вам смотреть вокруг и вокруг, в бесконечных кругах. Щелчок не должен иметь никакого эффекта.

первый попытка управления:

(код внутри игрового цикла)

delta_y, delta_x = pygame.mouse.get_rel()
rotation_direction.x = float(delta_x)
rotation_direction.y = float(delta_y)

(не спрашивайте меня, почему, но y и x нужно поменять местами, чтобы получить ожидаемые направления взгляда; должно быть, что-то связано с реализацией преобразования камеры, которая не я.)

это, однако, приводит к тому, что курсор сидит поверх окна, и когда курсор попадает на край экрана, окно перестает вращаться; т. е. код отчет о фактическом положении на экране.

Я пытался "сбросить" положение мыши каждый игровой цикл (и, кстати, скрыть мышь):

pygame.mouse.set_pos([150, 150])
pygame.mouse.set_visible(False)

но это генерирует симметричную дельту "назад, чтобы начать" в следующем цикле, что означает, что вы не можете "смотреть" в любом месте.

подводя итог, я хочу:

  • обнаружение фактического движения мыши сообщается с устройства
  • не перемещать / показывать курсор ОС
  • не клип на "край экрана"

каков наилучший способ сделать это, используя Pygame или другие хаки Python?

3 ответов


http://www.pygame.org/docs/ref/mouse.html :

если курсор мыши скрыт, и вход захватывается на текущий дисплей мышь войдет в режим виртуального ввода, где относительные движения мыши никогда не будут остановлены границами экрана. См. функции pygame.mouse.set_visible - скрыть или показать курсор мыши и pygame.event.set_grab (docs) - контроль совместного использования устройств ввода с другими приложениями, чтобы получить это сконфигурированный.


позвонить pygame.mouse.get_rel() еще раз сразу после set_pos вызов "выбросить" любое относительное движение set_pos звонок был выполнить.


поскольку вы используете pyOpenGL, попробуйте gluLookAt() пример: Как правильно использовать gluLookAt?