Урок 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].у -
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].у -
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[HercNum].HP,
' / ' ,Heroes[HeroNum].MaxHP);
GoToXY(40, 3);
Write(STR_HERO_XY,Heroes[HeroNum].x, '
, ' ,Heroes[HeroNum].y);
end;
Здесь мы
приблизились к задаче выделения строковых констант, которые можно быстро
заменять, переводя на другие языки. Соообщения типа STR_HBRO_HP могут содержать
строки типа "Здоровье:", однако они должны быть разделены по разным
национальным ее кодировкам. Все строковые константы мы будем хранить в модуле Texts,
Который также
должен обязательно включать настройки условной компиляции:
{$IF DEFINES.inc}
Unit Txts;
Interface
{$ IFDEF RUSDOS_GAME}
Const STR_HERO_HP=’ Здор / Макс.Здор’;
STR_HERO_XY=’ Координаты ’;
{$ ENDIF}
Implementation
End.
Строковые константы естественно должны быть выполнены в ДОС-овской
кодировке. Теперь экран игры станет более дружелюбным. Далее программируем
монстров.
|