Для начала определим в модуле 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}.
Чувствую, что надо заводить FAQ :) Письма от вас с вопросами по поводу обучения программированию проходят постоянно.
Напоминаю, что наша рассылка заработала год назад. С тех пор несколько сотен человек мне удалось обучить программированию лично - в переписке, ну и какое-то число обучилось, видимо, в стелз-режиме (не сказав и слова благодарности :). Ну и далеко уже с тех пор мы ушли, повторять этот курс снова смысла не имеет, так как основная масса подписалась в начале курса и те, кто хотел, уже давно все, что могли, из него вынесли. А кто не хотел, то и повторять для них бесполезно.
Основная проблема, конечно, связана с тем, что по мере усложнения заданий их проверка и какие-либо рекомендации занимают даже в пересчете на одного занимающегося уже заметное время. А когда каждый день приходят десятки писем?
Вот если бы каждый занимающийся перечислял бы мне например доллар в месяц, тогда бы эта схема была бы более-менее работоспособна (сколько букв "б" в этом предложении?).
Но ведь каждый рассуждает так - "пусть платят другие, а вот именно МНЕ - дозволено исключение, мне повезет и так, на халяву, и поэтому я буду ждать и посмотрю, как другие будут платить". Ну и не работают в итоге такие схемы вообще, а ведь потенциально могли бы очень много хороших изменений в жизни произвести.
Инструкция.
КАК заниматься по нашему курсу обучению программированию с нуля без меня :)
Читаете рассылку, начиная с первого выпуска, и делаете задания. Это очевидно.
Проблемы начинаются, когда что-то не получается. Решение здесь такое:
а) Смотрите вперед несколько выпусков - обычно сложные для понимания места вызывали много писем, и потом проблема рассматривалась более подробно.
б) Если ответа в рассылке нету, обращаетесь на сайат http://srt.starinet.com/begin/ , в форум. Ждете несколько дней и получаете ответ.
в) Если опять не поняли - спрашиваете повторно, уточняете свой вопрос. Так ТРИ раза минимум.
г) Все равно не поняли :) Возможно, проблема в том, что ваш интеллект просто не тренирован :) Если в школе вы ленились логически думать, а задачи по математике списывали у соседа (хотя уровень десятого класса - это простейшие АЗЫ логического мышления), то непонимание программирования связано только с неразвитостью соответстсующих областей вашего мозга. Тренировка, тренировка и еще раз тренировка. Берете учебник по алгебре - и вперед.
д) Если предыдущие пункты не сработали, пишете мне.
Что в письме НАДО указать. Ни при каких условиях в переписку по базовому курсу я не вступаю, если это НАДО вы не выполнили.
0) В заголовке письма пишете: "Вопрос по базовому курсу программирования"
В теле письма, вежливо и уважительно :) , указываете:
а) Как вас зовут (не кличку!), сколько вам лет и чем вы занимаетесь.
б) Выпуск, в котором вы что-то не поняли, и какие выпуски вы смотрели, чтобы найти продолжение.
в) Ссылку на ваш вопрос в форуме, где вы просили помощи не менее ТРЕХ раз.
г) Содержание непонятого вами выпуска - точно указываете строчку и слово, на котором ваше понимание остановилось.
И что конкретно в этом предложении вы не понимаете.
Это важно! Если вы пропускаете какое-то слово, без понимания, его смысла, то дальше это непонимание лишь накопится.
Если вы выполняете эти действия, то я ГАРАНТИРУЮ, что вы обучитесь программированию. То есть если вы хотите учиться, длительно и напряженно :) , на протяжении многих месяцев, каждый день по нескольку часов - то и учитесь на доброе здоровье. Но если говорить человеку - возьми две спички и сложи с тремя, и получишь пять - а он отвечает "пытаюсь, не могу" - тут я бессилен :)
Остается тогда, как единственный выход - развитие ума с, фактически, нуля :) - учебник по алгебре - а еще лучше - Сканави :-)