Методы создания 2D игрового мира

Я хочу создать 2D-игру на C++ с использованием движка Irrlicht. В этой игре вы будете управлять крошечным кораблем в какой-то пещере. Эта пещера будет создана автоматически (в игре будут случайные уровни) и будет выглядеть так:

Пещера

Предположим, у меня уже есть точки многоугольника внутренней части пещеры (белая часть). Как мне отобразить эту фигуру на экране и использовать ее для обнаружения столкновений? Из того, что я читал на разных сайтах, я должен использовать алгоритм триангуляции для создания сетки стен пещеры (черная часть) с использованием многоугольника внутренней части пещеры (белая часть). Затем я также могу использовать эти сетки для обнаружения столкновений. Это действительно лучший способ сделать это? Знаете ли вы, есть ли у Irrlicht встроенные функции, которые могут помочь мне в этом?

Любой совет будет оценен.


person liviucmg    schedule 26.02.2010    source источник


Ответы (3)


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

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

person Kylotan    schedule 26.02.2010
comment
Спасибо за ответ. Я нашел несколько библиотек, которые должны выполнять эту работу: GPC (cs.man. ac.uk/~toby/alan/software) и Triangle (cs .cmu.edu/~quake/triangle.html). Сделаю пост, если получится. :) - person liviucmg; 26.02.2010
comment
На всякий случай, если вы хотите знать, мне удалось использовать GPC и poly2tri (code.google.com /p/poly2tri), чтобы сгенерировать многоугольник, а затем триангулировать его. Вот картинка: imgur.com/154kd.png . Ваше здоровье! - person liviucmg; 02.03.2010
comment
Круто, приятно слышать, что ты добился прогресса. - person Kylotan; 02.03.2010

Один из вариантов — использовать карту (маску изображения) непосредственно для проверки на столкновение.

Например,

if map_points[sprite.x sprite.y] is black then
   collision detected

предполагая, что ваши объекты являются изображениями, а не настоящими полигонами.

Если вы используете настоящие многоугольники, у вас может быть "образец точек" для каждой формы объекта,
и проверка образца на наличие коллизий.

person Nick Dandoulakis    schedule 26.02.2010

Чтобы проверить, находится ли точка внутри или снаружи вашего полигона, вы можете просто подсчитать пересечения. Вы знаете, что (0,0) находится за пределами вашего полигона. Теперь проведите линию оттуда до контрольной точки (X, Y). Если эта линия пересекает нечетное количество ребер многоугольника (например, 1), она находится внутри многоугольника. Если линия пересекает четное количество ребер (например, 0 или 2), точка (X, Y) находится вне многоугольника. Полезно один раз запустить этот алгоритм на бумаге, чтобы убедиться в этом.

person MSalters    schedule 26.02.2010