2009-02-01 99 views
3

我一直在玩this flash game,經過最初的('lol,fire')反應之後,我開始想知道如何在編程中複製這種接觸 - 改變的行爲。我猜這有點像honeypot xkcd如何創建隨機模擬?

我正在考慮從顆粒相互偏轉和包含牆壁的情景開始。序列將從一組「突變」粒子開始,當這些突變體與常規粒子碰撞時,它們本身就會變成突變體。以後我可以在一些更有趣的事情上工作。

我的問題是如何開始使用這個。我打算在C#中使用.NET的繪圖元素(雖然我對C#相當陌生 - 如果有一個.NET的不同部分,我應該讓我知道),但是如果有任何一般的論文,有興趣閱讀它們(如果它們當然可以在線獲得)。

感謝, 羅斯

+0

我也發現了這個教程在CodeProject:http://www.codeproject.com/KB/game/particlessystems.aspx – Ross 2009-02-01 16:37:38

回答

4

我認爲你是在正確的軌道與你在想什麼的,在一個盒子一些particles會做在這裏很好。我無法想象你會找到關於這樣一個特定和簡單情況的論文,但也許對於某些所需的技術而言,但與渲染器相比,後端的實現應該相對簡單。

圍繞一個簡單的方法移動粒子是Euler iteration,您可以在其中存儲位置和速度。位置=位置+速度* dt;其中dt是自上一幀以來的時間變化。最好保持dt不變,並在渲染器的點之間進行插值(如果可以的話)...這將減少穩定性問題並使碰撞檢測更容易。

若要將某個粒子反射出牆壁,請檢查其x分量或y分量的位置是否會超出邊界,然後翻轉速度其他分量的符號,例如,

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component; 

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound) 
    velocity.x_component = -velocity.x_component; 

如果你有恆定的dt,這個效果很好,但如果它變化,你需要做一些更復雜的事情。找到與框中的碰撞點和reflect與碰撞的臉部框外的矢量部分。

對於碰撞粒子彼此距離檢查可能是最好的,一旦距離太小,觸發反射。即如果他們太靠近,他們會碰撞。如同粒子是球體那樣反映速度分量,所以反射的法線是它們位置的差異。

您可能會發現在gamedev this article有用的太...

希望這有助於。