Перейти к контенту

Рекомендуемые сообщения

прежде чем кидаться репликами, самому проверить на практике...

Проверено и не раз, не работает. Я прекрасно знаю, что такое замыкание. В твоём примере на каждую кнопку навешан свой обработчик: function() self:OnBtnClick(id) end. В момент вызова будет фактически выполнен код self:OnBtnClick(id), но к тому моменту переменная id будет содержать последнее значение цикла. Замыкается переменная, а не её значение.
Ссылка на комментарий

Shredder, прекрати гнать пургу... и если у тебя(!) не работает - то совет уже дан - учи матчасть.  :rtfm:

 

И удивляет даже не то, что рабочий код у тебя не работает, или то, что предложенный тобою - испражнение, а то, что даже суть установки коллбэка тобою извращается.

Толкуя об одном и том же, ты напрочь не видишь, что тоже самое и в предлагаемом тобою коде, т.е. тот же самый динамический id точно так же запоминается в каждой функции loadstring, только в виде строки. Отчего же такая (само)уверенность, что этот id не замыкается в устанавливаемом обработчике?!  :crazy: Ну а если кидаешься фразами "прекрасно знаю, что такое замыкание", то из дальнейших твоих рассуждений можно сделать вывод - ты даже не удосужился почитать про это...

Ну а ставить в метод AddCallback прямой вызов на выполнение функции (в чем ошибка и у Charsi), вместо линка на функцию (или тела функции), говорит о плохом знании общей теории моддинга (в частности по классу CUIScriptWnd), тут прямой путь в топик "Справочник по функциям и классам", освежить знания. Хотя даже в азбуке моддмейкера (lua_help) можно прочесть: 

 

    function AddCallback(string, number, const function<void>&);
    function AddCallback(string, number, const function<void>&, object);


P.S. Справедливости ради, замечу, что "не работать" предложенный выше код (да и любой другой) может по причине ошибки в исходном коде у АuReN'а в строке: self:Register(btn)

Данная строка должна выглядеть так: self:Register(btn, "Button_"..id)

т.е. нужно регистрировать объект под именем, которое соответствует имени при установке коллбэка(!), а не "в общую кучу".

В противном случае, ни один коллбэк не найдет "своей" кнопки, а в классе придется искать кнопки по имени методом 'btn:WindowName'.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Признаю, был не прав. Всё от того, что в своё время намучился с подобной ситуацией в javascript, где замыкание работает как раз так, как я описал выше. В lua всё ок. Приношу извинения за дезинформацию.

Ссылка на комментарий

Здравствуйте всем, возникла проблемка с худом образовалась, пытаюсь прибиндить в инвентарь показатели объема вещей, но вот не задача, метод который я использую работает в SoC но ругается в CoP, говорит что не знает что такое level.main_input_receiver()

local btn=nil
local uWnd
function Init()
       uWnd = level.main_input_receiver()
if btn or not uWnd then return end
        
		local iPosX, iPosY=432, 285
		btn = CUIStatic()
		btn:Init(iPosX, iPosY, 150, 40)
		btn:InitTexture("ui\\ui_button_02")
		btn:SetAutoDelete(false)
	    uWnd:AttachChild(btn)
		btn:SetText("Vol 0.0 / 0.0")
		btn:SetTextAlign(0)
		btn:SetTextX(5)
		btn:SetTextY(10)
	    btn:SetFont(GetFontGraffiti22Russian())
	    btn:SetTextColor(255,231,153,22)
		ShowVolume()
 
end 
 
 
function ShowVolume()
local vol_M = 30 --Для теста я написал значения от балды, просто чтобы проверить вывод формата чисел
local vol_c = 31 --Впоследствии создам класс для подсчета объема всех предметов
    if btn then
	
	local a,r,g, b = 255,231,153,22

	local txt 
	if  (vol_c >=vol_M ) then
		a,r,g, b = 255, 255, 0, 0
    end
	txt = string.format("Vol %.2f / %.1f", vol_c, vol_M)
    btn:SetTextColor(a,r,g,
	btn:SetText(txt)
   end
end

function HideVolume()
    if btn and uWnd then
        uWnd:DetachChild(btn)
		btn = nil
		uWnd = nil
	end
end
 

 

 

Может существует альтернатива? Заранее очень бладгодарен!

Изменено пользователем mumie
Ссылка на комментарий

mumie, а такого метода и нет в COP, это уже кучу раз обсуждалось/описывалось/всплывало, достаточно заглянуть в lua_help.script(Cop/CS) и увидеть, что он там отсутствует... Альтернатива только одна - X-Ray Extention. В нем есть метод CUIListBox():GetMainInputReceiver().

Изменено пользователем Viнt@rь
Ссылка на комментарий

mumie,

Может существует альтернатива?

Можно попытаться вывести нужный тебе элемент не на самом окне инвентаря, а поверх отдельным окном. Визуально разницы не будет.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

@MalandrinusЭто если использовать метод AddDialogToRender и RemoveDialogToRender?

 

@Viнt@rь, Я уже разобрался, когда забрел в тему Справочника по функциям и классам, но когда я путешествовал по луа_хелп, я как раз таки нашел все эти методы. Извините может я что то путаю, но вот:

Это из моего S.T.A.L.K.E.R. CoP:  

C++ class CUIStatic : CUIWindow {
    CUIStatic ();    
    function SetWindowName(string);
    function GetWndPos(CUIWindow*);
    function TextControl();
    function SetAutoDelete(boolean);
    function GetTextureRect();
    function AttachChild(CUIWindow*);
    function SetStretchTexture(boolean);
    function SetWndPos(vector2);
    function SetTextureRect(Frect*);
    function SetWndSize(vector2);
    function DetachChild(CUIWindow*);
    function SetPPMode();
    function WindowName();
    function IsShown();
    function SetWndRect(Frect);
    function Show(boolean);
    function GetHeight() const;
    function GetWidth() const;
    function InitTexture(string);
    function IsEnabled();
    function ResetPPMode();
    function Enable(boolean);
    function IsAutoDelete();
}; 

 

 

Ну и где ты здесь нашёл метод main_input_receiver?

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Вопрос касательно источников света (hanging_lamp).

В ТЧ существуют методы отслеживания "смерти" лампочки? Как показали эксперименты, колбек на смерть не пашет (соотв. и установка on_death, ph_on_death в логике тоже), метод alive() тоже ничего не дает, а свойство health в биндере выдает вообще отрицательное значение ._.

 

Может быть кто-нибудь сталкивался с таким и знает решение проблемы?

Изменено пользователем Shadows
Ссылка на комментарий

Shadows,
у лампочек нет ни смерти ни здоровья, поскольку они не живые объекты. "Смерть" лампочки наступает от первого хита, что реализуется движком. Вроде как и колбек на хит работает, хотя сейчас точно не вспомню. Правда это всё в оригинале криво работает. После перезагрузки включается опять и т.д.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

malandrinus, в случае с ЗП(думаю и не только) добавленный свой элемент поверх движкового окна всегда будет под ним, проверял и кастом статиками и созданием окна(этим не так усердно) в итоге решил все таки использовать метод, получения активного движкового окна, из X-Ray Ext и аттачить к нему свои элементы.

Ссылка на комментарий

Viнt@rь,

 

проверял и кастом статиками и созданием окна

Вероятно активное окно всегда перекрывает другое top-level окно. Ну значит штатными средствами никак, только с расширениями.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

В ЧН/ЗП движковое окно открывается на следующем апдейте после изменения флажка в actor_menu.script. Если приаттачить к худу своё окно не сразу, а чуть погодя, то оно окажется поверх движкового.

Ссылка на комментарий

Charsi, ну я о том и говорил, только методов для получения окна(стандартно) в ЧН/ЗП нет.

Ссылка на комментарий

@Charsi,  А какой промежуток времени должен пройти с  момента открытия движкового окна(на примере инвентаря)? И можно ли справиться обычным флажком? 

Ссылка на комментарий

Viнt@rь, в ЧН функция есть и работает.
mumie, пару апдейтов нужно подождать.

-- при открытии инвентаря
-- вызываем из actor_manu.inventory_wnd_opened
function on_inv_open()
	local x = 2
	level.add_call(function() x=x-1 return x==0 end,
		function()
			-- пора аттачить своё окно
			get_hud():AddDialogToRender( wnd )
		end)
end

-- при закрытии инвентаря
-- вызываем из actor_manu.inventory_wnd_closed
function on_inv_close()
	get_hud():RemoveDialogToRender( wnd )
end

 

 

Ссылка на комментарий

Charsi, я говорил про level.main_input_receiver(), а AddDialogToRender нечто подобное добавлению обычного кастом статика, в итоге добавленное окно все равно прячется под движковое. И AddDialogToRender не получает движковое окно, и не аттачит к нему свои элементы.

Изменено пользователем Viнt@rь
Ссылка на комментарий

@Viнt@rь, Ну он и не утверждает обратного, просто я сам уже дня три мучаюсь с CoP'ом, и просто не доходило о вырезанности метода, потом когда залез на форум понял что это не сработает, затем стал пытаться пробовать и мучиться с   AddDialogRender и Add(Get)CustomStatic, и так же ничего не выходило( Затем совсем отчаявшись уже написал сюда, и вот дали совсем простой и в тоже время действенный способ. 
Charsi, премного благодарен)

Ссылка на комментарий

а AddDialogToRender нечто подобное добавлению обычного кастом статика, в итоге добавленное окно все равно прячется под движковое.

AddDialogToRender как раз таки ставит поверх всего, игнорируя даже движковые окна (торговли, диалога и т.д.). По крайней мере так в ТЧ. Изменено пользователем Shadows
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...