<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=82.207.33.52&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=82.207.33.52&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/82.207.33.52"/>
		<updated>2026-06-14T17:55:58Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2._%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81</id>
		<title>Назначение скриптам горячих кнопок. Часть 2. Интерфейс</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2._%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81"/>
				<updated>2007-05-23T18:39:40Z</updated>
		
		<summary type="html">&lt;p&gt;82.207.33.52: /* Кнопки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Итак, нам вдруг захотелось оформить красиво ранее описанный способ запуска скриптов. Порывшись в текстурах можно подобрать понравившиеся элементы интерфейса. Сейчас попробуем сделать свое окно с рамкой, проигрывающимся видеороликом на заднем плане и несколькими кнопками.&lt;br /&gt;
&lt;br /&gt;
Способ вызова нашего скрипта отстанется прежним, '''Esc - F1''', но вызывать окно можно и из диалогов, и по некоторому событию, вобщем простор для мододелов огромный. Я использовал уже имеющиеся текстуры и элементы управления, но никто не запрещает использовать свои. Для рамки я выбрал текстуру '''ui\ui_dg_inventory''', а кнопки брал из '''ui\ui_common'''.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Будем использовать тот же скрипт '''ui_cheat.script''', но немного видоизмененный. Я приведу его содержание полностью, а потом начнем его дополнять.&lt;br /&gt;
&lt;br /&gt;
Начало:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
-- инициализируем элементы интерфейса и каллбаки&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
	-- здесь определяем координаты левого верхнего угла и ширину-высоту&lt;br /&gt;
	self:Init(50,50,550,450)&lt;br /&gt;
&lt;br /&gt;
	-- файл-описатель наших элементов&lt;br /&gt;
	local xml = CScriptXmlInit()&lt;br /&gt;
	xml:ParseFile(&amp;quot;ui_cheat_wnd.xml&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- видео на заднем плане&lt;br /&gt;
	xml:InitStatic(&amp;quot;back_video&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	-- рамка&lt;br /&gt;
	xml:InitStatic(&amp;quot;background&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	-- кнопки&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_1&amp;quot;, self),&amp;quot;btn_1&amp;quot;)&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_2&amp;quot;, self),&amp;quot;btn_2&amp;quot;)&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_3&amp;quot;, self),&amp;quot;btn_3&amp;quot;)&lt;br /&gt;
	-- кнопка выхода&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_quit&amp;quot;, self),&amp;quot;btn_quit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
	-- тут интерактивные элементы, при определенном действии выполняется заданная ф-ия&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_1&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat1, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_2&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat2, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_3&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat3, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_quit&amp;quot;, ui_events.BUTTON_CLICKED, self.on_quit, self)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Теперь на имеющиеся кнопки прикрутим ф-ии, которые будут что-нибудь делать.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
	-- колдуем СВД&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_svd_m1&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	-- патроны к ней&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_7.62x54_ap&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	-- и того, кого будем из СВД мучать&lt;br /&gt;
	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 30)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:check_game()&lt;br /&gt;
	-- возвращает true если запущена игра&lt;br /&gt;
	local check = false&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		check = true&lt;br /&gt;
	end&lt;br /&gt;
	return check&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	-- убираем наше окно, показываем предыдущее (или возвращаемся в игру)&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
	-- скрытие главного меню только если запущена игра&lt;br /&gt;
	if self:check_game() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	-- спавним только в игре&lt;br /&gt;
	if self:check_game() then&lt;br /&gt;
		self:on_quit()&lt;br /&gt;
		local	pos = db.actor:position()&lt;br /&gt;
		local	dir = db.actor:direction()&lt;br /&gt;
		pos = pos:add(dir:mul(dist))&lt;br /&gt;
		alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скриптовую часть закончили. Теперь надо &amp;quot;нарисовать&amp;quot; интерфейс. Инструмет для его создания пока отсутствует (по крайней мере у нас), поэтому будем делать ручками, методом проб и ошибок.&lt;br /&gt;
&lt;br /&gt;
== XML-описатель ==&lt;br /&gt;
&lt;br /&gt;
Так как мы уже определили файл, который будет содержать расположение элементов (''xml:ParseFile(&amp;quot;ui_cheat_wnd.xml&amp;quot;)''), то создадим его. Полный путь до файла: '''config\ui\ui_cheat_wnd.xml'''.&lt;br /&gt;
&lt;br /&gt;
Вот его содержание:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1251&amp;quot; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cheat&amp;gt;	&lt;br /&gt;
	&amp;lt;back_video x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; width=&amp;quot;380&amp;quot; height=&amp;quot;320&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture&amp;gt;ui\1_hyuv_sq&amp;lt;/texture&amp;gt;&lt;br /&gt;
	&amp;lt;/back_video&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;background x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;340&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;350&amp;quot; height=&amp;quot;460&amp;quot;&amp;gt;ui\ui_dg_inventory&amp;lt;/texture&amp;gt;&lt;br /&gt;
	&amp;lt;/background&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_1 x=&amp;quot;20&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;wpn-svd&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_2 x=&amp;quot;20&amp;quot; y=&amp;quot;60&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Патроны&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_3 x=&amp;quot;20&amp;quot; y=&amp;quot;90&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Собака&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_quit x=&amp;quot;270&amp;quot; y=&amp;quot;300&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_quit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/cheat&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Погружение ==&lt;br /&gt;
&lt;br /&gt;
=== Видео ===&lt;br /&gt;
&lt;br /&gt;
Разберем построчно. Так как ф-ия '''cheat:InitControls()''' сначала отображает видеоролик (чтобы он оказался под всеми элементами, с него и начнем.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;back_video x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; width=&amp;quot;380&amp;quot; height=&amp;quot;320&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Название элемента должно совпадать с именем, которое присутствует в '''xml:InitStatic(&amp;quot;back_video&amp;quot;, self)'''&lt;br /&gt;
&lt;br /&gt;
'''x,y''' - координаты левого верхнего угла относительно объявленного в '''self:Init'''&lt;br /&gt;
&lt;br /&gt;
'''width, height''' - ширина-высота&lt;br /&gt;
&lt;br /&gt;
'''stretch=&amp;quot;1&amp;quot;''' - указывает на необходимость растягивания элемента&lt;br /&gt;
 &amp;lt;texture&amp;gt;ui\1_hyuv_sq&amp;lt;/texture&amp;gt;&lt;br /&gt;
Используется видеоролик находящися по адресу '''textures\ui\1_hyuv_sq.ogm'''. Его исходные размеры - 512х512, поэтому нам и понадобилось растягивание, вернее так называемый стретч.&lt;br /&gt;
 &amp;lt;/back_video&amp;gt;&lt;br /&gt;
конец элемента.&lt;br /&gt;
&lt;br /&gt;
=== Бэкграунд ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;background x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;340&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
координаты, размеры, растягивание, все как и выше&lt;br /&gt;
 &amp;lt;texture x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;350&amp;quot; height=&amp;quot;460&amp;quot;&amp;gt;ui\ui_dg_inventory&amp;lt;/texture&amp;gt;&lt;br /&gt;
а вот здесь ссылка на используемую текстуру. Мы не стали рисовать свою, а взяли уже имеющуюся, поэтому задаваемые здесь координаты и размеры означают, что нужно взять текстуру '''ui\ui_dg_inventory.dds''' и вырезать из нее нужный нам кусок. Обратите внимание, что размеры вырезанной части и определенные нами не совпадают, маловата текстура оказалась, поэтому пришлось ее растягивать ;)&lt;br /&gt;
 &amp;lt;/background&amp;gt;&lt;br /&gt;
конец элемента.&lt;br /&gt;
&lt;br /&gt;
=== Кнопки ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;btn_1 x=&amp;quot;20&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
координаты, размеры, без растягивания, все как и выше. Но, здесь это означает размеры интерактивной области. Если указать иные размеры, то кнопка будет реагировать только в указанной зоне. Если указать нулевые размеры, то кнопка вообще перестанет быть интерактивной.&lt;br /&gt;
 &amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
а вот тут уже интереснее. не пытайтесь искать текстуру с именем ui_button_ordinary_e. Она описана в другом файле, '''config\ui\ui_common.xml'''. Ссылка на этот файл входит в секцию '''[texture_desc]''' в '''system.ltx'''. То есть, если вы создали свой файл-описатель интерфейса, то нужно проставить ссылку на этот файл в вышеописанной секции.&lt;br /&gt;
 &amp;lt;text&amp;gt;wpn-svd&amp;lt;/text&amp;gt;&lt;br /&gt;
текст на кнопке. Здесь тоже не все так просто. Сначала игра ищет выражение '''wpn-svd''' в файлах заданных в секции '''[string_table]''' файла '''localization.ltx''', то есть зависит от установленного языка. В данном случае ссылка на '''wpn-svd''' есть в файле '''config\text\rus\string_table_enc_weapons.xml''', и равно&lt;br /&gt;
 &amp;lt;string id=&amp;quot;wpn-svd&amp;quot;&amp;gt;&amp;lt;text&amp;gt;СВДм 2&amp;lt;/text&amp;gt;&amp;lt;/string&amp;gt;&lt;br /&gt;
При таком способе установки текстового значения мы не будем зависеть от языка игры и сможем создавать не привязанные к языку моды.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на вторую кнопку, то ее текстовой значение равно&lt;br /&gt;
 &amp;lt;text&amp;gt;Патроны&amp;lt;/text&amp;gt;&lt;br /&gt;
Такого значения игра не найдет и просто отобразит так как есть. Но англоязычные пользователи врядли поймут написанное. Поэтому я лично рекомендую использовать уже имеющиеся ресурсы, и минимально вмешиваться в ресурсы и добавлять новые. Но, например, файл с названиями машин ('''string_table_enc_vehicles.xml''') не входит в файл '''localization.ltx''', поэтому придется его туда подключить, либо указать конечному пользователю на необходимость добавления одной строчки в этот файл.&lt;br /&gt;
&lt;br /&gt;
Ну кнопочка &amp;quot;Выход&amp;quot; сделана вот так:&lt;br /&gt;
 &amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Продолжение ==&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем, запускаем игру, жмем '''Esc - F1''', и видим наше окошко. Можно понажимать на кнопки и увидеть что они какие-то неинтерактивные. То есть никак не реагируют на наведение мыши и нажатие. Но это легко поправимо. В игре все для этого есть. Достаточно оформить кнопку вот так (пример для одной, остальные аналогично):&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;btn_quit x=&amp;quot;270&amp;quot; y=&amp;quot;300&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
	&amp;lt;texture_t&amp;gt;ui_button_ordinary_t&amp;lt;/texture_t&amp;gt;&lt;br /&gt;
	&amp;lt;texture_h&amp;gt;ui_button_ordinary_h&amp;lt;/texture_h&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/btn_quit&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Обозначения:&lt;br /&gt;
*texture_e - вид кнопки по умолчанию&lt;br /&gt;
*texture_t - вид кнопки при нажатии&lt;br /&gt;
*texture_h - вид кнопки при наведении мыши&lt;br /&gt;
есть еще одно состояние, '''texture_d''', оно означает текстуру выключенной кнопки. Можно скриптами задавать состояние кнопки (включена-выключена), но об этом в другой раз.&lt;br /&gt;
&lt;br /&gt;
Поизучайте файлик '''ui_common.xml''' на предмет других элементов, там еще много интересного.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[[Bind_script|Первая часть статьи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>82.207.33.52</name></author>	</entry>

	</feed>