Для начала определим в модуле 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;
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. Что нас может интересовать? Прежде всего уровень здоровья и опыта, а также текущие координаты на карте. На
первых порах такой информации будет вполне достаточно.
Здесь мы приблизились к задаче выделения строковых констант, которые можно быстро заменять, переводя на другие языки. Соообщения типа STR_HERO_HP могут содержать строки типа "Здоровье:", однако они должны быть разделены по разным национальным языкам, а также кодировкам. Все строковые константы мы будем хранить в модуле Texts, который также должен обязательно включать настройки условной компиляции {$I DEFINES.INC}.