Хитрые способы нарисовать звездное поле - PullRequest
14 голосов
/ 06 ноября 2010

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

Это 2D игра, поэтому действие можно прокручивать по X и Yнаправления.Кроме того, мы можем настроить масштаб, чтобы показать больше или меньше игровой площадки.Я также хотел бы, чтобы на звездном поле был искусственный параллакс, чтобы создать впечатление глубины.

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

Это оскорбляет мое чувство элегантности.Должен быть лучший способ добиться этого.

Я рассмотрел процедурное генерирование моих звезд, что позволяет мне иметь неограниченное количество: например, используя фиксированное начальное число и PRNG для определения координат.Мне нужно было бы разделить небо на плитки, создать зерно, хэшируя координаты плиток, а затем нарисовать, скажем, 100 звезд на плитку.Это позволяет мне бесконечно расширять свое звездное поле во всех направлениях, при этом все еще нужно учитывать только видимые плитки - но это не работает с фактором «глубины», так как это позволяет звездам отклоняться от своей плитки.Я мог бы просто использовать несколько слоистых непараллаксных звездных полей, используя этот алгоритм, но это выглядит как мошенничество.

И, конечно, мне нужно делать все это каждый кадр, поэтому он должен быть быстрым.

Что вы все считаете?

Ответы [ 5 ]

2 голосов
/ 06 ноября 2010

Имеют несколько слоев звезд.

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

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

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

1 голос
/ 07 ноября 2010

Что-то не так с оборачиванием звездного поля вокруг X и Y? Из-за вашей глубины расстояние обтекания должно зависеть от глубины, но вы можете сделать это. Каждая зарегистрированная звезда в точке (x, y, глубина) должна появляться во всех точках

[x + j * S * глубина, y + k * S * глубина]

для всех целых чисел j и k. S - это параметр обтекания. Если S равно 1, то обтекание происходит немедленно, и все звезды всегда где-то показываются. Если S выше, то обтекание происходит не сразу, и некоторые звезды отображаются за пределами экрана. Вы, вероятно, захотите S достаточно большой, чтобы не допустить повторения при максимальном уменьшении.

1 голос
/ 06 ноября 2010

Поскольку звезды на заднем плане движутся не так быстро, как звезды на переднем плане, вы можете сделать многослойные плитки для фона и заменить их однослойными, когда у вас есть время для этого. О, а как насчет повторения узоров в фоновых слоях? Возможно, это позволит вам предварительно сгенерировать все фоновые плитки - вы все равно сможете сместить их по высоте и наложить несколько со случайными смещениями или около того, чтобы они выглядели случайными.

0 голосов
/ 27 сентября 2012

Почему бы не объединить координаты трехмерных блоков звездного поля, чтобы сформировать начальное число случайных чисел? Используйте глобальную «настройку», если вы хотите создавать разные вселенные. Таким образом, вам не нужно отслеживать поля, которые вы не видите, потому что содержимое фиксируется по их местоположению.

0 голосов
/ 07 ноября 2010

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

Теперь вам нужна бесконечная 2D-сетка из 3D-блоков, заполненная конечным числом звездочек. Для каждого блока вы можете определить отдельное значение RANDOM_SEED, используя его сеточные координаты. Звезды в каждой коробке могут генерироваться на лету.

Не забудьте исправить перспективу при масштабировании: каждый 3D-блок имеет ближний прямоугольник (переднюю грань) и дальний прямоугольник. Вы будете видеть больше звезд в соседних прямоугольниках всякий раз, когда дальний прямоугольник или почти прямоугольник сжимается на вашем виде.

Ваши дальние прямоугольники никогда не должны быть меньше половины ширины ближних прямоугольников, иначе это может быть хлопотно: вам, возможно, придется сканировать огромные списки звезд, большинство из которых выходят за пределы. Вы можете реализовать звезды за дальними прямоугольниками с помощью дополнительных 2D-сеток 3D-коробок с другими размерами и глубинами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...