当前位置: 代码迷 >> python >> 移动时如何使敌人的精灵碰撞而不能啮合在一起
  详细解决方案

移动时如何使敌人的精灵碰撞而不能啮合在一起

热度:101   发布时间:2023-06-13 15:15:25.0

编辑:请不要再指我指的是与摇滚游戏相撞的那只鸟,我的问题不在他附近。 我的玩家可以与游戏中的墙壁碰撞而不会穿过墙壁,但是代码不会传递给僵尸。 僵尸不会相互碰撞和摩擦,它们只会彼此滑动并成为一个块。 请在下面阅读我的说明<3

因此,我正在开发pygame中的游戏,当玩家将僵尸击落时,僵尸会向玩家移动(我知道,原始的,对吗?),但是我必须检测到僵尸相互碰撞的代码在任何实际操作中均不起作用如果没有这种方式,僵尸只会向玩家移动并啮合成一个僵尸块。 我如何更改僵尸的代码,以使它们在靠近进食时不会互相碰到对方?

class Enemy(pygame.sprite.Sprite):
    def __init__(self, color):
        super().__init__()
        self.image = pygame.Surface([20, 20])
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.pos_x = self.rect.x = random.randrange(35, screen_width - 35)
        self.pos_y = self.rect.y = random.randrange(35, screen_height - 135)

        # How Zombies move towards player

    def update(self):
        zombie_vec_x = self.rect.x - player.rect.x
        zombie_vec_y = self.rect.y - player.rect.y
        vec_length = math.sqrt(zombie_vec_x ** 2 + zombie_vec_y ** 2)
        zombie_vec_x = (zombie_vec_x / vec_length) * 1 # These numbers determine
        zombie_vec_y = (zombie_vec_y / vec_length) * 1 # zombie movement speed

        self.pos_x -= zombie_vec_x
        self.pos_y -= zombie_vec_y

        self.rect.x = self.pos_x
        self.rect.y = self.pos_y


        block_hit_list = pygame.sprite.spritecollide(self, sprites_list, False)
        for block in block_hit_list:
            if self.rect.x > 0:
                self.rect.right = block.rect.left
            elif self.rect.x < 0:
                self.rect.left = block.rect.right
            elif self.rect.y > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom

这是完整的僵尸代码,当前的碰撞代码在底部,从block_hit_list =开始。 我们将不胜感激关于如何纠正此错误或解释冲突编码是如何工作的!

由于您尚未详细描述坐标系,因此我不确定代码细节是否100%正确。 但是,要点是必须为当前的僵尸移动找到一个安全的地方,该地方没有其他僵尸。 这确实需要您从限制最大的区域到最小的区域工作。 您可以将僵尸按某种空间顺序分类吗? 也许从左下角到右上角遍历您的僵尸列表?

鉴于此,每个僵尸都必须检查相对于所有其他僵尸的位置,而不仅仅是依次躲开彼此的僵尸。 您必须更全面地考虑x和y方向。 我认为这可以很好地实现,具体取决于移动速度(僵尸可以跨步超过僵尸宽度的一半吗?)。

    block_hit_list = pygame.sprite.spritecollide(self, sprites_list, False)
    if self.rect.x > 0:
        self.rect.right = min(block.rect.left for block in block_hit_list)
    else:
        self.rect.left = max(block.rect.right for block in block_hit_list)

    if self.rect.y > 0:
        self.rect.bottom = min(block.rect.top for block in block_hit_list)
    else:
        self.rect.top = max(block.rect.bottom for block in block_hit_list)

请注意,我要处理两个坐标,而不仅仅是一个坐标-我假设僵尸可以对角移动。 我不确定在您的坐标系中方向是否正确匹配:如果self.rect.x> 0,我是否想要正向的僵尸的左边缘? 我不知道您的坐标系中是left> right还是top> bottom。 请根据需要进行测试和调整。

另外,请在每个分支中临时插入一个跟踪打印语句:至少在之前和之后显示x / y坐标。

这是否会使您迈向解决方案?

  相关解决方案