В квестах, как правило, присутствует так называемый инвентарь, т. е. место, в котором хранятся все предметы, принадлежащие игровому персонажу. Создание и управление инвентарём в WME происходит в несколько шагов, которые описаны в этом разделе.
Задаёт местоположение предметов, элементы управления (такие, как кнопки прокрутки) и фон.
Чтобы создать окно инвентаря, нужно написать текстовый файл следующего вида:
INVENTORY_BOX { ITEM_WIDTH = 65 ITEM_HEIGHT = 65 SPACING = 10 SCROLL_BY = 1 HIDE_SELECTED = TRUE AREA { 30, 12, 770, 77 } EXCLUSIVE = FALSE WINDOW { X = 0 Y = 0 WIDTH = 800 HEIGHT = 90 IMAGE = "interface\inventory.bmp" BUTTON { TEMPLATE = "ui_elements\template\but.button" NAME = "prev" TEXT = "<" X = 0 Y = 0 WIDTH = 30 HEIGHT = 90 } BUTTON { TEMPLATE = "ui_elements\template\but.button" NAME = "next" TEXT = ">" X = 770 Y = 0 WIDTH = 30 HEIGHT = 90 } } }
Как видите, первая часть (пурпурная) задаёт некоторые специфические для этого окна атрибуты, тогда как вторая (серая) определяет его внешний вид. Вторая часть задаёт окно, описанное в разделе Окна и элементы управления. Окно инвентаря может содержать любые элементы интерфейса; для более подробной информации по ним обратитесь к указанному разделу.
Давайте подробнее рассмотрим первую секцию:
Основываясь на этих настройках, WME автоматически заполнит заданный прямоугольник предметами, из которых производится выбор.
Вторая часть - это стандартное определение окна с небольшим исключением: если Вы назовёте некоторые кнопки next (следующий) или prev (предыдущий), WME автоматически будет использовать их для прокрутки выбираемых предметов.
Все предметы должны быть описаны в файле определения (по умолчанию он называется items.items). Это файл содержит секции для каждого предмета, который будет использован в игре. Пример такого файла:
ITEM { CAPTION = "Item caption" NAME = "item_name" SPRITE = "items\normal_image.bmp" SPRITE_HOVER = "items\hover_image.bmp" CURSOR = "items\normal_cursor.bmp" CURSOR_HOVER = "items\hover_cursor.bmp" CURSOR_COMBINED = TRUE ALPHA = 255 ALPHA_COLOR { 255, 255, 255 } TALK = "items\item_talking.sprite" FONT = "fonts\some.font" SCRIPT = "items\item.script" AMOUNT = 100 DISPLAY_AMOUNT = FALSE AMOUNT_ALIGN = right AMOUNT_OFFSET_X = 5 AMOUNT_OFFSET_Y = 47 }Описание:
Большая часть этих свойств необязательна. В общем случае, Вам нужно задать только свойства NAME и SPRITE, возможно также CAPTION и SCRIPT.
Вам нужно будет добавить подобную секцию для каждого предмета в игре.
Как Вы видите, предметы могут содержать информацию о своём количестве. Это полезно для таких вещей как деньги.
Итак, после того, как мы описали инвентарь и его предметы, мы можем использовать их в игре, т. е. в сценариях. Все методы и свойства, описываемые в данном разделе, рассматриваются подробнее в главе Программирование.
Взятие, выбрасывание, удаление и запрос предметов
Обращение к предметам инвентаря осуществляется по их именам. Если Вы хотите взять предмет, чтобы положить его в инвентарь, используйте метод Game.TakeItem(). Например:
Game.TakeItem("book"); |
Это добавит предмет «книга» (book) в инвентарь. Если Вы используете несколько инвентарей, Вам нужно вызвать метод TakeItem относительно объекта, которым Вы хотите взять предмет, например, OldGuy.TakeItem("book").
Удаление из инвентаря осуществляется методом Game.DropItem():
Game.DropItem("book"); |
Хотя удалённый предмет больше не отображается в инвентаре, тем не менее он может быть снова использован впоследствии. Если Вы хотите удалить эту вещь из игры навсегда, воспользуйтесь методом Game.DeleteItem().
Вы можете запросить предмет из инвентаря с помощью метода Game.GetItem(). Он вернёт программный объект, который может быть использован, чтобы задать свойства предмета.
Чтобы узнать, взят ли определённый предмет кем-либо из персонажей, воспользуйтесь методом Game.IsItemTaken(). Он просмотрит все инвентари в игре на наличие в них указанного предмета. Помимо этого, объект Game располагает методом HasItem(), с помощью которого можно опросить конкретный объект, имеется ли у него искомый предмет.
Пример:
// у кого-нибудь есть книга? var IsBookTaken = Game.IsItemTaken("book"); // у старика (OldGuy) есть книга? var OldGuyHasBook = OldGuy.HasItem("book"); |
Привязка предмета из инвентаря к объекту сцены
Как правило, на сцене встречаются объекты, которые можно взять. Будучи взяты, они исчезают из сцены. В WME очень просто связать предмет инвентаря с объектом сцены. Предположим, мы имеем в нашей сцене объект (entity), представляющий книгу, а соответствующий ему предмет инвентаря называется book. В программе SceneEdit выберите объект, изображающий книгу, и обратитесь к панели свойств. Вы увидите поле «Предмет» (Item). Просто впишите в него имя предмета из инвентаря, который Вы хотите связать с этим объектом:
Теперь они связаны. Это значит, что когда Вы вызовите метод Game.TakeItem("book") из сценария, объект автоматически исчезнет из сцены. Аналогично, когда Вы выбросите предмет методом Game.DropItem("book"), объект снова появится. Если Вы хотите навсегда удалить из игры и предмет, и объект сцены, связанный с ним, воспользуйтесь методом Game.DeleteItem("book").
Выбор предметов
Когда пользователь выбирает один из предметов, курсор мыши меняется соответствующим образом. Если курсор предмета наведён на интерактивный объект, то отрисовывается другой курсор, предназаначенный для этой цели (см. выше). Чтобы выбрать предмет, нужно воспользоваться свойством Game.SelectedItem. Чтобы отменить выбор, установите этот атрибут в null.
Если Вы не хотите использовать эффект изменения вида курсора при наведении его на объект, к которому выбранный предмет никак не применим, установите свойство Game.SmartItemCursor в true. Таким образом, будет проверяться, может ли объект, над которым находится курсор мыши, обработать событие, имя которого совпадает с именем выбранного предмета. Следует помнить, что это свойство влияет только на представление курсора, оно не предупреждает пользователя о том, что предмет не применим к данному объекту. Это должно быть указано в файле сценария.
Использование нескольких инвентарей
В WME каждый объект (game (вся игра), actors (персонажи), entities (объекты сцены)) может иметь свой собственный инвентарь. Это может быть полезно для проектов с несколькими игровыми персонажами. В этом случае, Вы можете контролировать чей инвентарь на данный момент должен отображаться на экране. Это осуществляется с помощью установки атрибута Game.InventoryObject. По умолчанию он установлен на инвентарь объекта Game, который удобно использовать для игр с одним инвентарём.
Запрос доступных предметов из инвентаря
Свойство Game.TotalNumItems возвращает количество объектов инвентаря (как взятых, так и нет), а метод Game.QueryItem() позволяет Вам запросить конкретный предмет. Следующий пример кода перебирает все предметы из инвентаря и выводит их названия на экран:
for(var i=0; i<Game.TotalNumItems; i=i+1) { var Item = Game.QueryItem(i); Game.Msg(Item.Name); } |