【发布时间】:2011-08-17 20:09:13
【问题描述】:
我最近使用 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 代码中,我没有调用 randomize 函数的地方,我注意到如果我这样做,我的粒子具有相同的类似模式的行为。请原谅所有奇怪的算术,这只是实验。
【问题讨论】:
-
你能告诉我们你的代码(VB.net 和 C#)吗?
-
你能发布一个sn-p的代码吗?即,初始化新粒子并设置其速度的代码。
-
还要确保您没有为每个要创建 (link) 的随机数创建新的
Random实例。 -
((rnd.Next(2000)-1000)/100 使用 Random.Next(int maxValue) 生成介于 0 和 maxValue 之间的随机整数。我认为这可能是网格状外观的原因. 试试 Random.NextDouble()