Платформа: Сталкер Зов Припяти 1.6.02 Автор: FantomICW Ссылка на готовый Gui Благодарность: ХОВАН (за урок по Gui и дальнейшее разъяснение некоторых моментов), Geonezis (за шикарные Gui, которые стали для моих работ примером) Введение (читать необязательно) Какое-то время назад я выложил туториал по созданию инвентарного комплекса, где использовался прием коллбеков. Кому-то понравилось, кому-то не очень. Мнения были разные. Пожалуй, меня больше всего заинтересовал комментарийColR_iT. Более серьезный урок с Gui-элементами...А собственно, почему бы и нет? Пусть дело и не самое легкое, но результат ведь достойный. Наверное, всем, кто играл в Смерти Вопреки, понравились Gui-комплексы аптечек, пайков...Сегодня мы будем учится сделать подобные вещи. С упрощенным дизайном, но зато научимся это делать сами. А за основу будем брать реальную аптечку АИ-2. Предупреждаю, читать немало, урок очень детальный: от конфигов до текстур. Опытным модмейкерами может не понравится вычитывать части в роде "Создание бустера". Ну, это ваше дело. Подготовка к действу
- Paint Net (редактируем тестуры) - Notepad++ (рекомендую для редактирования текстовых файлов игры) - XnView (полезная прога, но необязательная, позволяет быстро просматривать текстуры в папке и снимать координаты) - Milkshape 3d (позволяет просматривать модели + проверять текстуры, необязательно) - Stalker Icon Editor (крайне рекомендуется)
Как я уже говорил, за основу мы берем реальную аптечку - АИ-2. Считаю, важно сделать наполнение нашего комплекса как можно более схожим с реальным. Поэтому, рекомендую внимательно почитать о наполнении в Википедии. А если леньки и нет желания проходить по моим следам, то читаем информацию ниже
Цитата (Наполнение аптечки (из Википедии))
Противобактериальное средство № 2 (сульфадиметоксин 0,2 г.) — 1 удлинённый пенал без окраски на 15 таблеток;
Радиозащитное средство № 2 (калия йодид 0,125 г.) — 1 пенал белого цвета на 10 таблеток;
Противорвотное средство (этаперазин 0,006 г.) — 1 пенал голубого цвета на 6 таблеток;
Противобактериальное средство № 1 (хлортетрациклин 0,006 г.) — 2 пенала без окраски с квадратными корпусами на 5 таблеток каждый;
Радиозащитное средство № 1 (цистамин 0,2 г.) — 2 пенала малинового цвета на 6 таблеток каждый.
Опираясь на это мы будем делать иконки, текстуры и модели, конфиги предметов. Что касается самого комплекса - при нажатии кнопки выдачи медикамента, медикамент будет появляться в рюкзаке, а кнопка будет переставать действовать.
Практика
Откроем файл configs/misc/items.ltx, Где и пропишем новые "бустеры". Если точнее, то саму аптечку АИ-2 и ее составляющие:
Стандартные секции бустеров. Полезные свойства аптечки приводим к нулю. Она у нас уже не выполняет функции медикамента, как такового. Полезные свойства составляющих медикаментов я прописывал по их назначению. Конечно, параметра "тошнота" в игре нету, поэтому заменим это дело на "восстановление сил". На что стоит обратить внимание, это параметр eat_portions_num. Мы берем реальное количество порций каждого медикамента. Под это будут завязаны модели, иконки, функции гуи и конечно параметр в конфиге. Вот, например, указано, что на хлортетрациклин выделено 10 порций (2 пенала по 5 таблеток). Итого, в конечном итоге у нас на этот медикамент должно быть 10 порций. Поэтому в секции antibio_chlor в параметре eat_portions_num стоит 2. То есть, предмет можно использовать два раза. Вспоминаем таблицу умножения При нажатии на кнопку данного медикаменты, в рюкзак добавится 5 таких предметов. Итого, используется 10 раз. Теперь разберем секции: medkit_ai2 - секция аптечки АИ-2 antirad_kalium - калия йодид antirad_cystamine - цистамин antibio_sulfad - сульфадиметоксин antiemetic - этаперазин antibio_chlor - хлортетрациклин Значения иконок и моделей у меня уже выставлены новые, но к этому мы вернемся чуть позже. Давайте добавим нашим предметам описания и названия. Откроем файл configs/text/rus/st_items_equipment.xml. Там пропишем:
Код
<string id="st_antirad_kalium"> <text>Калия йодид</text> </string> <string id="st_antirad_kalium_descr"> <text>Препарат радиозащитного действия на основе (калия йодид)</text> </string> <string id="st_antirad_cystamine"> <text>Цистамин</text> </string> <string id="st_antirad_cystamine_descr"> <text>Препарат радиозащитного действия на основе (цистамин)</text> </string> <string id="st_antibio_sulfad"> <text>Сульфадиметоксин</text> </string> <string id="st_antibio_sulfad_descr"> <text>Противобактериальное средство (сульфадиметоксин)</text> </string> <string id="st_antibio_chlor"> <text>Хлортетрациклин</text> </string> <string id="st_antibio_chlor_descr"> <text>Противобактериальное средство (хлортетрациклин)</text> </string> <string id="st_antiemetic"> <text>Этаперазин</text> </string> <string id="st_antiemetic_descr"> <text>Противорвотное средство (этаперазин)</text> </string> <string id="st_medkit_ai2"> <text>АИ-2</text> </string> <string id="st_medkit_ai2"> <text>Аптечка индивидуальная "АИ-2"</text> </string>
На этом с основными конфигами все.
Начинаем творческие процессы. Для аптеяки я возьму старую иконку, она вполне годная, а вот для компонентов нужно бы подыскать...Редактировать иконки будем с помощью Paint Net и Stalker Icon Editor. Надеюсь, знаете, как ими пользоваться. А если не знаете, то рекомендую учиться. Хотя, SIE - прога уже проще некуда. Так вот, давайте подумаем. Если предмет можно использовать 2 раза, как, например, цистамин ака antirad_cystamine, значит иконка должна быть на две порции. Предлагаю это увидеть. Для цистамина я взял всем известную иконку антирада, кто автор, к сожалению, не знаю, но встречается часто:
На иконке видно две ампулы. Значит, оно идеально подходит. Примерно следуя такой философии нужно искать/создавать подходящие иконки. Напоминаю, иконки расположены в файле textures/ui/ui_icon_equipment.dds. Перемещать, копировать иконки, узнавать их координаты удобней в SIE. Идеальная утилита для этого. Я подготовил иконки следующим образом: - открыл свой ui_icon_equipment.dds и этот же файл из SGM 2.2 - в клеточку справа от иконки паспорта Дегтярева в своем файле скопировал стандартную иконку пси-блокады - еще правее иконку антирада из СГМ - еще правее иконку зелено-синего антидота из СГМ - за ней правее скопировал стандартную иконку радиопротектора - под иконку пси-блокады, которую мы только что поставили, вставил еще одну иконку антирада из СГМ Опять же, на словах объяснить сложно. Это нужно увидеть: Сохраняем, закрываем прогу. Но далеко ее не прячем. Еще пригодиться. Что мы имеет на данный момент: у нас есть две готовые иконки (антирад, зелено-синий антидот) и три неготовые (второй антирад, пси-блокада, радиопротектор). Давайте исправлять три иконки. Открываем этот же файл в Paint Net. Выделяем иконки с помощью Лассо, в панели сверху выбираем Коррекция-->Оттенок и насыщенность, а дальше редактируем под себя. Я считаю, этот инструмент - самый подходящий для подобной цели. Но это не значит, что другие не надо использовать. Пробуйте, творите! После того, как три иконки обработали, сохраняем. Можно еще раз открыть в SIE, и снять координаты. Сегодня вам повезло - координаты в конфиге правильные, и про философию количества я не забыл. В SIE мои иконки после редактирования выглядят так: Если кто не знает, как вычислять координаты в этом редакторе, поясняю: выделяем иконку, кликаем правой кнопкой мышки, выбираем "Информация о выделении". Всплывет окошко с параметрами. Копируем их с заменой старых аналогичных параметров в конфиге предмета. Теперь, чтобы не запутывать вас, я даю вот такую таблицу, которая многое пояснит: Название секции--Кол. порций--Иконка antirad_kalium--10-- antirad_cystamine--2-- [antibio_sulfad]--3-- antiemetic--2-- antibio_chlor--2-- На этом с иконками все.
Раз мы использовали стандартные иконки (те, что из СГМ, тоже были изготовлены из стандартных)с ретекстуром, значит можно использовать стандартные модели и текстуры с ретекстуром. Сразу давайте определимся, что новые модели нужны только для четырех медикаментов. Для аптечки берем старую модель аптечки, для антирада-цистамина стандартную модель антирада. Новые модели будем складывать в папку meshes\dynamics\equipments\medical с определенными названиями. Почему так? А потому, что мы указали нечто в конфигах медикаментов:
Как-то так. Как я уже говорил, модели будем брать стандартные, и прописывать им новую текстуру (самими текстурами займемся в следующей части). Я покажу на примере калиума, одну модель мы возьмем из СГМ, остальные две модели вы сможете сделать по таблице. Итак, из ресурсов СГМ берем модель meshes/dynamics/equipments/medical/drug_act_eye.ogf, скопируем ее в эту же папку наших ресурсов и переименуем на antirad_kalium. Также, копируем текстуру модели - sgm/item_psyhodelin.dds. Как я узнал, что именно эту тектсуру надо копировать? Открыл модель блокнотом и порылся там чуток, пока не увидел такую запись. Учтите, там изменена текстура только одного предмета. Значит, текстура можно будет в дальнейшем использовать. Поэтому, я предпочитаю поместить текстуру в папку textures/item и переименовать на item_medkitai2. Кроме того, в модели, запись
Код
sgm\item_psyhodelin
меняем на
Код
item\item_medkitai2
Кстати, таким образом мы и будем менять текстуру следующим моделям. Но! Не забываем, что количество символов в новой записи должно быть равным количеству их в старой. Проделаем подобное еще раз - с моделью для antibio_sulfad. Иконка у него, напоминаю, от антидота. Значит и модель от нее же. Копипастим модель drug_antidot.ogf (как-раз находится в нашей папке) и переименовываем на antibio_sulfad. Открываем блокнотом, запись
Код
item\item_medkit_4
меняем на
Код
item\item_medkit_5
Думаю, тут сложного ничего нет. Осталось проделать подобное для оставшихся медикаментов. Старая модель--Новая модель--Старая запись--Новая запись
drug_radioprotector.ogf--antiemetic.ogf--item\item_medkit_4--item\item_medkit_5 dev_antirad.ogf--antibio_chlor.ogf--item\item_medkit--item\item_medic1 С моделями закончили. Но не с текстурами. Мы же дали новые записи, то есть отсылки к новым, несуществующим пока текстурам. От отсутствия текстур игра вряд ли вылетит. Но согласитесь, фиолетовая густая масса - это не дело. Идем пилить текстуры
Текстуры, или логическое продолжение моделей. Раз уж мы сегодня не создаем модели, иконки сами, с нуля, как положено, то давайте "погрешим" и с текстурами. Все-равно, смысл немного не в этом. А на создание качественной модели с нуля ушло бы еще немало времени. Давайте вернемся к прошлой части урока. Мы меняли через блокнот привязку к текстуре. У этого способа есть то ли минус, то ли плюс: даже в новой текстуре модель будет брать старые координаты. Пример. Если модель радиопротектора брала себе текстуру из файла item_medkit_4.dds по следующим координатам: значит и в новой текстуре (item_medkit_5.dds) будут браться те же координаты. Но нам сейчас это полностью подходит. Копируем текстуру item_medkit_4.dds со всеми thm и бампами, переименовываем на item_medkit_5. А дальше открываем в Paint Net.Здесь мы будем править текстуры для моделей, у которых есть отсылка к этому файлу. То есть для antibio_sulfad и antiemetic. Процесс этот, опять же, творческий. Красим, как хотим. Нам нужно изменить текстуру радиопротекора (вверху, чуть правее) и текстуру красной части антидота (она почему-то берется от этикетки "Геркулеса" ). Короче, у меня вышла такая текстура: Текстуры делал по цвету соответственно иконкам. Нужно провести примерно такой же процесс с другой текстурой - item_medkit.dds. Копируем и переименовываем на item_medic1. Это уже будет текстура для antibio_chlor. Открываем новую текстуру и заменяем оттенки антирада: Ура! Можно приступать у Gui!
Прежде всего наметим концепцию: - Gui-окошко будет не самым большим, примерно 600X400. - слева в столбик будут находиться иконки предметов (составляющих аптечки) - справа от каждого - название и количество - правее текста - кнопки использования - выше посредине название аптечки - ниже посредине кнопка выхода В таких случаях, если не можете представить это все в уме, не стыдитесь делать зарисовки на бумаге. Используем все тот же Paint Net. Можно еще и XnView использовать, чтобы быстро найти подходящие текстуры. Прежде всего я хотел бы заметить, что dds-файлы, в которых находятся текстуры окон Gui, должны быть размером равным какой-то степени двойки. Например, 1024 pix, 2048 pix...Создадим такой файл в папке textures/ui. Назовем его ui_medkit_ai2_gui.dds. Расширение - 1024X1024. Можно и в другую папку, но мне лично привычней Gui-элементы сохранять в папке, где есть только Gui-элементы. Теперь выделим все (Ctrl+A), и вырежем к днищу X-ray'а. А теперь, начинаем строить окошко. Я просмотрел текстуры из папки ui в XnView, и выбрал следующий участок из файла ui_actor_save_load.dds (СГМовский) для текстуры окошка: Если у вас нету СГМ-ресурсов, не волнуйтесь, в файле ui_actor_pda.dds есть похожее окошко. Выделяем, копируем, вставляем в наш файл. Удобней всего придвинуть окошко к левому верхнему углу до упора. Теперь создадим столбик для наших иконок. Для этого идеально подойдут слоты артефактов их файла ui_actor_menu.dds: Выделяем, копируем, вставляем в нашу текстуру. Разворачиваем на 90 градусов и ставим в левую часть окошка, в упор к нижнему левому углу внутренней рамки: Теперь начинаем заполнять каждое окошко иконкой предмета. Возвращаемся к любимому ui_icon_equipment.dds, с помощью Лассо выделяем новую иконку, копируем, вставляем (рекомендую вставлять на новый слой) а окошко. Так проделываем со всеми. У меня в целом вышла во такая картина: На этом с текстурами окошка, как таковыми, все. Но не спешите закрывать. Выделите финальное окошко, скопируйте, нажмите "Создать новый документ", вставьте окошко. Для чего это надо вы узнаете следующей части.
Итак, это одна из основных частей урока. Конфигурация Gui, где указано расположение всех элементов на экране, находится в файлах расширения XML. Поэтому, создадим в configs/ui файл ui_gui_elements.xml. Заполним его следующим образом:
Это уже готовая форма. Но просто дать людям копипаст - не есть пример хорошего модмейкерского тона. В первую очередь нужно объяснить, что и как. Разберем некоторые элементы. <?xml version="1.0" encoding="windows-1251" ?> - кодировка файла. Находится вне тегов. <gui> и </gui> - открывающий и закрывающий теги наполнения всего файла. Кстати, давайте определимся, что все в XML состоит из открывающих и закрывающих тегов и внутреннего наполнения. Итак, если мы хотим добавить гуи-форму, мы добавляем ее между основными тегами файла. В данном случае они называются gui. Хотя, многим тегам можно дать любое название. Теги такого типа - не исключение. Называйте их как угодно. Идем дальше. medkit - это уже теги нашей гуи-формы. Обратите внимание на эту строку:
Код
<medkit x="206" y="162" width="612" height="443">
Это основные параметры окна. x, y - расположение окна на экране по ширине и высоте (координаты берутся в пикселях по левому верхнему углу формы, а игровой размер экрана считается 1204х768 пикселей, это все стоит запомнить) width, height - ширина и высота окна на экране К этому мы вернемся. А пока смотрим ниже:
Это инициализация текстуры окна. Внимание, тег texture - системный, его менять нельзя! Это как-раз исключение. Теперь поясню, как берется текстура. Есть уже знакомый нам файл ui_medkit_ai2_gui.dds. В строке выше к нему указан путь. Если мы выделим окошко, которые недавно готовили, в Paint Net, то снизу можно увидеть надписи "Верхний левый угол области№ с координатами и "Размеры прямоугольника" с размерами в пикселях. Координаты левого угла окошка в файле - 0 и 0. Это потому, что он стоит в левом углу самого файла. Помните, я говорил об этом, когда строили окошко? Короче, в значениях x и y внутри texture пишем по нулям. Размеры прямоугольника в Пэинте - 612х443. Тогда добавим эти значения в width и height в texture. Кстати, вы заметили, что ширина и высота текстуры окна и самого окна в игре - одинаковые? Думаю, это логично. Хотя, можно делать их разными...В большинстве случаев выходит тогда не очень... Теперь вопрос: а как я определил координаты для самого окна на экране? Просто. Окошко у нас будет посредине экрана. Значение x получаем так: ширина экрана-ширина окна/2. То есть 1024-612/2=206. Для высоты все аналогично, но со значением высот: 768-443/2=162. Идем дальше.
Это подсекция текста "Аптечка АИ-2", который будет посредине сверху. caption_medkit - меняемый тег. Расположение считывается примерно так же, как и выше, но с другого документа! Копируем окошко из файла текстуры в новый документ с таким же расширением, как и само окно. И координаты для всех текстов, кнопок снимаем там, ведь они находятся внутри формы. Хочу заметить, что для текста размер выделенного прямоугольника не играет роли. Разбираем текст дальше: text font - шрифт текста st_medkit_ai2_descr - id текста, который будет показан. Здесь указан текст описания аптечки. Ниже идут тексты, которые будут находиться возле иконок предметов. Суть тегов такая же, текст будет новый, не инвентарный. Но с этим потом. Я решил сделать так, чтоб тексты стояли на одном уровне по оси x. Можно сделать это очень удобно: снимаем координаты для первого текста, переходим к инструменту "Перемещение области выделения", кнопкой "Вниз" на клавиатуре сместим выделение чуть ниже к другой иконке. Теперь уже нам важен только параметр y, а x - у всех одинаковый. Идем дальше. Видим новые теги типа btn. Это кнопки. Теги редактируемые. Последняя кнопка в списке - btn_close находится в окошке внизу посредине. Можете проверить. Остальные кнопки - строго напротив текстов. Суть примерно такая: снимаем координаты первой кнопки напротив текста цистамина, ее параметр x задаем всем остальным таким кнопкам. А y каждой кнопке даем от текста, напротив которого находится кнопка. Касательно кнопки осталось еще пару моментов разобрать.
Код
<texture>ui_inGame2_Mp_bigbuttone</texture>
Это текстура кнопки. Но ui_inGame2_Mp_bigbuttone была определена еще заранее в оригинальной игре. В Сталкере можно задавать текстурам свои id. Такой прием используется, чтобы потом их можно было удобней прописывать в другие конфиги, как, например, секции нпс в character_desc (иконки нпс) или как иконки заданий в tm_.... Мы сегодня этому не будем придавать значения, но если интересно, гляньте папку configs/ui/texres_desc. text font - уже известный параметр. Шрифт текста в кнопке. ui_st_take - текст кнопок взятия медикаментов. Пока такой не существует, мы его добавим. ui_st_close - текст кнопки закрытия. Тоже добавим. Сохраняем файл. Можно скопировать и копию переименовать на ui_gui_elements_16. Это для широкоформатников. Теперь откроем configs/text/rus/ui_st_other.xml (или любой другой текстовый файл) и доавим туда все новые текстовки для Gui:
Ну вот мы и пришли к этой части. Чтобы ее понять конечно необязательно быть скриптером, но если вы совсем ничего о скриптах не знаете, поверьте, будет не легко. Если же вы владеете простыми скриптами, понимаете общую структуру - молодцы. Будет легче. Создаем скрипт ui_gui_elements.script в папке scripts. Я дам вам наполнение файла, там к большинству строк комментарии. Читайте на здоровье. Не ленитесь прочитать еще раз, если не уловили весь смысл. Сразу все ухватить сложно...
Код
class "ui_medkit_ai2" (CUIScriptWnd) --Регистрация нового класса гуи-элемента от существующего класса CUIScriptWnd
function ui_medkit_ai2:__init(owner) super() --Иницилизируем класс, добавляем отсылки к функциям self.owner = owner self:InitControls() --Отсылка к функции регистрации элементов окна self:InitCallBacks() --Отсылка к функции регистрации коллбеков (условий) end
function ui_medkit_ai2:__finalize() --Функция завершения работы нового класса end
function ui_medkit_ai2:OnKeyboard(dik,keyboard_action) --Функция закрытия окна по нажатию на клавиатуре "Escape" CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) --Инициализируем нажатие кнопки на клаве if keyboard_action == ui_events.WINDOW_KEY_PRESSED then --Условие: если нажата кнопка на клаве if dik == DIK_keys.DIK_ESCAPE then --Условие: если нажата конкретно кнопка "Escape" if has_alife_info("gui_medkit_got_cystamine") and has_alife_info("gui_medkit_got_kalium") and has_alife_info("gui_medkit_got_chlor") and has_alife_info("gui_medkit_got_antiemetic") and has_alife_info("gui_medkit_got_sulfad") then self:HideDialog() --То при нажатии на кнопку - закрываем окошко disable_info("gui_medkit_got_cystamine") --И деактивируем обратно инфы, чтобы потом не было глюков disable_info("gui_medkit_got_kalium") disable_info("gui_medkit_got_chlor") disable_info("gui_medkit_got_antiemetic") disable_info("gui_medkit_got_sulfad") else --В любом другом случае self:HideDialog() --При нажатии на кнопку закрытия, закрываем окошко give_object_to_actor("medkit_ai2") --Выдаем обратно аптечку end end end return true end
function ui_medkit_ai2:OnButton_cystamine_clicked() --Функция коллбека кнопки взятия цистамина db.actor:give_info_portion("gui_medkit_got_cystamine") --Инфопорция give_object_to_actor("antirad_cystamine", 6) --Выдаем цистамин self.button_cystamine:Enable(false) --После этих действий кнопка больше не работает end
function ui_medkit_ai2:OnButton_kalium_clicked() --Функция коллбека кнопки взятия калиума db.actor:give_info_portion("gui_medkit_got_kalium") --Инфопорция give_object_to_actor("antirad_kalium") --Выдаем калиум self.button_kalium:Enable(false) --После этих действий кнопка больше не работает end
function ui_medkit_ai2:OnButton_chlor_clicked() --Функция коллбека кнопки взятия хлора db.actor:give_info_portion("gui_medkit_got_chlor") --Инфопорция give_object_to_actor("antibio_chlor", 5) --Выдаем хлор self.button_chlor:Enable(false) --После этих действий кнопка больше не работает end
function ui_medkit_ai2:OnButton_antiemetic_clicked() --Функция коллбека кнопки взятия ПШ db.actor:give_info_portion("gui_medkit_got_antiemetic") --Инфопорция give_object_to_actor("antiemetic", 3) --Выдаем ПШ self.button_antiemetic:Enable(false) --После этих действий кнопка больше не работает end
function ui_medkit_ai2:OnButton_sulfad_clicked() --Функция коллбека кнопки взятия сульфада db.actor:give_info_portion("gui_medkit_got_sulfad") --Инфопорция give_object_to_actor("antibio_sulfad", 5) --Выдаем сульфад self.button_sulfad:Enable(false) --После этих действий кнопка больше не работает end
function ui_medkit_ai2:OnButton_close_clicked() --Функция коллбека кнопки закрытия --Если все медикаменты распакованы: if has_alife_info("gui_medkit_got_cystamine") and has_alife_info("gui_medkit_got_kalium") and has_alife_info("gui_medkit_got_chlor") and has_alife_info("gui_medkit_got_antiemetic") and has_alife_info("gui_medkit_got_sulfad") then self:HideDialog() --То при нажатии на кнопку - закрываем окошко disable_info("gui_medkit_got_cystamine") --И деактивируем обратно инфы, чтобы потом не было глюков disable_info("gui_medkit_got_kalium") disable_info("gui_medkit_got_chlor") disable_info("gui_medkit_got_antiemetic") disable_info("gui_medkit_got_sulfad") else --В любом другом случае self:HideDialog() --При нажатии на кнопку закрытия (в окошке), закрываем окошко give_object_to_actor("medkit_ai2") --Выдаем обратно аптечку end end
function run_ui_medkit_ai2(folder) folder:ShowDialog(true) end
Большинство наполнения - специфическое. Уже в функциях коллбеков встречаются всякие give_info. Что еще рассказать по этой части - не знаю. Ну, разве что, советую внимательно посмотреть на строки в роде:
medkit:caption_chlor означает, что берется элемент caption_chlor из формы medkit. Теперь вернитесь к конфигу гуи. Посмотрите на названия форм. Логично? Такой строкой:
мы еще раз утверждаем (регистрируем) кнопку по id. Все, приступаем к финальной части.
Ну что, последняя часть нашего урока. В первую очередь добавим новые глобальные функции в _g.script:
Код
--Запуск Gui function run_gui(gui, close_inv) if close_inv == true then gui:ShowDialog(true) game_hide_menu() level.show_weapon(false) else gui:ShowDialog(true) end end
-- 'Создание предмета в рюкзаке ГГ. function give_object_to_actor(obj,count) if count==nil then count=1 end for i=1, count do alife():create(obj,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end end
Функцию give_object_to_actor мы используем при выдаче предметов в гуи. Кто-то скажет, что это бред и можно использовать стандартный alife:create. Но мне так создавать предметы приятней. А вы - как пожелаете. run_gui - запуск гуи. Первый аргумент - скрипт.класс_гуи. Второй аргумент - значение true/false - прятать/не прятать оружие и худ. По умолчанию - не прятать. Теперь создадим скрипт mod_callbacks.script и наполним его так:
Код
function on_use_item(sect) --Переменные (пусть будут на будущее, но можно и удалить) local actor=db.actor local item_name=sect:section() local actor_pos=db.actor:position() local active_slot=db.actor:active_slot() local active_item=db.actor:active_item() local pistol_in_slot=db.actor:item_in_slot(2) local rifle_in_slot=db.actor:item_in_slot(3) local outfit_in_slot=db.actor:item_in_slot(7) local helm_in_slot=db.actor:item_in_slot(12) --Коллбеки if item_name=="medkit_ai2" then --При использовании аптечки run_gui(ui_gui_elements.ui_medkit_ai2()) --Запускаем Gui end end
Откроем bind_stalker.script и в функцию actor_binder:use_inventory_item(obj) перед последним end добавим:
Код
if obj~=nil then mod_callbacks.on_use_item(obj) end
Выйдет вот так:
Код
function actor_binder:use_inventory_item(obj) if(obj) then local s_obj = alife():object(obj:id()) if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then xr_effects.disable_ui_only(db.actor, nil) level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback") level.add_pp_effector("surge_fade.ppe", 11, false) give_info("anabiotic_in_process") _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") end end if obj~=nil then mod_callbacks.on_use_item(obj) end end
Все! Тестируем.
Смотрим результат
Возможно, дизайн у окошка простенький, но зато мы умеем делать инвентарный Gui-комплекс! Причем, достаточно сложный. Кроме того, делали наполнение как можно более реалистичным. Вообщем, я надеюсь, что урок вам понравился, а информация оказалась полезной.
Всем большое спасибо за внимание!
Сообщение отредактировал FantomICW - Среда, 14.08.2013, 17:00
Можно, но опять же, там могут быть другие названия всяких Gui-функций. И не помню, есть ли там кнопка ui_inGame_2_big_button. Кроме того, нужно будет в bind_stalker.script добавлять функцию инициализации коллбеков на использование предметов. Об этом - в прошлом уроке. AzzzA, это ведь только пример) Да хоть кейс с бомбами) Текстуру окна только сделать соответственную, чтоб смотрелось)
Цитата (AzzzA)
Если из аптечки кое-что не взял,она всё равно пропадёт?
Пропадет при закрытие, только если все предметы взяты. Там пять инфопорций проверку делают. На движок, конечно, небольшая нагрузка еще дается, но не думаю, что это очень страшно для баланса
Добавлено (14.08.2013, 17:38) --------------------------------------------- Думаю сделать еще парочку уроков, где будет рассматриваться конкретно Гуи...Но это уже когда отдохну немного.
Сообщение отредактировал FantomICW - Среда, 14.08.2013, 17:35
Только есть один вопросик (возможно глупый). Если я взял нужный медикамент, затем нажал кнопку "Выход", то если я опять использую аптечку - взятых мной медикаментов не будет?
Wo1fRam, спасибо) Именно те предметы, которые ты уже взял, взять еще раз в этой текущей аптечке будет не возможно. Все остальные будут. Опять же, смотри, что у нас есть в скрипте:
Код
function ui_medkit_ai2:OnButton_cystamine_clicked() --Функция коллбека кнопки взятия цистамина db.actor:give_info_portion("gui_medkit_got_cystamine") --Инфопорция give_object_to_actor("antirad_cystamine", 6) --Выдаем цистамин self.button_cystamine:Enable(false) --После этих действий кнопка больше не работает end
При нажатии на кнопку цистамина, выдается цистамин в кол-ве 6 штук. Кроме того, выдается инфопорция:
self.button_cystamine:Enable(false) --После этих действий кнопка больше не работает
А на кнопке закрытия всей аптечки есть проверка: если остались не взятые медикаменты, то при закрытии аптечка выдается обратно, а состояние сохраняется. А если все взято (есть все 5 инфопорций), то при закрытии аптечка обратно не выдается, инфопорции дизейблятся и, так сказать, настройки аптечки сбрасываются по умолчанию.
Сообщение отредактировал FantomICW - Четверг, 15.08.2013, 00:32