我最近使用Visual Basic .Net編寫了一個粒子系統,該系統在x和y方向上發射具有隨機速度的粒子並受重力影響。我切換到C#.Net並使用了XNA Game Studio,這使得圖形處理比GDI +更加方便。具有隨機速度的二維粒子系統
我用C#的問題是隨機數不是「足夠隨機」的。我的粒子系統有2500個粒子,但您可以清楚地看到粒子以大約100像素的網格狀分佈,我沒有使用Visual Basic的Rnd()函數發生這種問題。
什麼是Visual Basic做哪些C#沒有,以及如何在C#中獲得相同的結果?
我試圖在遊戲循環的不同階段重新初始化我的隨機數,但最終我的粒子停留在一個位置或者只是在一個方向上發射恆定流。
這是我的C#代碼:在程序啓動後首先調用LoadContent。我使用毫秒作爲種子,以便每次使用不同的配置啓動。
下一次我重新種子是在渲染之前在系統上完成所有計算。我嘗試的另一種方法是在計算出每100個粒子後重新播種,但沒有區別。
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
mousePos = Content.Load<Texture2D>("Point");
spriteTex = Content.Load<Texture2D >("Point");
rnd = new Random(a.Millisecond);
for (int i = 0; i < spritePos .Length; i++)
{
newPos[i] = new Vector2(800, 450);
spritePos[i] = newPos[i] ;
Scale[i] = rnd.Next(100,500);
renderCol[i] = new Color(rnd.Next(255), rnd.Next(255), rnd.Next(255), 1);
spriteVelocity[i] = new Vector2((rnd.Next(2000)-1000)/100, -rnd.Next(500,1500)/100);
Life[i] = rnd.Next(60);
Rotate[i] = (rnd.Next(1000)-500) * 0.001f;
RotateSpeed[i] = (rnd.Next(1000)-500) * 0.0001f;
}
}
這是我的VB代碼,在這裏我用的是RND功能的唯一的地方:
For i = x To x + 1000
ptc(i) = New particle(New Vector((Rnd() * 200) - 200 * Rnd(), Rnd() * -100 - 200 * Rnd() - 200), New Vector(e.X, e.Y), 500, Color.FromArgb(Rnd() * 255, 255, 0))
x += 1
Next
在我的VB代碼沒有任何地方我所說的隨機化功能,我已經注意到,我的如果我這樣做,粒子具有相同的模式行爲。請原諒所有奇怪的算術,這都只是實驗。
你能告訴我們你的代碼(包括VB.net和C#)嗎? – dtb
你能發佈一段代碼嗎?也就是說,初始化新粒子並設置其速度的代碼。 –
另外,確保你沒有爲你想創建的每個隨機數創建一個新的隨機實例[(link)](http://stackoverflow.com/questions/767999/random-number-generator-not-working -the路-I-有計劃的-C)。 – dtb