Как двигаться и стрелять одновременно с помощью джойстика на Pygame? - PullRequest
0 голосов
/ 25 февраля 2019

Я работаю над Space Invaders с Open AI Gym и показываю его благодаря Pygame.Но я не знаю, как двигаться по оси джойстика и одновременно стрелять кнопкой джойстика, хотя я добавляю их в очередь.Вот мой код:

def find_num_action(action_list) :
    if len(action_list)>1 :
        if (1 in action_list) :
            if (2 in action_list) and (3 in action_list) :
                num_action = 1
            elif (2 in action_list) :
                num_action = 4
            elif (3 in action_list) :
                num_action = 5
            else :
                num_action = 1

        elif (2 in action_list) and (3 in action_list) :
            num_action = 0

        elif (2 in action_list) :
            num_action = 2

        elif (3 in action_list) :
            num_action = 3

    elif len(action_list) == 1 :
        num_action = action_list[0]
    else :
        num_action = 0
    return num_action

running = True
pygame.key.set_repeat(50, 20)
fps = 40
clock = pygame.time.Clock()

while running:

    for event in pygame.event.get():
        action_list = []

        # Actions : ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE']

        if event.type == QUIT :
            running = False

        if event.type == JOYBUTTONDOWN :
            if event.button == 2 :
                action_list.append(1)

    axis = mon_joystick.get_axis(0)
    if axis > 0:
        action_list.append(2)
    if axis < 0:
        action_list.append(3)

    num_action = find_num_action(action_list)

    obs, reward, done, info = env.step(num_action)

    clock.tick(fps)

1 Ответ

0 голосов
/ 26 февраля 2019

Обновление: я нашел решение, не используя события Pygame, но используя функцию Py_Game get_button, которая возвращает состояние кнопки (если она нажата или нет).

def find_num_action(action_list, shoot) :

    # Actions : ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE']

    num_action = 0
    if (shoot) :
        if (2 in action_list and 3 in action_list) :
            num_action = 1
        elif (2 in action_list) :
            num_action = 4
        elif (3 in action_list) :
            num_action = 5
        else :
            num_action = 1
    else :
        if (2 in action_list and 3 in action_list) :
            num_action = 0
        elif (2 in action_list) :
            num_action = 2
        elif (3 in action_list) :
            num_action = 3
    return num_action

running = True
pygame.key.set_repeat(50, 20)
fps = 40
clock = pygame.time.Clock()

while running:

    action_list = []
    shoot = False

    for event in pygame.event.get():
        if event.type == QUIT :
            running = False

    shoot = mon_joystick.get_button(2)
    axis = mon_joystick.get_axis(0)
    if axis > 0:
        action_list.append(2)
    if axis < 0:
        action_list.append(3)

    num_action = find_num_action(action_list, shoot)

    obs, reward, done, info = env.step(num_action)

    clock.tick(fps)
...