python - 尝试创建没有重叠的 Sprite

标签 python pygame sprite

我正在尝试创建在启动时向屏幕添加 50 个 Sprite 的游戏。我在这个 Sprite 的 __init__ 函数中有以下内容:

if self.overlapping_sprites:
    for sprite in self.overlapping_sprites:
        self.game.make_obstacles(1, 1400, self.game.speed)
        self.die()

这几乎可以检测是否有任何重叠的 Sprite ,并且对于这些 Sprite 中的每一个,它都会创建一个新的 Sprite 并删除有问题的 Sprite 。实现这段代码创造了奇迹,但它仍然不完美。加载时肯定还有一些重叠的 Sprite 。哦,我应该提到我是根据给定的长度随机创建这些 Sprite 。

作为引用,make_obstacles() 函数是这样的:

def make_obstacles(self, num, length, dx):
    for i in range(num):
        x = random.randrange(700, length)
        y = random.randrange(10, games.screen.height - 10)
        size = random.choice([Obstacle.obstacle_1,Obstacle.obstacle_3])
        new_obstacle = Obstacle(game = self, x = x, y = y, size = size, dx = dx)
        games.screen.add(new_obstacle)

还有其他方法可以让我尝试在这里实现我的目标吗?我还想弄清楚为什么会在概念层面上发生这种情况,以加深我的理解,因此非常感谢任何帮助。

最佳答案

显而易见的解决方案?

我不是 pygame 专家;但我想我已经弄清楚问题出在哪里了。不过,我可能完全偏离了,因为我不确定其余代码的外观。

您在第一段代码中制造了障碍,然后没有检查这些障碍的 Sprite 是否与其他 Sprite 发生碰撞!您只检查它们是否在第一个代码块中发生冲突;并且此代码块不会在第二次创建的障碍上运行。

要测试我是否正确,请尝试删除第一个代码块中的 self.game.make_obstacles 调用,以便仅删除而不是重新创建碰撞 Sprite 。现在,检查是否有任何 Sprite 碰撞。

既然我们已经确定没有,请着手重写您的代码。对我来说,你构建它的方式似乎有点做作 - 我曾经为 GameMaker 编写这样的代码。我认为编写此代码的明显更好的方法是重写您的 ma​​ke_obstacles 方法,以便它在放置障碍物之前检查碰撞。有一个 while 循环说类似的话

def make_obstacles(self, num, length, dx):
    for i in range(num):
        while True:
            x = random.randrange(700, length)
            y = random.randrange(10, games.screen.height - 10)
            size = random.choice([Obstacle.obstacle_1,Obstacle.obstacle_3])
            if is_empty(x, y, size):
                break
        new_obstacle = Obstacle(game = self, x = x, y = y, size = size, dx = dx)
        games.screen.add(new_obstacle)

is_empty 基本上是一个 bool 表达式,当 xy 对于障碍物大小 为空时计算结果为真(即,将对象放在那里不会导致碰撞)并且当 xy 与已经存在的障碍物发生碰撞时计算结果为 false。将 is_empty 替换为执行其预期操作的 bool 表达式。

请注意,这可能会导致一个永不停止运行的循环!如果游戏屏幕上满是障碍物,解释器将继续评估 while True: 循环的内容,直到 expected end of the universe 结束。 .这意味着您需要确保屏幕上永远不会有太多障碍,或者您只需要尝试一定次数就可以放弃。 (如果是后一种选择,请将 while True: 替换为 for x in range(10000): 或其他适当的数字)

我希望这已经解决了问题;如果您需要更多帮助,请在下方评论!

关于python - 尝试创建没有重叠的 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832425/

相关文章:

python - 在 Python 中裁剪并仅选择图像中检测到的区域

python - Pygame 由于 Sprite 而滞后?

python - 所有 spritesheet 都显示在屏幕上

html - CSS Sprite 和屏幕外的链接

python - range() 真的会创建列表吗?

python - "RuntimeWarning: invalid value encountered in multiply"错误如何获取更详细的错误信息numpy

python - 趋势 : repeatedly running the same script gives results for different sets of countries

python - Pygame 通过单击循环浏览图像

javascript - JS : Load sprite when needed without a plugin

actionscript-3 - 是什么导致这张卡改变维度? [视频和代码]