如何在pygame中使用摇杆使精灵上下移动

4
我正在尝试创建一个之前已经做过的项目,但是这一次我将使用一台从学校免费得到的PlayStation 1遥控器。问题在于当我将摇杆向上或向下移动时,它显示相同的坐标(如果您不明白我的意思,请看下面的图片)。我也不确定需要在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个回答

4

首先确保你有一个游戏手柄,通过pygame.joystick.get_count()获取手柄数量。然后通过pygame.joystick.Joystick.init初始化手柄:

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

一旦操纵杆被初始化,可以通过pygame.joystick.Joystick.get_axis获取其轴值。此函数返回的值范围为[-1,1]。最大负倾斜为-1,最大正倾斜为+1。
请注意,游戏手柄或操纵杆的每个模拟摇杆都有2个轴,一个用于水平方向,另一个用于垂直方向。由于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

请查看以下简单的演示应用程序:


这个应用程序涉及IT技术。
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接