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

Создание ролевой компьютерной игры 9) Инфа о герое


Информационный Канал Subscribe.Ru

Школа программирования

Программирование с нуля - это совсем просто!

9) Инфа о герое

Для начала определим в модуле Map константу, определяющую допустимую близость героя к краям видимого окна:

const SCROLL_DELTA = 3;

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

Вот так запишется модифицировання процедура перемещения героя:

  procedure MoveHero( dx,dy: Integer );
  begin
  if not FreeTile( GameMap[CurMap].Cells[
  Heroes[CurHero].x+dx,Heroes[CurHero].y+dy].Tile ) then
     Exit;

  inc(Heroes[CurHero].x,dx);
  inc(Heroes[CurHero].y,dy);
  SetHeroVisible(CurHero);

  if (abs(Heroes[CurHero].x - GameMap[CurMap].LocalMapLeft) <
  SCROLL_DELTA) or
     (abs(Heroes[CurHero].y - GameMap[CurMap].LocalMapTop) <
  SCROLL_DELTA) then
     ScrollMap;
  end;

Чтобы программаработала, нам осталось реализовать процедуру прокрутки видимой части карты ScrollMap (разместим ее в модуле Map):

  procedure ScrollMap;
  begin
  GameMap[CurMap].LocalMapLeft := Heroes[CurHero].x -
  LOCAL_MAP_WIDTH div 2;
  GameMap[CurMap].LocalMapTop := Heroes[CurHero].y -
  LOCAL_MAP_HEIGHT div 2;
  end;

Здесь происходит изменение значения переменных LocalMapLeft/LocalMapTop, определяющих текущие координаты видимого окна.

Теперь программа ожила. Можно перемещать героя по доступному миру и бродить в запутанных лабиринтах между деревьями и камнями. Правда, никакие сведения о самом герое нам пока недоступны - точнее, они невидимы для пользователя. Вывод важнейшей информции о герое - обязаельное требование хороших игр. Поэтому введем в модуле LowLevel процедуру ShowHeroInfo, которую будем вызывать в конце процедуры ShowGame. Что нас может интересовать? Прежде всего уровень здоровья и опыта, а также текущие координаты на карте. На первых порах такой информации будет вполне достаточно.

Запрограммируем ShowHeroInfo следующим способом:

  procedure ShowHeroInfo(HeroNum: Integer);
  begin
  TextColor( LightGray );
  GoToXY(40, 2);
  Write(STR_HERO_HP,Heroes[HeroNum].HP, ' / ' ,Heroes[HeroNum].MaxHP);
  GoToXY(40, 3);
  Write(STR_HERO_XY,Heroes[HeroNum].x, ' , ' ,Heroes[HeroNum].y);
  end;

Здесь мы приблизились к задаче выделения строковых констант, которые можно быстро заменять, переводя на другие языки. Соообщения типа STR_HERO_HP могут содержать строки типа "Здоровье:", однако они должны быть разделены по разным национальным языкам, а также кодировкам. Все строковые константы мы будем хранить в модуле Texts, который также должен обязательно включать настройки условной компиляции {$I DEFINES.INC}.

  {$I DEFINES.INC}

  unit Texts;

  interface

  {$IFDEF RUSDOS_GAME}

  const STR_HERO_HP = ' Здор/Макс.Здор: ' ;
          STR_HERO_XY = ' Координаты: ' ;

  {$ENDIF}

  implementation

  end.

Сами строковые константы естественно должны быть выполнены в ДОС-овской кодировке. Теперь экран игры станет более дружелюбным.

Далее - Программируем монстров.

Исходный код текущей версии:

http://russianenterprisesolutions.com/sbo/download/1995.zip 3985 байтов


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

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

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


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull.game
Отписаться
Вспомнить пароль

В избранное