【问题标题】:Why I can't move my character with a joystick in Python?为什么我不能在 Python 中用操纵杆移动我的角色?
【发布时间】:2021-06-02 00:13:46
【问题描述】:

我正在尝试使我的游戏能够使用 xbox one 控制器玩,我可以让它射击并退出游戏,但我的轴有问题(我尝试过使用 D-pad但它是一样的)

编辑:现在我可以让它移动,但它就像一个框架,我需要多次移动轴才能让它移动,我想保持轴 1 并且玩家移动平稳,并且由于某种原因它总是向左移动。

这是Player 类:

class Player(pygame.sprite.Sprite):

    def update(self):
        self.speed_x = 0
    for event in pygame.event.get():
        if event.type == JOYAXISMOTION:
            if event.axis <= -1 >= -0.2:
                self.speed_x = PLAYER_SPEED
            if event.axis <= 1 >= 0.2:
                self.speed_x = -PLAYER_SPEED
            self.rect.x += self.speed_x

【问题讨论】:

  • 你在初始化你的操纵杆吗? joystick = pygame.joystick.Joystick( 0 )joystick.init()。您还应该检查 pygame.joystick.get_count() 是否非零。
  • 是的,我已经初始化了操纵杆,并测试了操纵杆。我可以射击,这意味着我猜 get_count 不为零。谢谢。
  • 您是否尝试过打印if event.type == JOYAXISMOTIONif event.axis 中的事件数据?
  • 我得到像&lt;Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 1, 'value': -0.05612353892635884})&gt; 这样的数字(4 面全部为负数,全推时为-1)
  • 旧游戏有函数"calibrate joystick"。游戏要求将操纵杆向所有方向移动,以便获得所有方向的最大值,然后它可以使用它来计算正确的移动。

标签: python class pygame controller


【解决方案1】:

操纵杆只会通知您位置的变化。所以如果之前发送了一个事件说摇杆的左右轴在0.5,那么摇杆轴仍然0.5

所以你可能需要这样的东西:

    PLAYER_SPEED = 7

    ...
    
    for event in pygame.event.get():
        if event.type == JOYAXISMOTION:
            if event.axis == 1:                              # possibly left-right
                player.speed_x = PLAYER_SPEED * event.value  
            elif event.axis == 2:                            # possibly up-down    
                player.speed_y = PLAYER_SPEED * event.value
     ...


     # In main loop        
     movePlayer( player.speed_x, player.speed_y )

轴如何映射到上/下和左/右取决于操纵杆类型。所以也许你需要反转映射。

【讨论】:

  • 它有点工作(我的意思是它不会使游戏崩溃),但我有相同的结果,玩家不动。不过谢谢。
  • @Bluva - 然后我会添加一些 print()s 以确保您正确获取事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多