Назначение скриптам горячих кнопок. Часть 1. Скрипт — S.T.A.L.K.E.R. Inside Wiki

Назначение скриптам горячих кнопок. Часть 1. Скрипт

Материал из S.T.A.L.K.E.R. Inside Wiki

Версия от 22:26, 19 мая 2007; HikeR (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Поизучав мод от камрада Jeppa решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш. Ну это в общем, а пока начнем с запуска своих (или чужих) скриптов из самой игры. (если кто знает ссылку на первоисточник мода jeppa_s_mod__v1.05__incl.vehicles_946, то поставьте ее плиз. я только ссылки на закачку находил)

К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.

Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его ui_cheat.script и положим ко всем остальным скриптам. Вот его содержание:

-- инициализация
class "cheat" (CUIScriptWnd)

function cheat:__init(owner) super()
	self.owner = owner
	self:InitControls()
	self:InitCallBacks()
end

function cheat:__finalize() end

function cheat:InitControls()
-- здесь будут все контролы 
end

function cheat:InitCallBacks()
-- здесь будут все каллбаки (ну или обработчики)
end

-- сразу созадим ф-ию для выхода
function cheat:OnButton_quit_clicked()
-- 
	self:GetHolder():start_stop_menu(self.owner, true)
	self:GetHolder():start_stop_menu(self, true)
	self.owner:Show (false)
end

Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл ui_main_menu.script, идем в самый конец и ищем там такую ф-ию:

function main_menu:OnKeyboard(dik, keyboard_action)

Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в lua_help.script (ищите строку C++ class DIK_keys). Итак, вместо

--	if dik == DIK_keys.DIK_S then
--		self:OnButton_load_spawn()
			
--	else
	if dik == DIK_keys.DIK_Q then
		self:OnMessageQuitWin()
	end

мы напишем

-- раскоментируем и заоодно включим убранное спавн меню 
if	dik == DIK_keys.DIK_S then
	self:OnButton_load_spawn()
elseif 	dik == DIK_keys.DIK_Q then
	self:OnMessageQuitWin()
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_cheat()
elseif 	dik == DIK_keys.DIK_F1 then
	self:OnButton_cheat()
end

То есть при нажатии на S будет вызывать спавн меню, на Q - мгновенный выход из игры, ну а F1 запустит функцию OnButton_cheat(). То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:

function main_menu:OnButton_cheat()
-- если еще ни разу не вызывали, то обозначим наш новый скрипт
	if self.cheat_dlg == nil then
		self.cheat_dlg = ui_cheat.cheat()
		self.cheat_dlg.owner = self
	end
-- останавливаем родительский элемент, запускаем свой, но родителя показываем.
	self:GetHolder():start_stop_menu(self.cheat_dlg, true)
	self:GetHolder():start_stop_menu(self, true)
	self:Show(true)
end

Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу ui_cheat.script и сделаем там обработчик нажатий клавиш. В конец файла допишем:

function cheat:OnKeyboard(dik, keyboard_action)
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
	local console = get_console()
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
-- на выход повесим Esc
		if dik == DIK_keys.DIK_ESCAPE then
-- и запустим уж готовую ф-ию
			self:OnButton_quit_clicked()
-- ну а здесь простая проверка запущена ли игра
-- если запущена, то по выходу убираем главное меню
			if level.present() and (db.actor ~= nil) and db.actor:alive() then
				console:execute("main_menu off")
			end
		end
	end
	return true
end

Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем F1, анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем Esc и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)

Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии.

Продолжение следует... --HikeR 02:26, 20 мая 2007 (MSD)

Другие места
LANGUAGE