碰撞后如何让我的角色停下来
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.velx
和 Player.vely
像素。因此,将 velx
和 vely
速度设置为 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
"""
我的角色应该在击中精灵组后停止,但我不知道如何。 碰撞效果完美。
我尝试将速度设置为空,但我无法再移动我的角色。 希望有人能帮助我。提前致谢
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.velx
和 Player.vely
像素。因此,将 velx
和 vely
速度设置为 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
"""