logo.aleks Versus Поиск по сайту:
  Главная | Регистрация | Вход   Приветствую Вас Гость | RSS
Майнпаги
тыц
Стихи.РУ
Проза.РУ
Aleks Versus на LI
Я на Самиздате
читательский дневник
На Книготопии

==Карта для рогалика в QSP==



Здесь будут рассмотрены основы создания карты рогалика в QSP, т.е. применительно к плееру, хотя основные принципы создания двумерных карт, мне кажется, во всех рогаликах одинаковые.

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

ППППППППППППППППППППППППП
П.......................П
П.......................П
П.......................П
П.......................П
П...........I...........П
П.......................П
П.......................П
П.......................П
П.......................П
ППППППППППППППППППППППППП



Это карта комнаты шириной 25, длиной 11 клеток. В центре комнаты находится герой. Он обозначен буквой I. Координаты героя сейчас 0;0. Это значит, что координаты клетки, в которой он находится тоже 0;0, и это значит так же, что до того как герой попал в эту клетку, она была пустой.
Пусть для хранения координат героя используются переменные X (горизонтальная ось) и Y (вертикальная ось). Сейчас герой стоит в позиции 0;0, а значит:

X=0
Y=0



Мы наглядно написали это не просто так, но чтобы перейти к следующему этапу: помещаем карту в массив. Координаты клетки будут служить её адресом в массиве. Для наглядности и удобства нам нужен двумерный массив. В QSP не бывает двумерных массивов, однако есть обходной путь, чтобы сделать такой массив, используя строковые индексы. Вот как выглядит запись клетки с координатами 0;0 в таком массиве:

$map_cell['0;0']='.'

Как мы уже говорили, эта клетка до появления в ней героя была пустой, поэтому в ячейку массива и вносится значение "." (точка).
Клетка слева от героя расположена по адресу -1;0 клетка справа 1;0, клетка сверху 0;1, снизу 0;-1. Все эти клетки можно и нужно создать в массиве:

$map_cell['-1;0']='.'
$map_cell['1;0']='.'
$map_cell['0;1']='.'
$map_cell['0;-1']='.'



В идеале, необходимо вручную забить все 25х11 клеток, но комнату, подобную нашей можно и сгенерировать:

j=5 & ! координаты по вертикальной оси левого верхнего угла
:for_y
if j>-6:
i=-12 & ! координаты по горизонтальной оси верхнего левого угла
:for_x
if i<13:
if j=5 or j=-5 or i=-12 or i=12:
$map_cell['<<i>>;<<j>>']='П'
else
$map_cell['<<i>>;<<j>>']='.'
end
i+=1
jump 'for_x'
end
j-=1
jump 'for_y'
end


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

Мы же теперь переходим к выводу карты на экран.

Для вывода карты на экран необходимо создать отдельную локацию и назвать её например "вывод карты". Эта локация должна очищать окно основного описания и отрисовывать на нём карту в соответствии с тем, какое сейчас положение на карте занимает герой, какую часть карты просматривает игрок и пр. Мы сделаем простой вывод карты в указанных пределах координат (x = -12;12, y = 5;-5). Для этого нам потребуется приблизительно такой же алгоритм, как и алгоритм генерации комнаты:

j=5 & ! координаты по вертикальной оси левого верхнего угла
:for_y
if j>-6:
i=-12 & ! координаты по горизонтальной оси верхнего левого угла
:for_x
if i<13:
if j=Y and i=X:
! Если координаты положения героя и координаты клетки совпадают, выводим символ героя
$map_print+='I'
else
$map_print+=$map_cell['<<i>>;<<j>>']
end
i+=1
jump 'for_x'
end
! отрисовали строку, добавляем переход на следующую строку
$map_print+='
'
j-=1
jump 'for_y'
end
*clr
*p $map_print

killvar '$map_print'

Теперь всякий раз при изменении положения героя, т.е. значений переменных X и Y нужно просто обращаться к этой локации.

 
Copyright MyCorp © 2018
Конструктор сайтов - uCoz
aleksversus@mail.ru
lex666endless@rambler.ru
437337904
Наверх