随机速度的二维粒子系统
本文关键字:二维 粒子系统 速度 随机 | 更新日期: 2023-09-27 18:06:00
我最近使用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代码中没有我调用随机化函数的地方,我注意到我的粒子具有相同的模式样行为,如果我这样做。请原谅这些奇怪的运算,这都是实验。
好吧,你要做的是修复它Charl,是创建一个单一的随机对象(你是)没有种子,并使用它一遍又一遍。比如:
const double max = 1000.0;
Random rand = new Random(); // Like mentioned, don't provide a seed, .NET already picks a great seed for you
for(int iParticle = 0; iParticle < 2500; iParticle++)
{
double x = rand.NextDouble() * max; // Will generate a random number between 0 and max
double y = rand.NextDouble() * max;
}
要获取上下边界之间的随机浮点值(float或double),可以使用如下命令:
double x = (rand.NextDouble() * (max - min)) + min;
编辑:并确保使用double或float。整型只能是整数,双精度和浮点数可以存储实数,这可能就是VB使用的。
如果你发布了一些代码,我们可能已经能够指出你在哪里为每个调用创建了一个new Random()
对象。
例如:循环中的随机数
查看代码后,
你知道(rnd.Next(2000)-1000)/100
是一个整数表达式吗?结果将转换为float
,但始终以##.0
结束。
在VB中I / J
产生一个double类型。
Random类确保伪随机性,如果这是您正在使用的。看一下RNGCryptoServiceProvider