微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyGame 中的碰撞

如何解决PyGame 中的碰撞

我正在尝试使用 PyGame 编写一个简单的块之间碰撞模拟器。我已经尝试在线观看几个关于如何以更好的方式检测碰撞的视频,并且我已经设法编写了这个函数

def block_collisions(self,block1,block2,collision_tolerance=10):
        """ check whether the two passed block objects happen to collide """

        # storing initial veLocities of the two blocks
        block1_initialV = block1.v
        block2_initialV = block2.v

        if block1.block.colliderect(block2.block):

            # the collision can happn only on the left and right side of the blocks since it is a rectilinear motion
            if abs(block2.block.right - block1.block.left) < collision_tolerance and block1.v < 0 :

                self.collision_sound.play()

                # calculating new veLocities
                block1.v = (2*block2.m*block2_initialV + (block1.m - block2.m)*block1_initialV) / (block1.m + block2.m)
                block2.v = (2*block1.m*block1_initialV + (block2.m - block1.m)*block2_initialV) / (block1.m + block2.m)
                
            if abs(block2.block.left - block1.block.right) < collision_tolerance and block1.v > 0:

                self.collision_sound.play()

                # calculating new veLocities                
                block1.v = (2*block2.m*block2_initialV + (block1.m - block2.m)*block1_initialV) / (block1.m + block2.m)
                block2.v = (2*block1.m*block1_initialV + (block2.m - block1.m)*block2_initialV) / (block1.m + block2.m)

使用弹性碰撞公式计算新速度(线性动量和动能守恒)。其中 block1 和 block2 是一个类的两个对象(我已经写过),而 block1/2.block 是用于表示块的 PyGame Rect 对象。 Block1/2.v 和 block1/2.x 是块的速度和位置,而 block/2.m 是块的质量。该块的宽度 = 高度 = f(m) = 20 + 10ln(m)。上面的函数在这部分应用程序的主循环中被调用

while self.running:

    ...

    # updating the value of block's coordinates and check for collisions
    for b_ in self.blocks:

        # checking for collisions with other blocks
        for b__ in self.blocks:
            if not b_ == b__:
                self.block_collisions(b_,b__)

                # updating blocks coordinates
                b_.x += round(b_.v,0)
    ...

其中 self.blocks 是一个包含多个 Block 类对象的列表(每个对象都具有上述相同的属性)。当我尝试运行动画时,最初它工作正常,但在某个时刻,相互碰撞的块保持连接而不是弹跳。我可以说,因为我已经在这个动画中添加一个声音,当这个错误发生时,它是由于仍然在碰撞中的块(声音重复自己)并且无法以某种方式分开(可能是因为计算了速度超过一次,这会导致 +k 和 -j 值之间的波动,从而导致两个块的整体速度为 kj)。我不知道这里有什么问题,你有什么想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。