OpenGL 2D игра вопрос - PullRequest
       6

OpenGL 2D игра вопрос

4 голосов
/ 14 сентября 2010

Я хочу сделать игру с Worms-подобным разрушаемым ландшафтом в 2D, используя OpenGL.

  • Каков наилучший подход для этого?
    • Рисовать пиксель за пиксель?(Нехорошо?)
    • Имейте мир как текстуру и управляйте им (это возможно?)

Заранее спасибо

Ответы [ 7 ]

15 голосов
/ 14 сентября 2010

Думая о том, как выглядит местность Червей, я пришел к этой идее. Но я не уверен, как бы вы реализовали это в OpenGL. Это скорее многослойный подход к рисованию 2D. Я отправляю идею в любом случае. Я эмулировал подход с использованием Paint.NET.

Во-первых, у вас есть фоновый слой неба.

alt text

И у вас есть слой ландшафта.

alt text

Слой местности маскируется, поэтому верхняя часть не рисуется. Нарисуйте слой ландшафта поверх слоя неба, чтобы сформировать сцену.

alt text

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

alt text

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

alt text

2 голосов
/ 14 сентября 2010

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

0 голосов
/ 14 сентября 2010

Думаю, я бы начал с рисования переднего плана в буфере трафарета, чтобы буфер трафарета был установлен равным 1 биту везде, где есть передний план, и 0 в другом месте (где вы хотите, чтобы ваше небо отображалось).

Затем, чтобы нарисовать рамку, вы рисуете свое небо, включаете буфер трафарета и рисуете передний план. Для начального кадра (до того, как какой-либо взрыв уничтожил часть переднего плана) буфер буфера на самом деле ничего не будет делать.

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

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

0 голосов
/ 14 сентября 2010

Я представляю себе так:

  • плоскость с наложенной текстурой
  • траектория (вектор точек / отрезков), используемая для столкновений с землей.

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

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

Делим вещи, вместо того чтобы полагаться только на методы gl draw

0 голосов
/ 14 сентября 2010

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

Эта страница даст представление: http://kometbomb.net/2007/07/11/hardware-accelerated-2d-collision-detection-in-opengl/

0 голосов
/ 14 сентября 2010

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

0 голосов
/ 14 сентября 2010

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

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

 12    789
0123  6789
0123456789
0123456789

В приведенном выше значении столбец «0»: s составляет одну строку и так далее. Я не пытался проиллюстрировать случай, когда один столбец пикселей имеет более одной строки, поскольку в этом приблизительном формате это немного сложно.

Я не уверен, что это будет эффективным , но это, по крайней мере, имеет некоторый смысл, поскольку строки являются примитивом OpenGL.

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

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