|
|
Строка 5: |
Строка 5: |
| comment3, | | comment3, |
| | | |
− | == Погружение ==
| + | comment3, |
− | | + | |
− | === Видео ===
| + | |
− | | + | |
− | Разберем построчно. Так как ф-ия '''cheat:InitControls()''' сначала отображает видеоролик (чтобы он оказался под всеми элементами, с него и начнем.
| + | |
− | | + | |
− | <code xml><back_video x="10" y="10" width="380" height="320" stretch="1"></code>
| + | |
− | Название элемента должно совпадать с именем, которое присутствует в '''xml:InitStatic("back_video", self)'''
| + | |
− | | + | |
− | '''x,y''' - координаты левого верхнего угла относительно объявленного в '''self:Init'''
| + | |
− | | + | |
− | '''width, height''' - ширина-высота
| + | |
− | | + | |
− | '''stretch="1"''' - указывает на необходимость растягивания элемента
| + | |
− | <code xml><texture>ui\1_hyuv_sq</texture></code>
| + | |
− | Используется видеоролик находящися по адресу '''textures\ui\1_hyuv_sq.ogm'''. Его исходные размеры - 512х512, поэтому нам и понадобилось растягивание, вернее так называемый стретч.
| + | |
− | <code xml></back_video></code>
| + | |
− | конец элемента.
| + | |
− | | + | |
− | === Бэкграунд ===
| + | |
− | | + | |
− | <code xml><background x="0" y="0" width="400" height="340" stretch="1"></code>
| + | |
− | координаты, размеры, растягивание, все как и выше
| + | |
− | <code xml><texture x="0" y="0" width="350" height="460">ui\ui_dg_inventory</texture></code>
| + | |
− | а вот здесь ссылка на используемую текстуру. Мы не стали рисовать свою, а взяли уже имеющуюся, поэтому задаваемые здесь координаты и размеры означают, что нужно взять текстуру '''ui\ui_dg_inventory.dds''' и вырезать из нее нужный нам кусок. Обратите внимание, что размеры вырезанной части и определенные нами не совпадают, маловата текстура оказалась, поэтому пришлось ее растягивать ;)
| + | |
− | <code xml></background></code>
| + | |
− | конец элемента.
| + | |
− | | + | |
− | === Кнопки ===
| + | |
− | | + | |
− | <code xml><btn_1 x="20" y="30" width="117" height="29"></code>
| + | |
− | координаты, размеры, без растягивания, все как и выше. Но, здесь это означает размеры интерактивной области. Если указать иные размеры, то кнопка будет реагировать только в указанной зоне. Если указать нулевые размеры, то кнопка вообще перестанет быть интерактивной.
| + | |
− | <code xml><texture_e>ui_button_ordinary_e</texture_e></code>
| + | |
− | а вот тут уже интереснее. не пытайтесь искать текстуру с именем ui_button_ordinary_e. Она описана в другом файле, '''config\ui\ui_common.xml'''. Ссылка на этот файл входит в секцию '''[texture_desc]''' в '''system.ltx'''. То есть, если вы создали свой файл-описатель интерфейса, то нужно проставить ссылку на этот файл в вышеописанной секции.
| + | |
− | <code xml><text>wpn-svd</text></code>
| + | |
− | текст на кнопке. Здесь тоже не все так просто. Сначала игра ищет выражение '''wpn-svd''' в файлах заданных в секции '''[string_table]''' файла '''localization.ltx''', то есть зависит от установленного языка. В данном случае ссылка на '''wpn-svd''' есть в файле '''config\text\rus\string_table_enc_weapons.xml''', и равно
| + | |
− | <code xml><string id="wpn-svd"><text>СВДм 2</text></string></code>
| + | |
− | При таком способе установки текстового значения мы не будем зависеть от языка игры и сможем создавать не привязанные к языку моды.
| + | |
− | | + | |
− | Если посмотреть на вторую кнопку, то ее текстовое значение равно
| + | |
− | <code xml><text>Патроны</text></code>
| + | |
− | Такого значения игра не найдет и просто отобразит так как есть. Но англоязычные пользователи врядли поймут написанное. Поэтому я лично рекомендую использовать уже имеющиеся ресурсы, и минимально вмешиваться в ресурсы и добавлять новые. Но, например, файл с названиями машин ('''string_table_enc_vehicles.xml''') не входит в файл '''localization.ltx''', поэтому придется его туда подключить, либо указать конечному пользователю на необходимость добавления одной строчки в этот файл.
| + | |
− | | + | |
− | Ну кнопочка "Выход" сделана вот так:
| + | |
− | <code xml><text>ui_inv_exit</text></code>
| + | |
| | | |
| == Продолжение == | | == Продолжение == |
Версия 11:03, 20 мая 2011
j0OX1t <a href="http://otapzoymuafm.com/">otapzoymuafm</a>, [url=http://judmjyxpqlho.com/]judmjyxpqlho[/url], [link=http://pztbpcdsiylc.com/]pztbpcdsiylc[/link], http://khpxronummza.com/
comment3,
comment3,
comment3,
Продолжение
Все. Сохраняем, запускаем игру, жмем Esc - F1, и видим наше окошко. Можно понажимать на кнопки и увидеть что они какие-то неинтерактивные. То есть никак не реагируют на наведение мыши и нажатие. Но это легко поправимо. В игре все для этого есть. Достаточно оформить кнопку вот так (пример для одной, остальные аналогично):
<btn_quit x="270" y="300" width="117" height="29">
<texture_e>ui_button_ordinary_e</texture_e>
<texture_t>ui_button_ordinary_t</texture_t>
<texture_h>ui_button_ordinary_h</texture_h>
<text>ui_inv_exit</text>
</btn_quit>
Обозначения:
- texture_e - вид кнопки по умолчанию
- texture_t - вид кнопки при нажатии
- texture_h - вид кнопки при наведении мыши
есть еще одно состояние, texture_d, оно означает текстуру выключенной кнопки. Можно скриптами задавать состояние кнопки (включена-выключена), но об этом в другой раз.
Поизучайте файлик ui_common.xml на предмет других элементов, там еще много интересного.
Внимание
Так как скрипт спавна изменен по сравнению с первой статьей (добавлен вызов self:on_quit() перед самим спавном), то функцию привязки к клавишам следует оформить следующим образом:
function cheat:OnKeyboard(dik, keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
-- отсюда убран вызов self:on_quit()
if dik == DIK_keys.DIK_ESCAPE then self:on_quit()
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()
elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()
elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()
elseif dik == DIK_keys.DIK_NUMPAD5 then self:cheat5()
elseif dik == DIK_keys.DIK_NUMPAD6 then self:cheat6()
elseif dik == DIK_keys.DIK_NUMPAD7 then self:cheat7()
elseif dik == DIK_keys.DIK_NUMPAD8 then self:cheat8()
elseif dik == DIK_keys.DIK_NUMPAD9 then self:cheat9()
end
end
return true
end
Ссылки