60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
import pygame
|
|
|
|
pygame.init()
|
|
screen = pygame.display.set_mode((640, 480))
|
|
clock = pygame.time.Clock()
|
|
|
|
# Constants
|
|
HAT_REPEAT_DELAY = 300 # milliseconds before first repeat
|
|
HAT_REPEAT_INTERVAL = 100 # milliseconds between repeats
|
|
|
|
# State
|
|
hat_direction = (0, 0)
|
|
hat_timer = 0
|
|
hat_first_press = True
|
|
|
|
# Init joystick
|
|
pygame.joystick.init()
|
|
if pygame.joystick.get_count() > 0:
|
|
joystick = pygame.joystick.Joystick(0)
|
|
joystick.init()
|
|
|
|
def handle_hat_repeat():
|
|
global hat_timer, hat_first_press
|
|
now = pygame.time.get_ticks()
|
|
if hat_direction != (0, 0):
|
|
if hat_first_press:
|
|
if now - hat_timer >= HAT_REPEAT_DELAY:
|
|
hat_timer = now
|
|
hat_first_press = False
|
|
post_hat_repeat_event()
|
|
else:
|
|
if now - hat_timer >= HAT_REPEAT_INTERVAL:
|
|
hat_timer = now
|
|
post_hat_repeat_event()
|
|
|
|
def post_hat_repeat_event():
|
|
pygame.event.post(pygame.event.Event(pygame.USEREVENT, {
|
|
"type_name": "JOYHATREPEAT",
|
|
"value": hat_direction
|
|
}))
|
|
|
|
running = True
|
|
while running:
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
running = False
|
|
|
|
elif event.type == pygame.JOYHATMOTION:
|
|
hat_direction = event.value
|
|
hat_timer = pygame.time.get_ticks()
|
|
hat_first_press = True
|
|
|
|
elif event.type == pygame.USEREVENT and event.dict.get("type_name") == "JOYHATREPEAT":
|
|
print(f"Repeated hat: {event.dict['value']}")
|
|
|
|
handle_hat_repeat()
|
|
screen.fill((0, 0, 0))
|
|
pygame.display.flip()
|
|
clock.tick(60)
|