2010-02-26 2 views
3

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

Cave

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

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

ответ

3

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

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

+0

Спасибо за ответ. Я нашел несколько библиотек, которые должны выполнять эту работу: GPC (http://www.cs.man.ac.uk/~toby/alan/software/) и Triangle (http://www.cs.cmu.edu/~ трясутся/triangle.html). Я сделаю пост, если мне удастся. :) – liviucmg

+1

На всякий случай, если вы хотите знать, мне удалось использовать GPC и poly2tri (http://code.google.com/p/poly2tri/) для создания многоугольника, а затем его триангуляцию. Вот фото: http://imgur.com/154kd.png. Ура! – liviucmg

+0

Прохладный, здорово слышать, что вы достигли прогресса. – Kylotan

1

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

Например,

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

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

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

1

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

Смежные вопросы