PHP

Создание активной карты

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

Сегодня мы сами попробуем создать активную карту, по которой можно передвигаться.

Во-первых, определимся с хранилищем, тем местом, где будет храниться координатная сетка карты с объектами, расположенными в сетке (горы, вода, земля), хранилищем должно быть легкоизменяемым, без каких либо ограничений. Выбор пал на csv файлы, так как, по сути, это и есть координатная сетка, существует встроенная функция в php (fgetcsv) для разбора таких файлов и их довольно просто изменять посредством Excel. В любой момент мы должны иметь доступ к информации о любой клетке, для хранения информации используем двухмерный массив $map[y][x], в каждой клетке храниться информация об объекте, который расположен в клетке. Используем систему кодирования: о – вода, g – земля, x – горы, естественно, ходить можно только по земле.
[PHP]//Читаем карту
$handle = fopen("map.csv", "r");while (($data = fgetcsv($handle, 1000, ";")) !== FALSE){
        $map[]=$data;}
fclose($handle);//Карта в двухмерном массиве $map

После исполнения данного кода вся карта будет находиться в массиве $map
[x] — верхний левый угол имеет координаты $map[0][0] с информацией “o”.
Далее нам необходимо записать правило, что ходить можно только по клеткам «g» — земле. Для этого создаем переменную (ассоциативный массив):
[PHP]$infodot["g"]["status"] = "allow"; // allow – разрешено

Обращаться за этой информацией можно вот так:
$infodot[$map[y][x]][“status”]

 Так как это тестовый проект, то информацию о переходах и координатах игрока будем хранить в сессии: $_SESSION[«y»] и $_SESSION[«x»].

Для отображения переходов будем рисовать в таблице квадрат, который будет состоять из 25 маленьких квадратов, в центре этого большого квадрата и будет находиться наш игрок. Так как игрок находится в центре, то нам необходимо будет построить квадрат с координатами -2,-2 и +2,+2, относительно координат игрока. Но при этом возникает ряд проблем: “край земли”, “центр”, “фоновые текстуры”.
Проблема “края земли” – при нахождении игрока в точке 1,1 нам будет необходимо строить квадрат, где абсолютные координаты выйдут за рамки допустимого, верхний левый угол будет: -1,-1, а координаты мира начинаются с 0,0. Клетки, которые выходят за рамки назовём “end”.
[PHP]if ($map[$y][$x] == ""){
      $map[$y][$x] = "end";}

Проблема “центр” – необходимость как-то выделить местонахождения нашего игрока на поле.
if ($y == $_SESSION["y"] AND $x == $_SESSION["x"]){
   print "<td background = mapimg/".$map[$y][$x].".png>";
   print "<img src=mapimg/point.gif>";
   print "</td>";}else{
   print "<td>";
   print "<img src=mapimg/".$map[$y][$x].".png>";
   print "</td>";}

Проблема решилась довольно легко. Также решилась проблема с “фоновыми текстурами” – о том как их выводить: в папку с картинками помещаем png файл, название которого совпадает с названием элемента в csv – для воды это файл o.png, земли — g.png.
Для возможности движения создаем get-линки:
<a href=map.php?action=up><img src=mapimg/m-n.png border=0></a><a href=map.php?action=left><img src=mapimg/m-w.png border=0></a><a href=map.php?action=right><img src=mapimg/m-e.png border=0></a><a href=map.php?action=down><img src=mapimg/m-s.png border=0></a>

Обрабатываем их с проверкой возможности перемещения в клетку, если у клетки статус "allow", то изменяем координаты игрока:
if ($_GET['action']=='down'
    AND $infodot[$map[$_SESSION["y"]+1][$_SESSION["x"]]]["status"]=='allow'){
        $_SESSION["y"]++;}if ($_GET['action']=='up' 
    AND $infodot[$map[$_SESSION["y"]-1][$_SESSION["x"]]]["status"]=='allow'){
        $_SESSION["y"]--;}if ($_GET['action']=='left' 
    AND $infodot[$map[$_SESSION["y"]][$_SESSION["x"]-1]]["status"]=='allow'){
        $_SESSION["x"]--;}if ($_GET['action']=='right'  
    AND $infodot[$map[$_SESSION["y"]][$_SESSION["x"]+1]]["status"]=='allow'){
        $_SESSION["x"]++;}

Какими особенностями обладает наша карта:
1) теоритически, она не ограничена — добавляем новые элементы в файл, и наш виртуальный мир будет автоматически расширятся.
2) не ограниченое количество элементов — помещаем в клетку файла csv новую запись, допустим "m", помещаем в папку с картинками элемент m.png (50X50) — и этот элемент будет отображаться на карте.
Добавлено: 16 Августа 2013 08:17:33 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...