Если Вы протестируете сцену, то увидите, что стол и стул выглядят «интерактивными». При наведении курсора мыши на один из этих объектов, указатель изменит свою форму, а также будет отображён заголовок объекта. Это происходит потому, что стол и стул являются объектами (entities) и значение свойства «Interactive» («Интерактивный») каждого из этих объектов установлено в «true» (включено). Но что делать, если нам понадобится сделать интерактивным часть фонового изображения? Нужно ли нам создавать дополнительные объекты для каждого элемента сцены, который мы хотим сделать интерактивным? И да, и нет. SceneEdit позволяет Вам создавать так называемые регионы-объекты (region entities). Они ведут себя так же, как и обычные объекты, но им не требуется графическое представление (другими словами, Вам не нужно создавать изображение для них). Они просто задаются как области внутри сцены.
Теперь мы сделаем интерактивными ещё несколько объектов, а именно: дверь, шкаф и окно.
Откройте файл «MyScene.scene» в программе SceneEdit.
Чтобы добавить регион, нажмите кнопку «Добавить объект» («Add entity») и выберите команду «Добавить регион» («Add region entity»).
Будет создан новый объект. А дальше всё просто. Вы можете задать его название и заголовок в окне свойств,а также изменить его форму тем же способом, каким Вы проделывали это над обычным регионом.
Добавьте в сцену три региона: «door» («дверь»), «closet» («шкаф») и «window» («окно»):
Обратите внимание, что порядок объектов и регионов очень важен! Мы уже знаем, почему это важно для отрисовки сцены, но это также важно для реагирования на действия пользователя. Когда WME вычисляет, над каким объектом находится указатель мыши, то она просматривает узлы с самого верхнего в списке до самого нижнего.
В нашей сцене порядок объектов в данном случае не важен, так как они не пересекаются, но Вам следует запомнить эту особенность.
Если Вы запустите игру, то увидите, что дверь, шкаф и окно теперь реагируют на наведение курсора мыши.
Вы уже обратили внимание, что курсор мыши меняет свой вид, когда находится над интерактивным объектом. Это два предопределённых вида курсора – стандартный и активный (Вы можете изменить их в программе ProjectMan в свойствах игры). Но Вы также можете привязать специальные виды курсоров к определённым объектам. Давайте сделаем так, чтоб курсор имел специальную форму, когда он наведён на дверь. Это очень просто. Все курсоры - это спрайты и Вы можете привязывать их к объектам сцены в программе SceneEdit.
Перейдите в окно программы SceneEdit и выберите объект «door».
|
Вы можете быстро выбрать объект в SceneEdit с помощью двойного щелчка на нём в окне отображения сцены. |
В окне «Свойства объекта» («Entity properties») есть свойство «Курсор» («Cursor»). Нажмите кнопку «…» рядом с этим свойством и Вам будет предложено выбрать спрайт, который будет использован в качестве указателя мыши. В учебном проекте в папке «data\sprites\system» уже имеются несколько изображений указателей. Перейдите в эту папку, выберите файл «arrow_left.sprite» и нажмите OK. Значение курсора изменено.
|
Если Вам нужно удалить назначенный спрайт, нажмите кнопку «…», а затем кнопку «Отмена» («Cancel») в диалоговом окне выбора файла. SceneEdit спросит Вас, действительно ли Вы ходите удалить назначенный объекту курсор. |
Сохраните сцену и запустите игру. Теперь, если Вы наведёте курсор мыши на дверь, он изменит свой вид на оранжевую стрелку.
Объекты нашей сцены выглядят интерактивными. Но если Вы будете щёлкать по ним мышью, ничего не произойдёт. Нам нужно создать некоторую логику поведения этих объектов. Логика игры создаётся с помощью сценариев. Сценарии - это текстовые файлы, содержащие часть программного кода. Более подробно сценарии описаны в другой главе. На данном этапе мы рассмотрим только основы.
Мы добавим сценарий для объекта «стол». Сначала нам нужно создать сам сценарий. Самый простой путь - использовать шаблон программы ProjectMan. Мы уже использовали шаблоны много раз до этого и теперь мы тоже обратимся за помощью к шаблону. В окне программы ProjectMan перейдите в папку «MyScene» и разверните её ветку в дереве проекта. «MyScene» содержит подкаталог, который называется «scr». Здесь будут храниться сценарии сцены. Сделайте на этом каталоге правый щелчок мышью и выберите команду «Добавить сценарий» («Add script»).
В диалоговом окне выберите шаблон «scene object» и назовите его «desk». Нажмите OK. В папке «scr» будет создан новый скрипт.
Откройте файл «MyScene.scene» в программе SceneEdit. Нам нужно выбрать объект «desk». Это можно сделать либо выбрав его в списке узлов, либо сделав двойной щелчок на объекте «стол» в окне отображения сцены. В окне свойств есть кнопка «Сценарии…» («Scripts…»). Нажмите её, чтобы открыть диалог выбора сценария. В этом окне вы можете привязать один или несколько сценариев к выбранному объекту. Нажмите кнопку «Добавить сценарий» («Add script»).
SceneEdit попросит Вас указать файл сценария для привязки. Выберите наш файл «desk.script» и нажмите OK.
Теперь мы отредактируем этот сценарий. Вы можете открыть его для редактирования либо нажав кнопку «Редактировать сценарий» («Edit script»), либо сделав двойной щелчок на имени файла сценария. SceneEdit откроет файл в указанном Вами текстовом редакторе (по умолчанию - это Блокнот Windows, читайте подробнее о настройке текстового редактора для сценариев).
|
Если к объекту ещё не был привязан сценарий, SceneEdit предложит Вам добавить новый сценарий автоматически после того, как Вы нажмёте кнопку «Сценарии…» («Scripts…»). Вам не нужно обязательно создавать его в программе ProjectMan. |
Новый сценарий будет выглядеть следующим образом:
#include "scripts\base.inc" //////////////////////////////////////////////////////////////////////////////// on "LookAt" { GoToObject(); actor.Talk("Blah"); } //////////////////////////////////////////////////////////////////////////////// on "Take" { GoToObject(); actor.Talk("Blah"); } . . . //////////////////////////////////////////////////////////////////////////////// function GoToObject() { actor.GoTo(200, 200); actor.TurnTo(DI_UP); } |
Блоки on xxx {} - это обработчики событий. Эти блоки кода выполняются в том случае, когда с объектом происходит определённое событие. Например, когда пользователь вызывает меню действий над объектом «стол» и выбирает действие «Осмотреть», происходит событие «LookAt» и выполняется обработчик этого события. Есть несколько событий высокого уровня, такие как «LookAt» («Осмотреть») или «Talk» («Говорить»). Эти события полностью определяются разработчиком. Также есть низкоуровневые события, такие как «LeftClick» («Левый щелчок»). Низкоуровневые события генерируются WME и их названия заключены в её коде и не могут быть изменены.
Давайте рассмотрим обработчик события «LookAt»:
GoToObject(); actor.Talk("Blah"); |
В этой части кода вызывается функция «GoToObject» («Подойти к объекту»), а затем персонаж должен сказать «Blah». Функция GoToObject уже предопределена для Вашего удобства:
function GoToObject() { actor.GoTo(200, 200); actor.TurnTo(DI_UP); } |
Эта функция выполняет следующее: персонаж идёт в точку с координатами 200, 200 и затем поворачивается лицом в направлении «вверх» («up»), т. е. на север.
Мы изменим сценарий следующим образом: когда пользователь выберет действие «Осмотреть» стол, персонаж подойдёт к столу, повернётся к нему лицом и скажет «Этот стол выглядит прочным».
Сначала мы сделаем вторую часть задачи: для этого просто изменим строку “Blah”. Обработчик события «LookAt» теперь выглядит следующим образом:
on "LookAt" { GoToObject(); actor.Talk("Этот стол выглядит прочным."); } |
Теперь нам нужно изменить функцию GoToObject так, чтобы персонаж переместился в нужную часть сцены. Но как нам получить точные координаты нужной нам точки? Самым простым способом будет использование инструмента размещения персонажа (о нём было рассказано на шаге 6). Вернитесь в окно программы SceneEdit. Нажмите кнопку «Разместить персонаж» («Place actor») и выберите файл «molly.actor». Теперь поместите персонаж в точку, куда Вы хотите чтобы он отправился для осмотра стола (помните, Вы можете перетаскивать его мышью, менять его направление правым щелчком мыши и закрепить его в выбранной точке левым щелчком мыши).
Итак, мы поставили персонаж туда, куда нам надо, но как мы узнаем его точные координаты для нашего сценария? Для этого нужно выполнить команду «Персонаж->Копировать координаты» («Actor->Copy actor placement») или нажать сочетание клавиш Ctrl+C.
При этом в буфер обмена будет скопирован следующий фрагмент кода:
actor.GoTo(544, 638); actor.TurnTo(DI_UPRIGHT); |
Всё, что нам осталось сделать, это вставить этот код в функцию GoToObject в сценарии «desk.scene». Функция будет выглядеть следующим образом:
function GoToObject() { actor.GoTo(544, 638); actor.TurnTo(DI_UPRIGHT); } |
Таким же образом Вы можете отредактировать обработчик события «Брать» («Take»). Персонаж может произнести какую-нибудь забавную фразу, когда пользователь попытается взять стол.
on "Take" { GoToObject(); actor.Talk("Этот стол немного великоват для меня..."); } |
Так как персонаж не может разговаривать со столом, Вы можете удалить обработчик события «Talk». В этом случае будет использован стандартный обработчик «Talk».
Обработчик «LeftClick» («Левый щелчок») просто вызывает функцию GoToObject. Это означает, что когда пользователь щёлкнет на объекте «стол», персонаж подойдёт к нему.
Итак, сценарий закончен. Сохраните его и сцену, закройте SceneEdit и вернитесь в ProjectMan.
Запустите игру и протестируйте сцену. Сделайте правый щелчок мышью на столе и появится меню. Понажимайте значки действий. Персонаж должен подойти к столу, повернуться к нему лицом и произнести соответствующую фразу.
Точно таким же образом Вы можете создать сценарии для других объектов сцены. Вы можете посмотреть завершённые сценарии в сцене «step7.scene».
Итак, довольно программирования, давайте перейдём на шаг 8: Слои.