粒子效果显示相同的粒子 - 不随机化,Monogame

时间:2015-09-13 05:36:41

标签: c# xna monogame particle-system

当我创建粒子效果时,它们都具有相同的模式。它们是旋转的,但它们都具有相同的图案和相同的有色颗粒。见图:

enter image description here

这是一个新的ParticleEffect的创建方式:

ParticleEffect p = new ParticleEffect(textures, Vector2.Zero, destination, speed);

texturesTexture2D列表的位置,VectorZero是起始位置,依此类推。

每当创建一个新的ParticleEffect时,它就会被添加到ParticleList列表中,该列表会循环遍历所有项目,并为内部的每个效果调用updatedraw

这是粒子随机化的地方:

private Particle GenerateNewParticle()
{
    Random random = new Random();
    Texture2D texture = textures[random.Next(textures.Count)];
    Vector2 position = EmitterLocation;
    Vector2 velocity = new Vector2(
            1f * (float)(random.NextDouble() * 2 - 1),
            1f * (float)(random.NextDouble() * 2 - 1));
    float angle = 0;
    float angularVelocity = 0.1f * (float)(random.NextDouble() * 2 - 1);
    Color color = new Color(
            (float)random.NextDouble(),
            (float)random.NextDouble(),
            (float)random.NextDouble());
    float size = (float)random.NextDouble();
    int ttl = 20 + random.Next(40);

    return new Particle(texture, position, velocity, angle, angularVelocity, color, size, ttl);
}

那里有一堆randoms,但每个效果仍然相同。 如果您想查看更多代码,请注释。

编辑: 以下是粒子的绘制方式:

public void Draw(SpriteBatch spriteBatch)
{
    Rectangle sourceRectangle = new Rectangle(0, 0, Texture.Width, Texture.Height);
    Vector2 origin = new Vector2(Texture.Width / 2, Texture.Height / 2);

    spriteBatch.Draw(Texture, Position, sourceRectangle, Color,
        Angle, origin, Size, SpriteEffects.None, 0f);
}

1 个答案:

答案 0 :(得分:2)

默认情况下,Random实例以当前时间作为种子启动,这意味着如果同时创建实例,将重新生成相同的数字序列 - 不创建新实例,重用现有实例以获得更多“随机”行为(在您的情况下,例如使用静态Random实例)。