USB-контроллер не будет работать в Pygame

У меня есть USB-контроллер, который я назначил клавишами со стрелками на клавиатуре вне игровых программ (например, вы можете использовать его как обычные клавиши со стрелками на клавиатуре). Я сделал это с помощью программы ControlMK. Моя программа Pygame не распознает контроллер как клавиатуру. Когда я пытаюсь использовать модули джойстика, программа работает неправильно.

Вот мой код:

import pygame, sys, time, random
from pygame.locals import *

# set up pygame
try:
    pygame.init()
    pygame.display.init()
    pygame.mixer.init(size=8, buffer=2048)

    pygame.mixer.get_init

except:
    print "error in init\n"

white=(255,255,255)

screen=pygame.display.set_mode((800,600), pygame.RESIZABLE)

class Loadsound:

    def __init__(self, name, key, sound_file):
        self.name = name
        self.name=key
        self.sound = pygame.mixer.Sound(sound_file)

sound_left=[]
sound_left.append(Loadsound("left","K_LEFT", "left.wav"))
sound_right=[]
sound_right.append(Loadsound("right","K_RIGHT", "right.wav"))
sound_up=[]
sound_up.append(Loadsound("up","K_UP","up.wav")) 
sound_down=[]
sound_down.append(Loadsound("down","K_DOWN","down.wav"))


while True:
  for i in pygame.event.get():
   if i.type==QUIT:
    exit()
  pressed=pygame.key.get_pressed()


  if pressed[K_LEFT]:
      for left in sound_left:
          left.sound.play()
  elif pressed[K_RIGHT]:
      for right in sound_right:
          right.sound.play()
  elif pressed[K_UP]:
      for up in sound_up:
          up.sound.play()
  elif pressed[K_DOWN]:
      for down in sound_down:
          down.sound.play()

Спасибо вам за помощь!

Редактировать:

Я пытался использовать модуль джойстика. Вот откуда я брал пример кода:

http://www.pygame.org/wiki/Joystick_analyzer

Я отредактировал свой код, чтобы включить некоторые из них, но он все еще не работает. Вот мой отредактированный код:

import pygame, sys, time, random
from pygame.locals import *
from pygame import *

# set up pygame
try:
    pygame.init()
    pygame.display.init()
    pygame.mixer.init(size=8, buffer=2048)

    pygame.mixer.get_init

except:
    print "error in init\n"

white=(255,255,255)

screen=pygame.display.set_mode((800,600), pygame.RESIZABLE)

class Loadsound:

    def __init__(self, name, key, sound_file):
        self.name = name
        self.name=key
        self.sound = pygame.mixer.Sound(sound_file)

sound_left=[]
sound_left.append(Loadsound("left","K_LEFT", "left.wav"))
sound_right=[]
sound_right.append(Loadsound("right","K_RIGHT", "right.wav"))
sound_up=[]
sound_up.append(Loadsound("up","K_UP","up.wav")) 
sound_down=[]
sound_down.append(Loadsound("down","K_DOWN","down.wav"))

def __init__(self):
    pygame.joystick.init()
    self.my_joystick = None
    self.joystick_names = []

    for i in range(0, pygame.joystick.get_count()):
        self.joystick_names.append(pygame.joystick.Joystick(i).get_name())

    print self.joystick_names

    if (len(self.joystick_names) > 0):
        self.my_joystick = pygame.joystick.Joystick(0)
        self.my_joystick.init()

    #max_joy = max(self.my_joystick.get_numaxes(), self.my_joystick.get_numbuttons(), self.my_joystick.get_numhats()

while True:
    for i in pygame.event.get():
        pygame.event.pump()
    if i.type==QUIT:
        exit()
    #pygame.joystick.Joystick(0)
    #Joystick.init()
    pressed=pygame.key.get_pressed()
    #pressed_j=Joystick.get_hat()
    def check_hat(self, p_hat):
        if (self.my_joystick):
            if (p_hat,self.my_joystick.get_numhats()):
                return self.my_joystick.get_hat(p_hat)

        return (0, 0)



    if check_hat==(-1,0):
    #if pressed[K_LEFT]:
        for left in sound_left:
            left.sound.play()
    elif pressed[K_RIGHT]:
        for right in sound_right:
            right.sound.play()
    elif pressed[K_UP]:
        for up in sound_up:
            up.sound.play()
    elif pressed[K_DOWN]:
        for down in sound_down:
            down.sound.play()

Для ясности мой код работает при использовании клавиатуры. Однако это не переводится на контроллер, который сопоставлен с теми же клавишами.


person user1848006    schedule 24.11.2012    source источник
comment
Ваша программа работает с обычными клавишами клавиатуры?   -  person jsbueno    schedule 25.11.2012
comment
Вы можете попробовать добавить вызов pygame.event.pump() в свой основной цикл.   -  person jsbueno    schedule 25.11.2012


Ответы (2)


Вам понадобится модуль джойстика от Pygame или что-то подобное, в котором есть метод например: Joystick.get_init(), который сообщает, инициализирован ли джойстик в Pygame, и Joystick.get_axis(axis_number), который возвращает положение джойстика в виде числа с плавающей запятой вдоль заданной оси axis_number. ControlMK, вероятно, сопоставляет джойстик с клавишами на слишком высоком уровне для взаимодействия с Pygame, хотя может быть какой-то способ изменить это, его документация кажется ограниченной.

person rofls    schedule 25.11.2012
comment
Я пытался использовать модуль джойстика, но он не работает. Я попытался следовать учебнику на веб-сайте pygame, но код в нем не работает. Вот ссылка на код, который я просматривал: pygame.org/wiki/Joystick_analyzer К сожалению , это дает мне синтаксические ошибки. Я пытался реализовать его части, которые не были пронизаны синтаксисом, в моем коде, но это все равно не сработало. Я отредактирую свой исходный пост, чтобы включить этот новый код. - person user1848006; 25.11.2012
comment
хорошо, это будет интерактивная помощь, если вы решите ее принять: 1) подключите USB-джойстик 2) запустите интерпретатор Python (просто введите python в терминале Linux/Mac или сделайте то же самое в Windows CMD) 3 ) набираем import pygame 4) набираем pygame.joystick.init() 5) набираем Joystick.get_numaxes который должен сказать нам, какие числа присвоены осям 6) держим джойстик по диагонали и набираем Joystick.get_axis(axis_number) для каждой оси, удерживая его Если он возвращает 0 для каждой, это плохо, и мы Придется устранять неполадки. В противном случае... - person rofls; 25.11.2012
comment
Ну, я начал пытаться это сделать, и возникла та же проблема, что и раньше. Он жалуется на то, что имя Joystick не определено. - person user1848006; 25.11.2012
comment
Хм. Как вы установили Pygame? Попробуйте установить его с помощью менеджера пакетов. Похоже, к сожалению, вы не установили весь Pygame, так как Joystick является одним из содержащихся модулей. - person rofls; 25.11.2012

Попробуй это:

import pygame

pygame.init()
print "Joystics: ", pygame.joystick.get_count()
my_joystick = pygame.joystick.Joystick(0)
my_joystick.init()
clock = pygame.time.Clock()

while 1:
    for event in pygame.event.get():
        print my_joystick.get_axis(0),  my_joystick.get_axis(1) 
        clock.tick(40)

pygame.quit ()
person ZloAlien    schedule 14.02.2013