Pygame 精灵碰撞后移动[重复]

问题描述 投票:0回答:1

我已经做到了,当玩家 1 和玩家 2 的精灵碰撞时,代码停止接受输入并且它们不会移动。如果碰撞后的输入与碰撞方向相反,那么当两个精灵碰撞时,它们不会重叠并且可以彼此远离,那么我在实现移动时遇到了麻烦。

这是我得到的代码片段:

 keys1 = pygame.key.get_pressed()
    if pygame.Rect.colliderect(player1.rect, player2.rect) == False:
        player1.update(keys1)
    else: (continue moving if input diretion is opposite to collision direction)
        
pygame
1个回答
-1
投票

根据您的游戏,您可能仍然希望玩家能够在碰撞时按键(例如在某种近战中),但这需要您重构。

我建议学习旧游戏如何处理这个问题。例如,《马里奥 64》中的每个动作都分 4 步进行,每一步后都会检查下一个动作是否会使马里奥与墙壁相撞。作为一名业余爱好开发者,您可以只执行一步,甚至简单地允许矩形暂时过度实验室,但然后相互向后推,这样它们就几乎不会接触:

p1.update(keys)
p2.update(keys)
if collide(p1.rect, p.rect):
    #we make the inverse of the vector between p1 and p2's centers
    between_centers = pygame.math.Vector2(p2.rect.center.x - p1.rect.center.x, p2.rect.center.y - p1.rect.center.y)
    #we scale that vector by half, to make each player be reppelled by the same amount
    between_centers.scale_to_length(between_centers.length/2)
    
    #we move p1 backwards
    p1.rect.move_ip(between_centers.x, between_centers.y)

    #we invert the vector, to push p2 in the opposite direction
    between_centers.rotate_ip(180)
    p2.rect.move_ip(between_centers.x, between_centers.y)

请注意,这并没有考虑到玩家下方的最终地面,因此假设这是一款自上而下的游戏,例如《进入地牢》。

作为一般经验法则,允许玩家对象暂时(小于 1 帧!)相交并稍后修复它比从一开始就阻止他们采取行动更容易。这是因为玩家输入可能不是改变其位置的唯一因素,例如,您可以想象受到伤害或射击强大的武器也会更新其位置,无论他们是否按下按键。

© www.soinside.com 2019 - 2024. All rights reserved.