碰撞后如何让我的角色停下来

How do I make my character stop after colliding

我的角色应该在击中精灵组后停止,但我不知道如何。 碰撞效果完美。

我尝试将速度设置为空,但我无法再移动我的角色。 希望有人能帮助我。提前致谢

def update(self):
    self.animate()
    self.x += self.velx
    self.y += self.vely
    BATTLE.fight += round(BATTLE.fightcount * 0.9)

hit = pygame.sprite.spritecollide(PLAYER, all_sprites, False)

if hit:
    if PLAYER.x >= b.rect.x:
       PLAYER.x = b.rect.x - 17
    elif PLAYER.x <= b.rect.x:
        PLAYER.x = b.rect.x + 15
    elif PLAYER.y <= b.rect.y:
        PLAYER.y = b.rect.y +10
    elif PLAYER.y >= b.rect.y:
        PLAYER.y = b.rect.y -10
for event in pygame.event.get():
    if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
        setup_gfx.done = True
        sys.exit()
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            BATTLE.fightcount +=1
            PLAYER.velx -= 1
            PLAYER.current_frame += 1
        if event.key == pygame.K_RIGHT:
            BATTLE.fightcount += 1
            PLAYER.velx += 1
            PLAYER.current_frame += 1
        if event.key == pygame.K_UP:
            BATTLE.fightcount +=1
            PLAYER.vely -= 1
            PLAYER.current_frame += 1
        if event.key == pygame.K_DOWN:
            BATTLE.fightcount +=1          
            PLAYER.vely += 1
            PLAYER.current_frame += 1

简单来说,按下箭头键可以提高玩家的速度。每次调用 Player.update() 都会将播放器移动 Player.velxPlayer.vely 像素。因此,将 velxvely 速度设置为 0 足以阻止玩家移动。

class Player( pygame.sprite.Sprite ):
    ...
    def stop( self ):
        self.velx = 0
        self.vely = 0

但是,我怀疑还有一个额外的问题,即玩家精灵在它所碰撞的任何东西上都变得 "hung up"。当精灵每次移动大量像素时,这会成为一个更大的问题。在一个更新周期中,玩家没有发生碰撞,但在下一次更新中,它可能在平台内 5 个像素(或其他)。碰撞时会发生什么 - 速度降低为零,但玩家 "stuck" 在物体上。

解决这个问题的方法是使用最后一个 "step" 的 amount/direction(在本例中为 vel 像素),并用它在 [=24] 处停止播放器=]障碍物的边缘,而不是与障碍物重叠。

我终于修复了它,它运行良好。所以这是合适的代码。

"""

    hit = pygame.sprite.spritecollide(PLAYER, all_sprites, False)

    for collision in hit:
        if PLAYER.velx > 0:
            PLAYER.velx = 0
            PLAYER.x -= 10
        elif PLAYER.velx < 0:
            PLAYER.velx = 0
            PLAYER.x += 10
    for collision in hit:
        if PLAYER.vely > 0:
            PLAYER.vely = 0
            PLAYER.y -= 10
        elif PLAYER.vely < 0:
            PLAYER.vely = 0
            PLAYER.y += 10

"""