Архив метки: джойстик

Как отключить управление курсором мышки с джойстика в Ubuntu

Включаем игру, собираемся играть, и тут при нажатии на кнопки джойстика мышь начинает бегать и нажимать куда попало.

Рецепт, как отключить это:

  1. Открыть командную строку
  2. Выполнить
$ xinput list

3. Найти строку со своим джойстиком. У меня это

 ⎜ ↳ Sony Interactive Entertainment Controller id=17 [slave pointer (2)]. 

4. Нас интересует id, в данном случае 17

5. Выполнить

$ xinput list-props 17

Нас интересуют следующие 2 строки и цифры у них в скобках

...
	Generate Mouse Events (638):	1
	Generate Key Events (639):	1
...

6. И теперь непосредственно отключаем джойстик от мыши:

$ xinput set-prop 17 638 0
$ xinput set-prop 17 639 0
$

После этого курсор мыши бегать от джойстика перестанет.

Чтоб вернуть как было, нужно выполнить последние 2 команды с последним параметром 1 вместо 0

Pygame перехват событий с джойстика

Код для вывода информации обо всех событиях, происходящих с джойстиком:

import pygame
pygame.joystick.init()
pygame.init()
clock = pygame.time.Clock()
joysticks = [pygame.joystick.Joystick(x) for x in range(pygame.joystick.get_count())]
while True:
    for event in pygame.event.get():
        print(event)
    clock.tick(60)

Пример вывода информации о происходящих с джойстиком событиях:

pygame 2.0.1 (SDL 2.0.14, Python 3.8.10)
Hello from the pygame community. https://www.pygame.org/contribute.html
<Event(1541-JoyDeviceAdded {'device_index': 0, 'guid': '030000004c050000da0c000011010000'})>
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 0})>
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 1})>
<Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 0, 'value': 0.0})>
<Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 0, 'value': -1.000030518509476})>
<Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 0, 'value': 0.0})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 3})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 3})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 0})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 0})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 2})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 2})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 1})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 1})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 5})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 5})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 4})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 4})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 7})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 7})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 6})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 6})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 9})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 9})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 8})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 8})>

Программа для проверки джойстика — человек ходит влево-вправо:

import pygame
pygame.joystick.init()
pygame.init()
clock = pygame.time.Clock()
joysticks = [pygame.joystick.Joystick(x) for x in range(pygame.joystick.get_count())]
hero_sprite = (
    "_o_\n"
    "(_)\n"
    "/ \\\n"
)


def render_object(x: int, sprite: str):
    lines = sprite.split("\n")
    print("\n" * 50)
    for line in lines:
        print(" " * x + line)


hero_x = 10
hero_vx = 0
while True:
    for event in pygame.event.get():
        if event.type == pygame.JOYAXISMOTION:
            print("it works!")
            if event.axis == 0:
                hero_vx = int(event.value)
    hero_x += hero_vx
    render_object(hero_x, hero_sprite)
    clock.tick(60)