Как я могу создать случайную симуляцию? - PullRequest
3 голосов
/ 01 февраля 2009

Я играл в в эту флэш-игру , и после того, как я преодолел начальную ('lol, fire') реакцию, я начал задаваться вопросом, как я могу воспроизвести это поведение при изменении контакта в программировании. Я думаю, это немного похоже на honeypot xkcd .

Я думал начать со сценария, в котором частицы отклоняются друг от друга и от стенок. Последовательность должна начинаться с заданного числа «мутантных» частиц, и когда эти мутанты сталкиваются с обычными частицами, они сами становятся мутантами. Я мог бы поработать над некоторыми более забавными вещами позже.

Моя проблема в том, как начать с этим. Я планирую сделать это в C # с использованием элементов Drawing в .NET (хотя я довольно новичок в C # - если есть другая часть .NET, которую я должен использовать, дайте мне знать), но если есть какие-то общие документы, я было бы интересно прочитать их (если они доступны онлайн, конечно).

Спасибо, Ross

Ответы [ 2 ]

4 голосов
/ 01 февраля 2009

Я думаю, что вы на правильном пути с тем, что вы думаете, некоторые частицы в коробке будут хорошо здесь. Я не могу представить, что вы найдете статьи по такому конкретному и простому случаю, но, возможно, по некоторым из необходимых методов, но реализация бэкэнда должна быть относительно простой по сравнению с рендерером.

Для перемещения частиц по простому методу Итерация Эйлера , где вы храните позиции и скорости. положение = положение + скорость * dt; где dt - изменение во времени с момента последнего кадра. Лучше всего сохранять фиксированное значение dt и интерполировать между точками для средства визуализации, если вы можете ... это уменьшит проблемы со стабильностью и облегчит обнаружение столкновений.

Чтобы отразить частицу от стены, проверьте, не превысят ли ее x-компоненты или y-компоненты положения, и затем переверните знак другого компонента скорости, например,

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component;

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
    velocity.x_component = -velocity.x_component;

Если у вас есть постоянная dt, это работает довольно хорошо, но если она меняется, вам нужно будет сделать что-то более сложное. найдите точку столкновения с рамкой и отразите часть вектора вне рамки на грани, с которой столкнулись.

Для столкновения частиц друг с другом, вероятно, лучше всего проверить расстояние, вызывая отражение, когда расстояние слишком мало. Т.е. если они подойдут слишком близко, они столкнутся. Отражайте компоненты скорости, как если бы частицы были сферами, поэтому нормальным для отражения является разность их положений.

Вы можете найти эту статью на gamedev тоже полезной ...

Надеюсь, это поможет.

1 голос
/ 01 февраля 2009

Почему бы не взглянуть на классическую игру Астероиды в качестве отправной точки? Вот ссылка на тот, который не использует DirectX и находится в C #

http://www.codeproject.com/KB/GDI-plus/asteroids.aspx

...