试图创建没有重叠的精灵

时间:2012-12-12 03:45:01

标签: python pygame sprite

我正在尝试创建这个游戏,在启动时将50个精灵添加到屏幕上。我在这个精灵的__init__函数中有以下内容:

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

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

供参考,这就是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)

我是否应该尝试另一种方法来实现我的目标?我还想弄清楚为什么这会在概念层面上发生以促进我的理解,所以任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

明显的解决方案?

我不是pygame的专家;但我想我已经弄明白问题在这里了。我可能完全离开了,因为我不确定代码的其余部分是什么样的。

你在第一段代码中遇到障碍,然后不检查那些障碍物的精灵是否与其他精灵发生冲突!你只是检查它们是否在第一个代码块中发生碰撞;并且此代码块不会在第二次创建的障碍上运行。

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

现在我们已经建立了没有,设置重写代码。对我而言,你构建这个的方式似乎有点人为 - 我曾经为GameMaker编写这样的代码。编写此代码的明显更好的方法我觉得是重写 make_obstacles 方法,以便在放置障碍物之前检查碰撞。有一个循环说像

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 基本上是一个布尔表达式,当 x y 对于障碍 size 为空时,其计算结果为true (即,在那里放置一个对象不会导致碰撞),当 x y 与已经存在的障碍物碰撞时,评估为false。将 is_empty 替换为执行它应该执行的操作的布尔表达式。

请注意,这可能导致循环永不停止!如果游戏屏幕充满障碍,解释器将继续评估的内容,而True:循环直到expected end of the universe。这意味着您需要确保屏幕上没有太多障碍物,或者在放弃之前只需要尝试一定次数。 (如果是后一种选择,请将替换为 ,范围为(em)> 或其他适当的数字)

我希望这能解决问题;如果您需要更多帮助,请在下面发表评论!