Как создать частицы, реагирующие на игрока и врагов?

В настоящее время я создаю игру с собственным движком игры, который я написал на C ++, и я использую самый последний SDK DirectX.

Игра - это стрелок сверху вниз (с довольно интересным поворотом), и я ищу, чтобы у вас был какой-то эффект туманности, который игрок пролетит. Я действительно хочу попытаться прибить это приятное осязательное ощущение сотен частиц, движущихся с пути корабля игрока, когда он летит в них. Скорее всего, как частицы будут двигаться по пути игрока в Geomtry Wars на XBLA.

Я - опытный программист, когда дело доходит до C ++. Однако я не знаю, как начать реализацию этого эффекта. Есть ли у кого-нибудь интересные идеи или варианты дизайна, которые я, возможно, захочу изучить? Не стесняйтесь отвечать на любую глубину, которую вы себе представляете.

38 голосов | спросил Matt McDonald 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 01 Sep 2011 12:41:38 +0400 2011, 12:41:38

1 ответ


65

Это классная идея. Вам понадобится какой-то диффузионный градиент вокруг вашего корабля. Есть три физических модели, о которых я могу думать:

  1. Вы хотите, чтобы это выглядело почти так, как будто это жидкая среда, где перебалансировка градиента давления, т. е. после того, как вы пропустили какие-то частицы, они возвращаются в ваш след (например, вода за лодкой). В этом случае позиции частиц абсолютны, и только их отношение к игроку временно изменяет свою позицию рендеринга . Это немного похоже на то, когда вы пропускаете толстый лупу над вещами, и дифракция, кажется, заставляет их двигаться, но только пока вы не сдвинете стекло. В этом случае ваш корабль - это стекло.

  2. Если вы хотите, чтобы они отошли от корабля и продолжали двигаться, как только они переехали. Это похоже на стандартную физику в обычно пустом пространстве, где нет (или очень малых) градиентов давления.

  3. Вы хотите быстро перемещать частицы с корабля по мере приближения, как в пунктах (1) и (2), но как только корабль исчезнет, ​​частицы будут медленно перебалансироваться, чтобы быть равноудаленными на вашем пути .

Общие для всех трех решений : у вас должно быть поле распространения, которое перемещается вместе с вашим кораблем. В этом примере мы сделаем его круговым. Затем вы обнаруживаете вектор, называете его v1, между кораблем и каждой частицей внутри этого региона. Отодвиньте свою частицу вдоль этого вектора. Как сильно вы его оттолкнете, это будет зависеть от его расстояния от корабля: используйте 1 - v1.magnitude. Эта формула даст вам линейную силу, однако вы можете изменить ее, чтобы использовать что-то еще, например круговую кривую прочности, которая уменьшает силу по краям. Это дало бы ему больше взгляда, как если бы вокруг корабля был сферический, а не круговой градиент давления.

Для решения 1 : все, что вы сейчас делаете, - это изменить положение render этой частицы (то есть положение спрайта) на каждом render обновить, этим вектором. Поскольку вы делаете это таким образом, это чисто эффект рендеринга и не влияет на фактическое мировое положение частицы. Таким образом, вы добавляете мировое положение в смещение рендеринга (v1), и теперь у вас есть хорошо перемещенные частицы, когда вы двигаетесь мимо или рядом с ними, и плавно возвращаете частицы, когда вы проходите мимо (позади вас).

Для решения 2 : вместо того, чтобы просто применять v1 к позиции представления, примените его к каждому обновлению logic , к положению частицы. Итак, p1.position += v1. Таким образом, вы применяете ускоряющую силу к частице, которая переводится в скорость. Вероятно, вы захотите увлажнить скорость каждой частицы, чтобы они постепенно замедлялись и останавливались после того, как вы прошли. Вы можете увидеть, как это решение приведет к сгруппированным частицам в вашей туманности, потому что они никогда не будут перерисовываться. Не очень реалистично, я уверен, поскольку туманности имеют градиенты давления внутри них, независимо от того, насколько слаб в действительности.

Для решения 3 : То же, что и (2), но в этом случае вам придется повторно использовать ваши частицы. Сделать это легко - это немного грубый подход, но поскольку это только частицы и, таким образом, глазные конфеты, вам, вероятно, не нужно покрывать огромную интересующую область (возможно, только радиус игрокаPosition + maxPlayerSpeedPerTick или что-то еще прямоугольная область ограничивает это, для логических целей). Каждая частица будет применять силу друг к другу частицы в пределах интересующей области. Они будут применять силы, основанные, опять же, на своих расстояниях друг от друга. Рассчитайте все силы между частицами в одной развертке по интересующей области, а затем примените все силы за одну развертку. Наконец, убедитесь, что вы выполняете эту обработку только между частицами на частицах с нулевой скоростью. И как только какая-либо заданная частица достигает некоторой минимальной скорости, вырезайте ее вектор скорости до нуля, так что он больше не использует процессорвремя.

Есть все виды формул диффузии и т. д., но я думаю, что в этом случае простое решение работает лучше всего.

ответил Arcane Engineer 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 01 Sep 2011 14:14:46 +0400 2011, 14:14:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132