【问题标题】:Player gets stuck in wall pygame玩家卡在墙pygame中
【发布时间】:2020-01-31 05:44:34
【问题描述】:

每当玩家与墙发生碰撞时,他们就会卡在墙上而无法移动。代码如下:

collide = pg.sprite.collide_mask(self, self.game.map)

        if keys[pg.K_w]:
            self.pos.y -= playerSpeed
            if collide:
                self.pos.y += playerSpeed
        if keys[pg.K_a]:
            self.pos.x -= playerSpeed
            if collide:
                self.pos.x += playerSpeed
        if keys[pg.K_s]:
            self.pos.y += playerSpeed
            if collide:
                self.pos.y -= playerSpeed
        if keys[pg.K_d]:
            self.pos.x += playerSpeed
            if collide:
                self.pos.x -= playerSpeed

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    这正是您的代码所告诉的内容:

    collide = pg.sprite.collide_mask(self, self.game.map)
    

    所以当玩家撞墙时这将是正确的

    if keys[pg.K_s]:
        self.pos.y += playerSpeed
        if collide:
            self.pos.y -= playerSpeed
    

    所以如果碰撞为真,实际发生的情况是:

    self.pos.y += playerSpeed
    self.pos.y -= playerSpeed
    

    所以最终结果是位置不会改变(所有其他方向都相同)。

    现在真正的问题是:您希望发生什么?大概你应该知道四个方向中哪个方向被墙挡住了,只把那个方向的移动设置为0。

    【讨论】:

      【解决方案2】:

      问题是您需要在玩家卡在对象上之前检查碰撞。一旦玩家处于碰撞状态,测试:

      collide = pg.sprite.collide_mask(self, self.game.map)
      

      无论如何都会简单地返回True。正如@ChrisMaes 指出的那样,一旦发生碰撞,运动将永远不会再影响结果。

      解决方案是在移动完成之前测试碰撞:

      if keys[pg.K_w]:
          self.pos.y -= playerSpeed
          if ( pg.sprite.collide_mask( self, self.game.map ) ):
              self.pos.y += playerSpeed                          # Undo the movement
      # ... etc, same change for the rest of the movement keys
      

      这种方法有问题。如果playerSpeed5 的常数,则玩家不可能靠在障碍物上移动,因为测试是在5 像素处完成的,他们会在1-5 像素处停止。如果玩家速度是固定的(并且 > 1),则有必要确定玩家可以移动到障碍物的距离,并且只允许移动该距离。这会让玩家在它碰撞的物体旁边,而不是 1-4 像素之外。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多