† Статьи †

Создание собственного GUI, часть вторая

В уроке прошлом мы немного освоили гуи-эдитор. Что нам это даёт? Можно наваять экран с кучей помех и дергающихся надписей. Поставить его на карту. Какая с этого польа, помимо декоративной? Да никакой. Технология GUI-экранов для того и создавалась чтобы маппер мог через мониторы взаимодействать с другими объектами на карте, создавая различные игровые ситуации - например, по нажатии на экран открывались двери, выскакивали монстры, бились лампочки и прочее. В уроке нынешнем мы займемся созданием подобных экранов.

По первой части данного мануала создаём гуишник с кнопкой. К кнопке пишем следующий код:

OnAction
{
	set	"cmd" "activate" ; 
}

Есстественно, такие события, как OnMouseEnter, OnMouseExit, OnTime и остальные также актуальны. Теперь редактор gui-скриптов можно закрыть, он нам пока не нужен. Запускаем редактор карт. Создаем новую карты и ставим на ней какую-нибудь модель. Цепляем к модели наш гуишник посредством прописывания следующих параметров у модели (пишем в окошке, которое вызывается по кнопке N):

value: gui
key: путь_к_скрипту (например, guis/Amon/newscript2.gui)

Теперь эту модель терминала можно использовать как триггер, например сделаем залоченую дверь, которая при нажатии на экран разблокируется. Создаем дверь со следующими свойствами:

value: locked
key: 1 

Создаём объект target_lock. Параметры объекта следующие:

value: locked
key: 0 

Соединяем через Ctrl+K сначала модель терминала с target_lock, а потом (сняв выделение с предыдущих объектов) target_lock с дверью. Компилируем карту и запускаем её в игре.

В игре дверь заблокирована, но после нажатия на кнопку в терминале раблокировывается. Конечно же, можно и наоборот - заблокировать разблокированную дверь. И также никто не мешает повесить другие действия: появление/изчезание монстров, взрывы разных труб, показ скриптового ролика, возпроизведение различных звуков, включение/выключение света наконец!

А что если надо сделать, чтобы при каком либо действии на карте (например, при убийстве монстра) менялось что-либо на экране? Например, однажды мне потребовалось создать такую ситуацию - gui-кнопка на терминале должна была отказываться работать, пока игрок не войдёт в определённую комнату. Как я это реализовал? Просто. Для этого есть специальное событие OnTrigger. Используется оно вот так:

Создадим экран с кнопкой. Кнопка не будет реагировать на нажатие до активации триггера, но "оживет" после.

Для начала создадим gui-экран с нормальной рабочей кнопкой. Присвоим ей любое действие. Потом в свойствах кнопки (открываемых по Alt+Enter) поставим на первой вкладке флажок "No events" (это сделает кнопку неактивной). И потом, создав любой объект (можно за пределами экрана) поставим для него этот код:

OnTrigger
{
	set "ИМЯ_КНОПКИ::noevents" "0" ; 
}

Это значит, что при активации триггера кнопка "оживет". Далее открываем редактор карт, создаем терминал с gui-экраном. Создадим триггер (trigger_once), поставим его в нужное место и соединим с терминалом (именно от триггера к терминалу, а не наоборот!). Компилим. В игре gui-кнопка не реагирует на нажатия, но "оживает" при активации триггера.

Так, с этим закончили. Теперь расскажу про такой шикарный параметр, как Gui_Parm. Что это? Допустим, тебе надо создать 5 терминалов с одинаковыми экранами, но разными надписями на них. Можно скопировать 5 раз искомый экран, изменить и для каждого надписи. А если надо 10 терминалов? 100? 1000? Долго, трудно и тупо. Для таких случаев есть gui_parm - значение, которое на одном и том же gui-экране может быть различным. Подробнее. Создаем gui-экран, в нем окошко со таким текстом: "gui::gui_parm1" (без кавычек). Далее вставляем на новую карту терминал с только что созданым gui-экраном и в свойствах терминала пропишем следующий ключ:

value: gui_parm1
key: нужный_текст 

А если надо 2 разных надписи? Тогда нужно создать в gui-скрипте еще один объект с текстом, но в качестве текста будет "gui::gui_parm2" (и в свойствах терминала добавим ключ gui_parm2). Все. Также актуальны значения gui_parm3, gui_parm4, gui_parm5 и далее. И также эту фишку можно применять не только для текста, но и для фонового изображения, и для видимости какого-либо объекта, и для ещё много чего. С этим можно поэкспериментировать и самому.

На этом всё. Если что непонятно - пиши мне на мыло или в гесту. Ожидается 3-я часть мануала.

Пример (описаный gui и карту-пример с ним) можно слить здесь.

Автор: Амон

Hosted by uCoz