我正在制作一款拥有大约3000颗颗粒的游戏。粒子每个都是一个像素,我只是使用布尔[] []来设置和检查哪个像素是清晰的。现在我正在使用此代码
if (!isFalling(m)) {
if (isClear(getX() + 1, getY()) && isClear(getX() + 1, getY() - 1))
setX(getX() + 1);
else if (isClear(getX() - 1, getY()) && isClear(getX() - 1, getY() - 1)
setX(getX() - 1);
}
问题是这段代码给了我一个非常严格的金字塔形状,看起来不太自然。如果你把它倒进一堆,我希望它看起来像盐。我的问题是,有没有人知道算法或更好的方法来模拟粒子堆? 任何帮助将不胜感激。
解决方案: 我找到了一篇很好的文章here
答案 0 :(得分:3)
你承担了一项重大任务:)这不仅仅是如何计算和绘制粒子,而是描述它们应该如何移动的物理学。
看看这个开头:
http://www.daniweb.com/software-development/java/threads/426676/sand-game-problem-with-graphics
使用Google搜索时,请尝试“粒子生成器”或“粒子发射器”。
另见这个问题:
How do those java sand games keep track of so many particles?
您可能缺少的主要是将随机性,一些熵添加到您的系统中。
答案 1 :(得分:2)
因此,你的函数会查看已经沉到底部的粒子,并询问它们是否可以向下滑动,然后如果可以的话就会影响该运动。
你有这个循环吗?如果是这样,你可能正在考虑“自下而上”的粒子,而滑动可能发生在桩的任何一点。您可以在执行循环之前尝试改组粒子列表,或者重复从列表中选择随机元素,直到您获得较低的稳定率。
在2D阵列的情况下,您可以尝试从不同方向循环或找到其他混合方式 - 再次选择随机像素可能不是一个糟糕的选择。我想到了模拟退火。
或者,您可以在滑动条件下添加随机检查。颗粒在初始位置应该是半稳定的,所以它们可能只有50%的可能性从侧面向下滑动。
希望这有帮助!