pygame - 碰撞检测和实体对象创建

时间:2016-01-29 02:24:06

标签: python pygame collision-detection collision game-physics

所以这个问题是关于我昨天关于pygame碰撞检测和实体对象创建的问题。这是我的新代码:

if player.rect.left >= rect.right + 1:
        player.undo_right()
    if player.rect.right <= rect.left - 1:
        player.undo_left()
    if player.rect.bottom <= rect.top + 2:
        player.undo_top()
    if player.rect.top >= rect.bottom + 2:
        player.undo_bottom()

目前,它处理一些基本的碰撞检测。如果玩家的x值/ y值大于/小于目标表面,则玩家移动一定量。问题是,这只会让玩家全部“紧张”#34;并且玩家仍然可以通过我的对象。

所以我想我现在的问题是我怎样才能让玩家无法通过一个物体?我已经尝试过player.rect.colliderect,但得到的结果和上面的结果大致相同。

似乎没有一种简单的方法可以有效地做到这一点,这就是我转向你们的原因。我可以把头撞在墙上几个小时,但我宁愿首先得到社区的批评和建议。

无论如何,提前谢谢你。

1 个答案:

答案 0 :(得分:1)

您的代码错误地检测到了冲突,因为它不会同时检查多个条件是否为真。目前,只要玩家位于物体的右侧,他就算与左侧相撞。同样地,如果他高于它,他就算是触底了。 (或者类似的东西,考虑到你当前的代码,我不确定你是如何对齐轴的。)

当对象碰撞时,告诉他们如何碰撞它们会更容易。如果一个物体的右侧位于另一个物体左侧的左侧,则它们显然根本无法接触。与其他成对的“面对”侧面相似。在深入了解两个碰撞矩形如何接触的复杂细节之前,首先可能值得使用这些快速测试。

因为一对矩形可以通过很多方式碰撞!根据我的统计,有16种不同的方式。有四种“角落”碰撞,其中每个矩形的正好一个角落在另一个矩形内。然后你有八个“边缘”碰撞,其中一个矩形的一个边完全在另一个矩形内(每个矩形的每个边有一个)。然后有四种情况,矩形完全穿透,形成十字形(有两个方向)或一个矩​​形完全在另一个内。

现在,对于您的游戏,您可能可以排除这些类型的碰撞。如果您的对象相对于它们的大小移动缓慢,那么没有对象的速度(以像素/帧为单位)超过给定维度中任何其他对象的大小,您可以跳过四个相互渗透的情况。如果所有对象都是相同的大小,你可以像边角情况一样处理边缘情况(反之亦然,可能会有一些调整)。您也可以使用对象相对速度的知识来评估它们的碰撞方式,而不会深入了解具体细节(例如,如果玩家向右移动,他的左侧不能与墙壁碰撞)。 / p>

但这一切都取决于游戏的细节。在通用引擎中,您可能需要解决所有16个案例。