Реализация уничтожения ландшафта, как Scorched Earth Game на iphone или Java - PullRequest
3 голосов
/ 09 мая 2009

Я ищу пример того, как реализовать 2D разрушение ландшафта, которое вы видите в играх, таких как выжженная земля или на iphone iShoot .

Я ищу реализацию игры, которая должна создавать разрушаемую местность и рендерить ее, используя OpenGL (LWJGL в Java) и используя OpenGL ES на iPhone.

alt text
(источник: vintagecomputing.com )

Ответы [ 2 ]

7 голосов
/ 09 мая 2009

Насколько я помню, в Worms они использовали два изображения; «Симпатичная» местность с цветом и маска местности чисто черного и белого цвета. Обнаружение попадания всегда выполняется по маске.

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

Простой пример этого может быть сделан с массивом, где 1 представляет сплошную местность, а 0 представляет пустое пространство. В этом случае я установил левую сторону массива как уровень земли, чтобы элемент [0] был на земле:

[1,1,1,1,1,1,0,0,0,0]

Предположим, что местность поражена сбоку и сделано отверстие:

[1,1,0,0,1,1,0,0,0,0]

Теперь у вас остался плавающий участок местности над другим участком. Чтобы сделать плавающий ландшафт коллапсом, переберите массив, следя за первой позицией, в которой вы найдете 0 (пустое место). Затем, продолжая итерацию, обнаружив 1 (местность), просто сдвиньте 1 туда, где был 0. Повторите процесс, повторяя эту прежнюю позицию 0 + 1.

[1,1,1,0,0,1,0,0,0,0]

[1,1,1,1,0,0,0,0,0,0]

Это основной подход, а не самый эффективный. Например, было бы намного быстрее переместить все индексы местности выше разрыва вниз.

EDIT:

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

2 голосов
/ 03 сентября 2009

Ответ Совиута великолепен! Я использую аналогичный алгоритм в функции разрушительной местности в Scorched Earth для iPhone . Я решил остаться верным оригиналу и мгновенно установить местность, но, хотя я думал об анимированном пересечении местности, я столкнулся с некоторыми проблемами с производительностью. Вы также можете увидеть это в iShoot, так как iShoot использует медленно растущий анимированный ландшафт. Существуют ситуации, когда земля все еще оседает с хода одного игрока, когда следующий игрок стреляет из оружия. Это может помешать выстрелу, и помехи могут измениться в зависимости от того, как быстро следующий игрок стреляет. Поскольку Scorched Earth - пошаговая игра, неплохо было бы заставить игру ждать, пока земля не уладится, до перехода к следующему игроку.

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

1 3 5 7 9
0 2 4 6 8

Точки с четными числами представляют собой линию пикселей в нижней части экрана. Точки с нечетными номерами представляют вертикальное положение пикселя местности. Эта информация копируется в массив точек, который отображается с помощью glVertexPointer, glColorPointer и glDrawArrays в виде треугольной полосы, например:

// prepare vertex buffer
for (int i=0,j,k=0,K=480;k<=K;k++) {
    j = (k-(int)offsetX+480)%480;
    vGroundLevel[i++] = k;
    vGroundLevel[i++] = offsetY>0 ? 0 : offsetY;
    vGroundLevel[i++] = k;
    vGroundLevel[i++] = [env groundLevelAtIndex:j]+offsetY;
}
....
// render vertex buffer
glVertexPointer(2, GL_FLOAT, 0, vGroundLevel);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cGround);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 2*480);

Параметры offsetX и offsetY позволяют изменять положение местности относительно экрана, позволяя игроку интерактивно перемещаться по окружающей среде, сохраняя игровую среду в виде непрерывного окружения.

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