2012-10-14 62 views
4

我正在创建一个游戏,其中有大约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); 
} 

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

解决方案: 我已经找到了一个不错的文章here

回答

3

你已经采取一项艰巨的任务:)这不只是如何计算和绘制的颗粒,这是它描述他们应该如何移动的物理过程。

看看本作首发:

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

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

也看到了这个问题:

How do those java sand games keep track of so many particles?

你可能会丢失最主要的是增加随机性,一些熵,进入你的系统。

+0

感谢您的帮助。这两种方法都与我目前正在做的非常相似,但生病尝试将一些代码纳入我的代码。生病继续看,看看我能想出什么 – Shane

2

因此,您的函数会查看已定位到底部的粒子,并询问它们是否可以向下滑动,然后在可能的情况下执行该运动。

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

对于二维数组,您可以尝试从不同方向循环或查找其他混合方式 - 再次随机选择像素可能不是一个不错的选择。想到模拟退火。

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

希望这会有所帮助!

+0

我有这个在游戏循环,所以它检查每个帧的位置,并只移动一个位置一帧。你说的是从不同的位置开始,但我设置的方式是我有一个对象与每个粒子的位置,并避免检查另一个,我使用二维数组映射位置。这极大地减少了检查。所以每个对象都会被更新,然后被映射,然后根据对象中的pos坐标进行渲染。 – Shane

+0

检查每一帧的所有位置?我所指的循环是检查粒子位置的循环。 – Richard

+0

不,它更新一半的帧,然后更新下一个。在Android上,我可以以大于40 fps的速度渲染大约4000帧。不错。可以说,它可以进一步分裂以提高性能,但可以稍后处理。截至目前,我只是试图确定机制。所以你说我应该每次都以不同的顺序遍历每个粒子?关于从底部检查的 – Shane