我一直在尝试用 Python 为马里奥风格的平台游戏实现像素完美碰撞。
它工作得很好,但是当玩家到达平台的边缘时,它会在边缘出现错误和卡顿。
我很确定这是垂直和水平碰撞之间的冲突,但即便如此我也没有真正想出解决方案
任何关于如何进行的提示/建议将不胜感激。
这是我假设是错误来源的碰撞代码:
def handle_vertical_collision(player,objects,dy):
collided_objects = []
if player.gravity > 0:
for obj in objects:
if pygame.sprite.collide_mask(player,obj):
if dy > 0:
player.rect.bottom = obj.rect.top
player.landed()
elif dy < 0:
player.rect.top = obj.rect.bottom
player.hit_head()
collided_objects.append(obj)
elif player.gravity < 0:
for obj in objects:
if pygame.sprite.collide_mask(player,obj):
if dy < 0:
player.rect.top = obj.rect.bottom
player.landed()
elif dy > 0:
player.rect.bottom = obj.rect.top
player.hit_head()
collided_objects.append(obj)
return collided_objects
def collide(player,objects,dx):
player.move(dx,0)
player.update()
collided_object = None
for obj in objects:
if pygame.sprite.collide_mask(player,obj):
collided_object = obj
break
player.move(-dx,0)
player.update()
return collided_object
def handle_move(player,objects):
keys = pygame.key.get_pressed()
player.x_vel = 0
collide_left = collide(player, objects, -PLAYER_VEL*2)
collide_right = collide(player,objects, PLAYER_VEL*2)
if keys[pygame.K_LEFT] and not collide_left:
player.move_left(PLAYER_VEL)
if keys[pygame.K_RIGHT] and not collide_right:
player.move_right(PLAYER_VEL)
vertical_collide = handle_vertical_collision(player,objects,player.y_vel)
to_check = [collide_left,collide_right,*vertical_collide]
for obj in to_check:
if obj and obj.name == "fire":
player.make_hit()