粒子堆算法

时间:2012-10-14 17:25:21

标签: java android game-physics

我正在制作一款拥有大约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

2 个答案:

答案 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%的可能性从侧面向下滑动。

希望这有帮助!