Я недавно использовал Visual Basic .Net для написания системы частиц, которая испускает частицы со случайными скоростями в направлениях x и y и зависит от силы тяжести.Я переключился на C # .Net и использовал XNA Game Studio, которая делает обработку графики намного более удобной, чем GDI +.
Проблема, с которой я столкнулся в C #, состоит в том, что случайные числа не являются «достаточно случайными».В моей системе частиц 2500 частиц, но вы можете четко видеть, что частицы распределены по сетке примерно на расстоянии 100 пикселей, и у меня не было этой проблемы с функцией Rnd () в Visual Basic.
Что такое VisualBasic делает то, чего нет в 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-коде нет места, где я вызываю функцию рандомизации, я заметил, что мои частицы, как и я, ведут себя аналогично образцу.Извините за странную арифметику, это всего лишь эксперименты.