4

我正在创建一个游戏,它有大约 3000 个粒子落入一堆。每个粒子都是一个像素,我只使用一个 boolean[][] 来设置和检查哪个像素是清晰的。现在我正在使用这段代码

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);
}

问题是这段代码给了我一个非常严格的金字塔形状,看起来不太自然。如果你把它倒进一堆,我希望它看起来像盐。我的问题是,有人知道模拟粒子堆的算法或更好的方法吗?任何帮助将不胜感激。

解决方案:我在这里找到了一篇不错的文章

4

2 回答 2

3

你承担了一项艰巨的任务:) 这不仅仅是如何计算和绘制粒子,而是描述它们应该如何移动的物理学。

首先看一下这个:

http://www.daniweb.com/software-development/java/threads/426676/sand-game-problem-with-graphics

谷歌搜索时,尝试“粒子发生器”或“粒子发射器”。

另请参阅此问题:

那些 java 沙子游戏是如何跟踪这么多粒子的?

您可能缺少的主要内容是将随机性(一些熵)添加到您的系统中。

于 2012-10-14T17:46:55.437 回答
2

因此,您的函数会查看已沉降到底部的粒子,并询问它们是否可以从侧面滑下,然后如果可以,则影响该运动。

你有这个循环吗?如果是这样,您可能正在考虑“自下而上”的粒子,而滑动运动可能发生在堆上的任何点。您可以在执行循环之前尝试改组粒子列表,或者反复从列表中选择随机元素,直到获得低沉降率。

在二维数组的情况下,您可以尝试从不同方向循环或寻找其他混合方式 - 再次随机选择像素可能不是一个坏选择。我想到了模拟退火。

或者,您可以在滑动条件中添加随机检查。粒子在它们的初始位置应该是半稳定的,所以它们可能只有 50% 的机会从侧面滑落。

希望这可以帮助!

于 2012-10-14T17:58:05.160 回答