Shredder 49 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 прежде чем кидаться репликами, самому проверить на практике...Проверено и не раз, не работает. Я прекрасно знаю, что такое замыкание. В твоём примере на каждую кнопку навешан свой обработчик: function() self:OnBtnClick(id) end. В момент вызова будет фактически выполнен код self:OnBtnClick(id), но к тому моменту переменная id будет содержать последнее значение цикла. Замыкается переменная, а не её значение. Ссылка на комментарий
Artos 99 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 (изменено) Shredder, прекрати гнать пургу... и если у тебя(!) не работает - то совет уже дан - учи матчасть. И удивляет даже не то, что рабочий код у тебя не работает, или то, что предложенный тобою - испражнение, а то, что даже суть установки коллбэка тобою извращается. Толкуя об одном и том же, ты напрочь не видишь, что тоже самое и в предлагаемом тобою коде, т.е. тот же самый динамический id точно так же запоминается в каждой функции loadstring, только в виде строки. Отчего же такая (само)уверенность, что этот id не замыкается в устанавливаемом обработчике?! Ну а если кидаешься фразами "прекрасно знаю, что такое замыкание", то из дальнейших твоих рассуждений можно сделать вывод - ты даже не удосужился почитать про это... Ну а ставить в метод 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'. Изменено 21 Мая 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Shredder 49 Опубликовано 22 Мая 2013 Поделиться Опубликовано 22 Мая 2013 Признаю, был не прав. Всё от того, что в своё время намучился с подобной ситуацией в javascript, где замыкание работает как раз так, как я описал выше. В lua всё ок. Приношу извинения за дезинформацию. Ссылка на комментарий
mumie 2 Опубликовано 29 Мая 2013 Поделиться Опубликовано 29 Мая 2013 (изменено) Здравствуйте всем, возникла проблемка с худом образовалась, пытаюсь прибиндить в инвентарь показатели объема вещей, но вот не задача, метод который я использую работает в 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 Может существует альтернатива? Заранее очень бладгодарен! Изменено 29 Мая 2013 пользователем mumie Ссылка на комментарий
Viнt@rь 50 Опубликовано 29 Мая 2013 Поделиться Опубликовано 29 Мая 2013 (изменено) mumie, а такого метода и нет в COP, это уже кучу раз обсуждалось/описывалось/всплывало, достаточно заглянуть в lua_help.script(Cop/CS) и увидеть, что он там отсутствует... Альтернатива только одна - X-Ray Extention. В нем есть метод CUIListBox():GetMainInputReceiver(). Изменено 29 Мая 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Malandrinus 615 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 mumie, Может существует альтернатива? Можно попытаться вывести нужный тебе элемент не на самом окне инвентаря, а поверх отдельным окном. Визуально разницы не будет. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
mumie 2 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 (изменено) @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 Изменено 30 Мая 2013 пользователем ColR_iT Ссылка на комментарий
RayTwitty 502 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 (изменено) Вопрос касательно источников света (hanging_lamp). В ТЧ существуют методы отслеживания "смерти" лампочки? Как показали эксперименты, колбек на смерть не пашет (соотв. и установка on_death, ph_on_death в логике тоже), метод alive() тоже ничего не дает, а свойство health в биндере выдает вообще отрицательное значение ._. Может быть кто-нибудь сталкивался с таким и знает решение проблемы? Изменено 30 Мая 2013 пользователем Shadows Ссылка на комментарий
Malandrinus 615 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 Shadows,у лампочек нет ни смерти ни здоровья, поскольку они не живые объекты. "Смерть" лампочки наступает от первого хита, что реализуется движком. Вроде как и колбек на хит работает, хотя сейчас точно не вспомню. Правда это всё в оригинале криво работает. После перезагрузки включается опять и т.д. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Irish Rover 0 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 (изменено) Дублировать вопросы запрещено. Устное предупреждение. ColR_iT Изменено 30 Мая 2013 пользователем ColR_iT Ссылка на комментарий
Viнt@rь 50 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 malandrinus, в случае с ЗП(думаю и не только) добавленный свой элемент поверх движкового окна всегда будет под ним, проверял и кастом статиками и созданием окна(этим не так усердно) в итоге решил все таки использовать метод, получения активного движкового окна, из X-Ray Ext и аттачить к нему свои элементы. GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Malandrinus 615 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 Viнt@rь, проверял и кастом статиками и созданием окна Вероятно активное окно всегда перекрывает другое top-level окно. Ну значит штатными средствами никак, только с расширениями. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Charsi 440 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 В ЧН/ЗП движковое окно открывается на следующем апдейте после изменения флажка в actor_menu.script. Если приаттачить к худу своё окно не сразу, а чуть погодя, то оно окажется поверх движкового. Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Viнt@rь 50 Опубликовано 30 Мая 2013 Поделиться Опубликовано 30 Мая 2013 Charsi, ну я о том и говорил, только методов для получения окна(стандартно) в ЧН/ЗП нет. GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
mumie 2 Опубликовано 31 Мая 2013 Поделиться Опубликовано 31 Мая 2013 @Charsi, А какой промежуток времени должен пройти с момента открытия движкового окна(на примере инвентаря)? И можно ли справиться обычным флажком? Ссылка на комментарий
Charsi 440 Опубликовано 31 Мая 2013 Поделиться Опубликовано 31 Мая 2013 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 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Viнt@rь 50 Опубликовано 31 Мая 2013 Поделиться Опубликовано 31 Мая 2013 (изменено) Charsi, я говорил про level.main_input_receiver(), а AddDialogToRender нечто подобное добавлению обычного кастом статика, в итоге добавленное окно все равно прячется под движковое. И AddDialogToRender не получает движковое окно, и не аттачит к нему свои элементы. Изменено 31 Мая 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
mumie 2 Опубликовано 31 Мая 2013 Поделиться Опубликовано 31 Мая 2013 @Viнt@rь, Ну он и не утверждает обратного, просто я сам уже дня три мучаюсь с CoP'ом, и просто не доходило о вырезанности метода, потом когда залез на форум понял что это не сработает, затем стал пытаться пробовать и мучиться с AddDialogRender и Add(Get)CustomStatic, и так же ничего не выходило( Затем совсем отчаявшись уже написал сюда, и вот дали совсем простой и в тоже время действенный способ. Charsi, премного благодарен) Ссылка на комментарий
RayTwitty 502 Опубликовано 31 Мая 2013 Поделиться Опубликовано 31 Мая 2013 (изменено) а AddDialogToRender нечто подобное добавлению обычного кастом статика, в итоге добавленное окно все равно прячется под движковое. AddDialogToRender как раз таки ставит поверх всего, игнорируя даже движковые окна (торговли, диалога и т.д.). По крайней мере так в ТЧ. Изменено 31 Мая 2013 пользователем Shadows Ссылка на комментарий
АuReN 0 Опубликовано 1 Июня 2013 Поделиться Опубликовано 1 Июня 2013 Всем привет. Можно ли в ТЧ определить координаты курсора мыши? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти