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?