【问题标题】:Pygame - How to destroy an asteroid and create smaller ones in its placePygame - 如何摧毁小行星并在其位置创建更小的小行星
【发布时间】:2017-01-08 02:53:40
【问题描述】:

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

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

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

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

游戏源码可以在这里找到:https://github.com/JuanBonnett/pysteroids

负责处理碰撞 Bullet->Asteroid 的类是:

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

physics.py CollisionDetector 类在哪里,它会检测它们何时发生碰撞并调用其依赖项来处理碰撞

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

【问题讨论】:

  • 考虑在您的代码中添加一些日志记录,以记录每颗小行星何时以及为何消失。
  • @Amber 你是什么意思?有什么我该怎么做的例子吗?
  • 使用print()(或@Amber 所说的记录)查看变量中的值以及执行的代码部分。它有助于发现问题。

标签: python pygame


【解决方案1】:

当一颗小行星爆炸时,您将传递给它一个 pos 向量,说明从哪里开始。

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

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

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

基本上问题出在AsteroidGenerator.generate 中的pos = _pos 行。它应该复制矢量,而不是直接将引用分配给新的小行星。

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

【讨论】:

  • 嗯,100% 没看懂。您设法更改代码中的某些内容以使其正常工作?根据您所说的进行了一些更改,但没有看到进展。这很奇怪。
  • 我通过你的 github 仓库发送了一个 Pull Request
  • 这就是我想的。谢谢!不管怎样……做出了改变,在你射击一颗小行星后,四个新的小行星出现了,但由于某种奇怪的原因它们在几秒钟内消失了,而且表现得不像普通的小行星。测试了吗?这真的很疯狂
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 2015-07-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多