Джон Ромеро – Икона DOOM. Жизнь от первого лица. Автобиография (страница 12)
Как мог заметить пытливый читатель, мои отношения с отчимом можно назвать сложными. Однако он оказал на мою жизнь и положительное влияние. Шунеман приютил нашу семью, заботился о нас, читал ненавистные мне лекции, которые каким-то образом осели в памяти, усвоились и стали дельным подспорьем для таланта, который он у меня замечал. Родители множества детей игнорировали их желание программировать и создавать игры или настаивали на выборе более традиционных профессий. Приобретение Apple II+ изменило мою жизнь.
Для нашей семьи покупка стала значимой – впрочем, оказалась бы таковой для любой семьи. Мой отчим взял полный набор: системник, периферию, монитор и принтер. Из бюджета ушло минимум пять тысяч долларов. Если бы кто-нибудь спросил меня парой месяцев ранее, окажется ли когда-нибудь подобный компьютер у нас дома – я бы лишь помотал головой. Такие суммы никогда не были нам по плечу. Впрочем, Джон надеялся, что я начну писать программы для бизнеса, нечто «полезное» – скажем, софт для организации телефонного справочника. Он считал, что это все приведет к тому, что я устроюсь на «настоящую» работу. Игры Шунеман все еще не рассматривал всерьез, чего нельзя было сказать про меня. Каждый день после школы я писал их одну за другой. Помню, как подумал: «Хочу заниматься этим каждый день до самой смерти». Желание выходить на улицу погулять пропало само собой.
В тот момент я еще не понимал, как именно сделать на компьютере игру, напоминавшую мои любимые забавы из аркадных автоматов с настоящей графикой. Роб Лэвлок открыл мне глаза на следующий шаг, подсказав, куда нужно копать, пока мы гоняли в
Насир не просто гениально программировал видеоигры: он, помимо всего прочего, понимал, как придумать приятный геймплей. Мне нравилось, что все сделанное им уникально. Высокоскоростные гонки с видом сверху, аркада, в которой горизонтально двигающийся космолет расстреливает пришельцев и спасает людей, симулятор бомбежки вражеских территорий с самолета – его проекты доказывали, что он бросал себе технические вызовы и постоянно менял жанры. Отталкиваясь от его работ, я научился собирать игры вокруг определенной концепции или механики, давая пользователю все, чего он хочет, но избегая при этом лишних деталей, которые ничего не добавляли геймплею. Помимо прочего, я подмечал, что некоторые проекты Насира – это результат изучения им новой программистской техники. Например, появлялись новые графические возможности, и этот технологический метод применялся Джебелли на протяжении всего игрового процесса. Изучив его проекты, я понял, что лучше всего учиться непосредственно во время разработки. Игра могла помочь овладеть новыми кодерскими нюансами. В итоге Насир в одиночку спрограммировал первую, вторую и третью части
Еще одна легенда, которая заметно повлияла на мое развитие, – Билл Бадж. Наглядный и прекрасный пример разработчика проектов для Apple II начала восьмидесятых. На его счету увлекательные ранние игры вроде трилогии
Мы с Робом смотрели на экран с
– Черт, вот такие штуки я хочу разрабатывать!
– Хочешь посмотреть ее код? Из чего она сделана?
– Да!
Роб нажал на своем Apple II+ кнопку RESET, затем напечатал сперва «CALL-151», а потом «800.9FF». Внезапно на экране появился поток чисел. Все напоминало цифровую белиберду, однако именно так я впервые познакомился с шестнадцатеричным числами и символами.
– Это машинный язык, – сказал Роб. – Вот что нужно выучить для создания видеоигр.
Я глядел на экран. Все равно что смотреть на египетские иероглифы. Никакого сходства с BASIC, который я к тому моменту уже отлично знал. В одной из книг кто-то написал: «Если ты знаком с одним языком программирования, то с остальными тоже разберешься ввиду лингвистических и логических схожестей». Однако провернуть такое с машинным языком казалось невозможным.
– Понятия не имею, что это, – ответил я. – Но если все этим занимаются, то и мне стоит браться за дело.
Роб напечатал «800L», после чего на экране появился код в формате языка ассемблера.
– Это язык ассемблера, – объяснил Лэвлок. – То, что написал программист.
Он объяснил, что программа с таким названием приняла код и пересобрала его в машинный язык.
Приближалось Рождество 1982 года, и я попросил у родителей две книги:
– Наконец-то я смогу выучить ассемблер! – раздался мой возглас.
У меня уже имелось справочное руководство для Apple II, однако я не мог понять указанную там продвинутую информацию об ассемблере, потому что важнейшие начальные шаги авторы не описывали. Я будто смотрел на двадцатый этаж, стоя у лестницы, которой не хватало ступенек с первого по девятнадцатый пролеты. Все надежды возлагались на книгу Вагнера, которая открыла бы все тайны, а книге Стэнтона предстояло обучить меня фокусам разработчиков коммерческих видеоигр.
К тому моменту мой самодельный экспресс-курс обучения программированию вышел на запредельные скорости. Я твердо настроился зазубрить про ассемблер все. Почти сразу выяснилось, что машинный язык, показанный мне Робом, делал все то же, что и BASIC, и даже больше, но куда быстрее. Цифровая белиберда оказалась шестнадцатеричным кодом, серией шестнадцати цифр или символов в двадцати четырех рядах. Код ассемблера – это обычный текст, но обязательно нужна программа, которая превратит его в машинный код.
Первым делом требовалось выучить шестнадцатеричную систему счисления, потому что именно ее Apple II использовал для языка ассемблера. Изучаемая в начальной школе десятичная система состоит из десяти цифр от нуля до девяти. Шестнадцатеричная же использует шестнадцать цифр: от нуля до девяти и от A до F. Вот наглядный пример: число 11 из десятичной системы в шестнадцатеричной отображается как буква B. А число 94 обозначается в шестнадцатеричной системе как 5E[10]. Такие переводы я научился делать на автомате, как школьник, заучивающий, что 12×12 – это 144.
На первых порах Роб стал моим лучшим соратником и учителем. Когда дома появился Apple II+, я сразу же принялся за создание своей версии
Роб объяснил, что переменные содержали в себе значения, которые могли меняться в ответ на действия геймера или на какие-либо внутриигровые события. Например, переменной «Жизнь» присваивалось значение 3. Если герой получал дополнительную жизнь, показатель увеличивался на один пункт. Переменные использовались для координат осей X и Y, количества патронов, а также всего остального, что не стоило упускать из виду. Это одна из самых базовых концепций программирования, и я ничего о ней не знал. Выражаясь совсем уж простым языком: представьте, что у вас на кухне стоит миска – это переменная. В ней может помещаться как триста горошин, так и десять. Миска не меняется, но ее содержимое переменно.
Я закончил свою версию
Благодаря Робу, рассказавшему про машинный код и переменные, а также подаренным родителями книгам я узнал, как получить доступ к внутренним механизмам Apple II+. Неделя, в которую я получил книгу про ассемблер, стерлась из памяти. Мозг постоянно обрабатывал получаемую информацию об Apple II+, о коде, на котором она работает, и о том, что я могу запустить на этом компьютере. Apple II+ и другие первые домашние ЭВМ можно было изучить «от и до». У моей первой машины имелось 64 килобайта памяти – 65 536 байт. У меня появилось четкое желание знать, за что отвечает каждый байт. Верхние 25 % памяти отводились постоянному запоминающему устройству (ПЗУ), в котором хранились программы, определяющие, как работает Apple II+. Любому, кто писал программу для этого компьютера, требовалось знать точное расположение различных функций в ROM машины. Существовали книги, в которых расписывалась «географическая адресация» ПЗУ Apple II+. Для ускорения обучения я вел заметки, выписывал адреса и пользовался плакатами, на которых указывались важнейшие места памяти, – в частности листовкой Peeks, Pokes and Pointers от компании Beagle Bros. Я твердо вознамерился запомнить про компьютер все: как работает микропроцессор 6502, как устроен экран высокого разрешения с чересстрочной разверткой. Еще хотелось заучить все возможное про ПЗУ и нулевую страницу[11].