2

我正在尝试创建这个游戏,它在启动时会在屏幕上添加 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)

还有另一种方法可以让我尝试在这里实现我的目标吗?我还想弄清楚为什么会在概念层面上发生这种情况,以加深我的理解,因此我们将不胜感激。

4

1 回答 1

1

明显的解决方案?

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

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

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

现在我们已经确定没有,开始重写你的代码。对我来说,你构建它的方式似乎有点做作——我曾经为 GameMaker 编写过这样的代码。我认为编写此代码的明显更好的方法是重写您的make_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基本上是一个布尔表达式,当 x , y 对于障碍物大小为空(即,将对象放置在那里不会导致碰撞)时计算为真x , y已经存在障碍物发生碰撞时计算为假。将is_empty替换为执行其应做的布尔表达式。

请注意,这可能会导致永远不会停止运行的循环!如果游戏画面充满障碍,解释器将继续评估while True:循环的内容,直到预期的宇宙尽头。这意味着您需要确保屏幕上永远不会有太多障碍,或者在放弃之前只需要尝试一定次数。(在后一种选择的情况下,将while True:替换为 for x in range(10000):或其他适当的数字)

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

于 2012-12-12T04:23:21.517 回答