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

Я пытаюсь создать проект, который я сделал ранее, но кроме этого времени я собираюсь использовать игровую станцию ​​с одним пультом, который мне бесплатно дали из моей школы.Проблема в том, что когда я перемещаю джойстик вверх и вниз, он показывает одинаковые координаты. (Если вы не понимаете, что я имею в виду, посмотрите на рисунок ниже).Кроме того, я не уверен, что нужно добавить в оператор if, чтобы он проверял, находится ли джойстик вверх или вниз.У меня также возникают проблемы с размышлениями о том, как вы будете проверять, движется ли джойстик в любом направлении.

Я уже пытался использовать оператор if, где, если джойстик больше одного числа и меньше другого (первое число находится в верхней половине джойстика, а другое число означает, что он находится вВ нижней половине джойстика он будет перемещаться вниз. Текущее утверждение if не выдает никаких ошибок, но не работает. Я пробовал оператор if, чтобы проверить, находится ли он посередине, но я не слишком уверен в этом.

    joystick_count = pygame.joystick.get_count()
if joystick_count == 0:
    # No joysticks!
    print("Error, I didn't find any joysticks.")
else:
    # Use joystick #0 and initialize it
    joystick = pygame.joystick.Joystick(0)
    joystick.init()

if pygame.joystick.Joystick(0).get_axis(0) >= -0.0 and pygame.joystick.Joystick(0).get_axis(0) <= 0.0:
      player_one.speed_y = 5

elif pygame.joystick.Joystick(0).get_axis(0) > -0.1 and pygame.joystick.Joystick(0).get_axis(0) < -0.9:
    player_one.speed_y = -5

elif pygame.joystick(0).get_axis(0) == 0.0:
    player_one.speed_y = -5



#The first if statement checks if the joystick is up and the second one
#checks if the joystick is downwards
# the middle one checks if the if statement is in the middle (not too sure)
#player one and two speed is what gets added on each time

Фактические результаты: спрайт не перемещается при перемещении джойстика вниз.

Ось джойстика

1 Ответ

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

Сначала убедитесь, что у вас есть джойстик, получив количество джойстиков на pygame.joystick.get_count().Инициализируйте джойстик с помощью pygame.joystick.Joystick.init:

joystick = None
if pygame.joystick.get_count() > 0:
    joystick = pygame.joystick.Joystick(0)
    joystick.init()

После инициализации джойстика значение оси ist можно получить с помощью pygame.joystick.Joystick.get_axis.Значение, возвращаемое этой функцией, находится в диапазоне [-1, 1].-1 для максимального отрицательного наклона и +1 для максимального положительного наклона.
Обратите внимание, что каждая аналоговая ручка геймпада или джойстика имеет 2 оси, одну для горизонтального направления и 1 для вертикального направления.Поскольку значение, возвращаемое get_axis(), зависит от наклона аналогового джойстика, вы должны умножить скорость на значение.
Кроме того, вы должны игнорировать значения около 0 для мертвой точки из-за неточности оборудования,Это можно сделать с помощью простой проверки с использованием встроенной функции abs(x) например, abs(axisval) > 0.1:

if joystick:
    axis_x, axis_y = (joystick.get_axis(0), joystick.get_axis(1))
    if abs(axis_x) > 0.1:
        player_one.speed_x = 5 * axis_x
    if abs(axis_y) > 0.1:
        player_one.speed_y = 5 * axis_y

См. Следующее простое демонстрационное приложение:

import pygame
pygame.init()

size = (800,600)
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
pos = [size[0]/2, size[1]/2]
speed = 5
joystick = None

done = False
while not done:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                done = True

    if joystick:
        axis_x, axis_y = (joystick.get_axis(0), joystick.get_axis(1))
        if abs(axis_x) > 0.1:
            pos[0] += speed * axis_x
        if abs(axis_y) > 0.1:
            pos[1] += speed * axis_y
    else:
        if pygame.joystick.get_count() > 0:
            joystick = pygame.joystick.Joystick(0)
            joystick.init()
            print("joystick initialized")

    screen.fill((0, 0, 255))
    pygame.draw.rect(screen, (255,255,255), (*pos, 10, 10))
    pygame.display.flip()
...