随机速度的二维粒子系统

本文关键字:二维 粒子系统 速度 随机 | 更新日期: 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