2012-10-14 59 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