Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание ролевой компьютерной игры 39) Глобальная карта


Разработка ролевой игры

39) Глобальная карта

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

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

Назовем новую процедуру ShowGlobalMap, разместим ее в модуле LowLevel, а вызывать будем из главного модуля Main по нажатии клавиши m:

  k := ReadKey;
  case k of

     ...

     ' m ' : ShowGlobalMap;

Внутри этой процедуры подготовим локальный массив gm размером 32 (в ширину) на 16 (по вертикали) элементов:

  { ----------------- }
  procedure ShowGlobalMap;
  var gm: array[1..32, 1..16] of Integer;
  begin

  end;

Мы будем просматривать сразу две строки карты и отмечать присутствие на них нужных предметов. Пусть герой будет отмечаться значением 1, лестница - 21 вверх и 22 вниз, магазин оружия - 3, магазин магических предметов и еды - 4, монстры - 5, и источники здоровья - 6. Вероятно, имеет смысл отличать "текущего" героя от остальных "партийцев", поэтому, оставив значение1 за героем, который находится в данный момент в режиме управления, отведем значение 7 для других членов игровой партии.
Все остальное будет приниматься равным нулю, если тайл видим, или -1, если не видим.

  { ----------------- }
  procedure ShowGlobalMap;
  var gm: array[1..32, 1..16] of Integer;
      x,y: Integer;
      s: string;
  begin
  for x := 1 to 32 do
  for y := 1 to 32 do
   begin
   gm[x,(y+1) div 2] := 0;
   if GameMap[CurMap].Cells[ LOCAL_MAP_WIDTH+x,
  LOCAL_MAP_HEIGHT+y].IsVisible then
      begin

      case
  GameMap[CurMap].Cells[LOCAL_MAP_WIDTH+x,LOCAL_MAP_HEIGHT+
  y].Tile of

       tileStairsUp:
          gm[x,(y+1) div 2] := 21;
       tileStairsDown:
          gm[x,(y+1) div 2] := 22;

       tileWeaponShop:
          gm[x,(y+1) div 2] := 3;

       tileMagicShop:
          gm[x,(y+1) div 2] := 4;

       tileLive:
          gm[x,(y+1) div 2] := 6;

      end;

      if IsMonsterOnTile( LOCAL_MAP_WIDTH+x, LOCAL_MAP_HEIGHT+y) >
  0 then
         gm[x,(y+1) div 2] := 5;
      end

   else gm[x,(y+1) div 2] := -1;
   end;

  for x := 1 to MaxHeroes do
    if Heroes[x].HP > 0 then
      if x = CurHero
         then gm[Heroes[x].x-LOCAL_MAP_WIDTH,
                 (Heroes[x].y-LOCAL_MAP_HEIGHT+1) div 2] := 1
         else gm[Heroes[x].x-LOCAL_MAP_WIDTH,
                 (Heroes[x].y-LOCAL_MAP_HEIGHT+1) div 2] := 7;

  ClrScr;
  for y := 1 to 16 do
  for x := 1 to 32 do
    begin
    GoToXY(x,y);
    case gm[x,y] of
      1: begin
         TextColor(White);
         Write( ' X ' );
         end;
     21: begin
         TextColor(LightGray);
         Write( ' < ' );
         end;
     22: begin
         TextColor(LightGray);
         Write( ' > ' );
         end;
      3: begin
         TextColor(LightGreen);
         Write( ' $ ' );
         end;
      4: begin
         TextColor(LightCyan);
         Write( ' $ ' );
         end;
      5: begin
         TextColor(LightRed);
         TextColor(LightRed);
         Write( ' # ' );
         end;
      6: begin
         TextColor(LightCyan);
         Write( ' * ' );
         end;
      7: begin
         TextColor(Yellow);
         Write( ' X ' );
         end;
    else begin
         if gm[x,y] = 0
            then TextColor(LightGray)
            else TextColor(DarkGray);
         Write( ' . ' );
         end;

    end;
    end;

  ReadLn;

  end;

Сначала, перебирая все клетки пещеры, выявляются тайлы лестниц, магазинов и источников, а также проверяется, имеется ли на ней монстр. Далее на глобальную карту явно заносятся координаты героев, после чего на основании значений массива gm рисуется схема карты разноцветными символами.

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

Далее - программируем переходы между уровнями пещеры.


Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas):

тут, 886.zip, 16537 байта


В продаже моя книга "Delphi 2006: новые возможности"
Сейчас она на 7 месте по продажам (из 557 наименований в разделе " Информационные технологии, вычислительная техника") за последнюю неделю.
Прямые ссылки на книгу в интернет-магазинах:
http://www.piter.com/book/978546901438/ (сайт издательства "Питер")
http://www.ozon.ru/context/detail/id/2672001/
http://labirint-shop.ru/index.html?ID_Book=106536
http://colibri.ru/binfo.asp?cod=197541&prt=679

В книге рассмотрены новые возможности системы программирования Delphi 2006 и представлены нововведения в языке, оболочке, редакторе, компиляторе и отладчике. Объяснены новые технологии работы с базами данных и создания приложений для Интернета. Особое внимание уделено средствам и технологиям повышения эффективности работы программистов: рефакторингу, шаблонам проектирования, унифицированному языку UML и технологии моделирования ECO.
Издание рассчитано на программистов всех уровней подготовки. Начинающие разработчики познакомятся с удобными средствами быстрого создания программ, программисты средней квалификации изучат современные подходы к разработке сложных систем и новые средства визуального проектирования, а профессионалам будут интересны новые возможности технологий моделирования ECO III, UML 2.0 и паттернов проектирования.


(c) 2004-2006 Сергей Бобровский bobrovsky at russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное