- •Міністерство освіти і науки України
- •Введение
- •1 Анализ предметной области
- •1.1 Индустрия компьютерных игр
- •1.2 Жанры компьютерных игр
- •1.3 Анализ аналогов
- •1.4 Постановка задачи
- •2 Анализ моделей
- •2.1 Выбор среды проектирования и языка разработки. Доступные языки и технологии разработки ил
- •2.1.1 Adrift (Adventure Developer & Runner — Interactive Fiction Toolkit)
- •2.1.2 Hugo
- •2.1.3. Inform
- •2.1.4. Hydra
- •2.1.5. Tads (Text Adventure Development System)
- •2.1.6. Urq(UniversalRipSoftQuest)
- •2.1.7. Qsp(QuestSoftPlayer)
- •2.1.8 Tkr2 (текстовоквестовый редактор 2)
- •2.1.9 Gti– графическо-текстовый интерпретатор
- •2.1.10 «6 Дней»
- •2.1.11 Выбор технологии разработки
- •2.2 Uml-моделирование
- •3 Разработка
- •3.1 Ознакомление с платформой разработки и реализация игры
- •3.4 Отрисовка графики
- •4 Тестирование
- •4.1 Интерфейсное тестирование
- •4.2 Функциональное тестирование
- •5 Внедрение
- •Список источников
- •Приложение а – Охрана труда а.1. Анализ условий труда на рабочем месте программиста
- •А.2 Промышленная безопасность в компьютерной лаборатории.
- •А.3 Производственная санитария и гигиена труда в компьютерной лаборатории
- •А.4 Пожарная профилактика производственного помещения
- •Приложение б – Слайды презентации
- •Приложение в – Программный код в.1 Разговор в первом квесте
- •В.2 Конец первого квеста
3 Разработка
3.1 Ознакомление с платформой разработки и реализация игры
В процессе создания первого пробного квеста происходило ознакомление с интерфейсом набора необходимых программ для разработки под платформу QSP – файла помощи .chm, проигрывателя-интерпретатора файлов, инструмента преобразования текстовых файлов кода в интерпретируемые и интерактивной среды разработки.
Рисунок 3.1 – Интерактивная среда разработки
Были написаны первые локации и реализована последовательность событий первого квеста вместе с тремя базовыми механиками взаимодействия с игрой – диалог, рисковое действие и головоломка.
На данной платформе локацией является процедура в программе, содержащая программный код. В зависимости от способа перехода в локацию, интерфейс либо очищается перед выполнением кода новой локации, включая вывод на экран, используя локацию именно как локацию, новое место; либо нет, и локация выполняется как процедура.
В первой локации происходит инициализация интерфейса и всех переменных. Важна невозможность вернуться в эту локацию при нормальном ходе игры, иначе все инициализированные переменные будут заново инициализированы нулевым значением, заданным в этой локации.
Платформа QSP русскоязычна, и хотя основные операторы языка все же на английском, допустимы названия переменных, локаций и предметов на русском. Это необходимая функциональность, так как название предмета используется и как уникальный идентификатор для его вызова, так и выводится на экран.
#Лес
SHOWINPUT 0
$FNAME = 'Arial'
USEHTML = 1
Открыто = 0
Ключ_взят = 0
Упала = 0
Разговор = 0
Тропинка_видна = 0
Можно_в_город = 0
Вывод на экран – самое элементарное действие в этом языке программирования, и производится просто записью строки с абзаца. Строка окружается одинарными либо двойными кавычками. Возможно использование тегов HTML для оформления вывода и использования картинок.
'<center><img src="img/Wood.jpg" width="100%"/></center>'
' '
'В густых кронах деревьев шелестит листва, откуда-то издалека доносится перекличка птиц. В кустах время от времени слышится шорох какого-то пробегающего мелкого зверька.'
'Теплый июньский день подходит к концу. Тени удлиняются, и между деревьев вьется прохладный ветерок. Луна устала.'
'Между кустами бежит едва заметная тропинка. Луна не может сказать, протоптали ли ее звериные лапы или человеческие ноги, но надеется, что скоро выйдет к жилью.'
Ненамного сложнее вывод действий меню для пользователя. Кроме оператора, обозначающего вывод строки как действия в области меню, необходимо обозначить действия при нажатии этой кнопки. Для этого есть два формата: однострочный, включающий всего одно действие, как правило, являющееся переходом между локациями или вызовом процедуры, и многострочный, позволяющий указать любое количество операторов для выполнения, включая условные операторы, операторы вывода на экран и вывода действий меню. Максимальная вложенность ограничена, но достаточно велика для нужд практически любой текстовой квестовой игры, и в любом случае легко обходится использованием процедур.
Важный элемент – оператор DELACT, удаляющий действия меню с экрана. В этой игре он используется для действий, которые можно выполнить только один раз подряд – к примеру, взять уникальный предмет или подойти или заглянуть куда-то.
ACT '<table width="100%"><tr><td bgcolor="#eeeefF">Обойти избушку слева</td></tr></table>': GOTO 'Юг_избушки'
ACT '<table width="100%"><tr><td bgcolor="#eeeefF">Обойти избушку справа</td></tr></table>': GOTO 'Север_избушки'
ACT 'Заглянуть в окно':
'Изнутри окно занавешено красивой кружевной занавеской.'
DELACT 'Заглянуть в окно'
IF Ключ_взят = 0:
'На подоконнике лежит небольшой блестящий ключик.'
'<img src="img/key.png" />'
ACT 'Взять ключик':
'Ключик поблескивает на окне. Луна предполагает, что его здесь просто забыли, подбирает и прячет в сумку.'
ADDOBJ 'Небольшой блестящий ключик','img/key_small.png'
Ключ_взят = 1
DELACT 'Взять ключик'
END
END
END
Оператор GOTO используется для обозначения перехода в новую локацию, в то время как оператор GOSUB используется для вызова процедуры. В данной игре процедуры используются в основном в диалогах, давая возможность начинать диалог с того места, где он был прерван, в случае выхода из локации и возвращения в нее заново.
Это достигается путем запоминания места разговора в соответствующей переменной и множественного выбора при инициации разговора.
ACT 'Постучать в окно':
IF Разговор > -1:
'Занавеска отодвигается. В окне появляется сморщенное, загорелое старушечье лицо с густыми бровями, крючковатым носом и бородавкой на остром подбородке.'
IF Разговор = 0: GOSUB 'Разговор1'
IF Разговор = 1: GOSUB 'Разговор2'
IF Разговор = 2: GOSUB 'Разговор3'
IF Разговор = 3: GOSUB 'РазговорОкончен'
END
ELSE:GOSUB 'РазговорНеВышел'
DELACT 'Постучать в окно'
END
Механика головоломки реализуется путем использования операторов работы с инвентарем. К ним относятся ADDOBJ, добавляющий предметы в инвентарь, DELOBJ, удаляющий предметы из инвентаря, и OBJ, проверяющий наличие предмета в инвентаре по его названию. При добавлении предмета в инвентарь можно указать адрес файла изображения, и в этом случае предмет в инвентаре будет отображаться рядом с этим изображением. При этом не представляется возможность настроить размер изображения, поэтому важно следить за размером загружаемого файла.
#Взять_бутыль
DELACT 'Взять бутыль'
'Луна берет бутыль и прячет в сумку.'
'- Вот спасибо, - вздыхает хозяйка.'
ADDOBJ 'Бутыль с зельем','img/bottle_small.png'
Бутыль_взята = 1
-
…
IF OBJ 'Узелок с пирожками':
ACT 'Предложить пирожки':
DELACT 'Предложить пирожки'
'Луна достает из сумки узелок с пирожками и разворачивает.'
'- Хотите? - жизнерадостно спрашивает она, беря один себе.'
'Стражники колеблются несколько секунд, потом один из них отставляет алебарду в сторону, наклоняется и берет один. Второй следует его примеру, потом забирает весь узелок.'
'- Ты проходи, если хочешь, - кивает он на дверь.'
IF Можно_в_город = 0:
ACT '<table width="100%"><tr><td bgcolor="#eeeefF">Пройти через дверцу</td></tr></table>': GOTO 'Ворота_внутри'
END
Можно_в_город = 1
DELOBJ 'Узелок с пирожками'
END
END
Механика рискового действия реализуется при помощи оператора CLA, очищающего зону меню для невозможности прерывания действия в середине, генератора случайных чисел RAND и таймера WAIT, обеспечивающего напряженность ожидания. Также для каждого действия используется переменная, обозначающая неудачу этого действия и невозможность попробовать заново – в случае успеха действие можно повторить. В первом квесте рискованное действие – это попытка пролезть к трубе по скользкой крыше, и единожды упав, главная героиня не хочет пробовать заново.
IF Упала = 0:
ACT 'Попробовать залезть в трубу':
CLA
'Луна осторожно, на корточках, пытается перебраться через скользкую крышу - маслом, что ли, она намазана? - к трубе.'
WAIT 1000
…
WAIT 1000
IF RAND(1,2) > 1:
'Внезапный порыв ветра бьет по ведьмочке, и она, теряя равновесие, катится вниз по скользкому скату. Не успевая сгруппироваться, Луна приземляется напротив двери избушки.'
WAIT 1000
…
WAIT 1000
Упала = 1
GOTO 'Запад_избушки'
ELSE
'Внезапный порыв ветра бьет по ведьмочке, но она, вцепившись в конек крыши, удерживается на месте. Фух... вот и труба.'
ACT 'Залезть в трубу': GOTO 'Внутри_избушки'
END
END
END
На следующем этапе, после ознакомления с основными возможностями игры и разработкой основ механики, были созданы основные локации игры – см. рисунок 2.7. Был написан основной текст игры – художественное описание происходящего, и закодирована последовательность событий со всеми альтернативными разветвлениями и возможностями.