Pygame - 如何破坏小行星并在其位置创建较小的小行星

时间:2017-01-08 02:53:40

标签: python pygame

我正在制作这种经典风格的小行星游戏,并且我已经击败了随之而来的所有挑战。现在有一个新的。

当一颗子弹撞击其中一颗小行星时,预期的行为就是消失,然后在它的位置出现三到四颗较小的小行星,每颗小行星都有随机的速度,所以看起来像是一种爆炸​​。但是这个奇怪的行为显示在我刚录制的视频中:

https://youtu.be/2ZJvOcB-ZKM

正如你所看到的那样它完成了它应该做的90%,小行星消失,然后我创造了四个新的和更小的小行星,但是,由于某种原因,当它们表现得像正常的小行星时,它们会消失。他们继承了一切。

可以在此处找到游戏源代码:https://github.com/JuanBonnett/pysteroids

负责处理碰撞Bullet->小行星的班级是:

asteroids.py主文件创建所有对象,船只,小行星生成器和碰撞检测器对象。

physics.py CollisionDetector类所在的位置,它会检测它们何时发生冲突并调用其依赖项来执行碰撞操作

asteroid.py有一个小行星发生器,在碰撞的位置产生较小的小行星,我称之为碎片。

1 个答案:

答案 0 :(得分:2)

当小行星爆炸时,你向它传递pos向量的起点。

您正在将相同的矢量实例应用于所有生成的小行星。

所有较小的小行星与来自同一父小行星的兄弟姐妹具有相同的self.pos值。

它看起来很奇怪,因为self.points属性正常工作并正确更新/翻译,所以你看到两个位置互相争斗并产生混乱/不可预测的行为。

问题基本上是pos = _pos中的AsteroidGenerator.generate行。它应该是制作矢量的副本,而不是直接将参考分配给新的小行星。

我发现这是通过在您的小行星渲染代码中打印print语句来打印位置:print(self.pos.x, self.pos.y)。我注意到所有的小行星都有相同的self.pos,但是被给予了所谓的随机速度向量,所以我认为这可能是一个对象引用问题,并且遵循了被分配的位置。