显示相同粒子的粒子效果——非随机化,Monogame

Particle effect displaying same particles -- not randomizing, Monogame

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

这是创建新 ParticleEffect 的方式:

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

其中textures是一个Texture2D列表,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);
}

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