C# XNA-模拟雪

C# XNA-模拟雪,c#,xna,game-physics,C#,Xna,Game Physics,这更像是一个问题,询问我应该使用哪种模式/方法的建议。我对这个问题做了一些调查,结果很差 本质上,我有一个游戏的想法,其中关键的游戏机制是基于降雪-或者,在这个想法游戏中-下落的粒子 雪/颗粒需要从屏幕上落下,但会堆积成堆。问题是,我需要雪“滴”到桩的侧面,当它们成一定角度时,并继续累积。有可能在成堆的雪下面有洞,雪必须掉出来——就像沙漏中的沙子一样 我试过这是Box2d——很明显,对于10000个持续时间很长的微小粒子来说,Box2d不是正确的选择。盒子2D很快就被撞死了 我试着在屏幕上绘制1

这更像是一个问题,询问我应该使用哪种模式/方法的建议。我对这个问题做了一些调查,结果很差

本质上,我有一个游戏的想法,其中关键的游戏机制是基于降雪-或者,在这个想法游戏中-下落的粒子

雪/颗粒需要从屏幕上落下,但会堆积成堆。问题是,我需要雪“滴”到桩的侧面,当它们成一定角度时,并继续累积。有可能在成堆的雪下面有洞,雪必须掉出来——就像沙漏中的沙子一样

我试过这是Box2d——很明显,对于10000个持续时间很长的微小粒子来说,Box2d不是正确的选择。盒子2D很快就被撞死了

我试着在屏幕上绘制1px位图,但每次更新都要处理10000次冲突,结果证明效果也很差

任何想法都将不胜感激


干杯

好吧,就像你发现的那样,现有的库不会对你有所帮助,除非它特别适合你的场景。不幸的是,XNA没有很多东西可供选择,而且现有的粒子系统库似乎都不支持粒子物理

所以你需要自己做很多工作。首先,您需要考虑所有可能进行的优化。正如一条评论所说,您不应该在每一帧的所有粒子之间运行检查。您应该使用基于点的碰撞检查,而不是物理引擎通常使用的更高级的东西。在这种情况下,应确保粒子的大小始终相同(相对于参考坐标系,也就是说,这并不意味着不能进行缩放)。当然,你需要跳过尽可能多的碰撞检查——你知道静止的粒子永远不应该被检查,就像那些所有侧面都有相邻粒子的粒子一样——这让我想到了网格。也许你可以把整个“世界”表示成一个网格,并从这个角度简化逻辑——就像Minecraft一样,你不同意吗


无论如何,我意识到我有点漫无边际,但这是一个如此开放的话题……:)

这一酷炫的特效(适用于XNA和MonoGame)


没有雪的影响,但有一些有趣的影响,你可以使用修改。

它是否可能监测哪些粒子实际上正在被物理引擎处理?如果是这样的话,有没有一种方法可以让你停止处理他们的物理过程,或者如果他们的速度小于0.01或者类似的东西,你可以严格限制处理的内容

如果您只处理需要处理的粒子,那么您可以拥有任意数量的粒子,前提是它们不是同时移动的

如果这仍然是一个问题,那么听起来流体动力学的解决方案可能更合适,因为流体动力学基本上是一大堆小的、运动的粒子

以下是一些有关二维流体动力学的有趣信息:


您的物理引擎可能已经包含了您所需的内容。

您可能会遇到3dMark的竞争对手。。。10万个持久粒子听起来像是CUDA的工作,你能澄清一下吗?是2d还是3d,雪只会从上面掉下来累积吗?如果你玩的区域有多大?我正在制作一个基于瓷砖的2d平板游戏,当我以全高清绘制20万个精灵时,在2008年的平庸桌面上,它会给我每秒60帧的画面,所以我不认为10000只雪碧值得关注。冲突逻辑可能存在缺陷,从而导致较差的结果,例如,OP可能正在所有雪花之间运行检查,而其中一些雪花距离太远,无法进行检查。您是否可以发布指向项目的链接?这听起来很有趣=)@Stuart游戏区最好是全屏的-但是游戏仍然会使用较大的“雪”来减少精灵的数量…不幸的是-雪是用户交互的-谢谢你的回答:)@DaveBish你过得怎么样?