-StalkMen- 159 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 (изменено) Нет ли тут подводных камней? function bind_function(func,...) return function () return func(unpack(arg)) end end function bind_member(func, inst, ...) return function () return func(inst, unpack(arg)) end end class "test_class" function test_class:__init() printf ("test_class:__init()") end function test_class:test_fun(a, printf ("test_class:test_fun()") printf (a+1) printf (b+1) end function my_test(a, printf (a+1) printf (b+1) end function test() local test_inst = test_class() local f = bind_function(my_test, 10, 20) local f2 = bind_member(test_class.test_fun, test_inst, 10, 20) f() f2() end Изменено 30 Августа 2015 пользователем -StalkMen- Ссылка на комментарий
Nazgool 250 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 (изменено) @-StalkMen-, А чего сразу подводные? Тут надводные Как Lua поймет что такое 'arg' в выражении 'unpack(arg)' ?Сначала нужно эту переменную определить function bind_function(func,...) local arg = {...} return function () return func(unpack(arg)) end end То же самое нужно сделать и в функции 'bind_member' Сразу отвечу на возможный следующий вопрос. Стандартная переменная 'arg' в Lua vs STALKER не работает. Поэтому таблицу с переменным количеством аргументов нужно определять самому. В принципе это можно считать подводным камнем )). Изменено 30 Августа 2015 пользователем Nazgool Ссылка на комментарий
Charsi 440 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 @Nazgool, в функциях с неявным числом аргументов локальная таблица arg создается автоматически. Функция bind_member от bind_function по сути ничем не отличается. Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
-StalkMen- 159 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 (изменено) @Nazgool, У меня Lua 5.1.5, и то, что я написал робит. "Шаблонность" в Lua зачётная, я блин больше времени убил, пока писал аналог на С++ того, что выше, а то, что ниже ... function bind_member(func, inst, ...) local arg1 = arg return function (...) return func(inst, unpack(arg1), unpack(arg)) end end Такой вопрос, стоит вводить систему "эвентов" ? Вроде же вызовы двиг<->скрипты дорогие, значит надо их минимизировать. Изменено 30 Августа 2015 пользователем -StalkMen- Ссылка на комментарий
Desertir 202 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 я блин больше времени убил, пока писал аналог на С++Ну ты сравнил динамический и статический языки... Зато на плюсах надежно. Почти, гы. Такой вопрос, стоит вводить систему "эвентов" ?Этаж какую? Которую уже реализовали раза 2-3 профи и еще каждый любитель свою запилил? Или что то с движком связанное? Уточняй. Прости мою придирчивость, но я поправлю, event произносится через И - "ивэнт"/"ивент". ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
-StalkMen- 159 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 @Desertir, Которую уже Я не так давно снова стал сидеть на Сталкерских форумах, так что не всё знаю. Движок? Определённо! Первое, что приходит в голову, апдейт биндеров. Вообще я это всё начал из-за отсутствия апдейта, нормального, без всяких цепляний к чему-то там. (©мультиплеер)+ Хочетцо модульную систему. Дописал в конфиге строчку, скрипт прописался, куда ему надо. onUpdate = Event() onInitialize = Event() function main() Initialize() Update() end function Initialize() onInitialize:Call() end function Update() while true do onUpdate:Call() wait(1) end end 1 Ссылка на комментарий
-StalkMen- 159 Опубликовано 31 Августа 2015 Поделиться Опубликовано 31 Августа 2015 аналог Sleep (в луа это wait ) Однако function wait(time_to_wait) verify_if_thread_is_running() if (time_to_wait == nil) then coroutine.yield() else local time_to_stop = time_global() + time_to_wait while time_global() <= time_to_stop do coroutine.yield() end end end Ссылка на комментарий
Romz 142 Опубликовано 1 Сентября 2015 Поделиться Опубликовано 1 Сентября 2015 Товарищи. Может, конечно, совсем нубский вопрос, но всё же. Как получить количество строк в табличке? Ну вот, допустим, есть табличка covers. В ней, соответственно, сложены укрытия на локации, с учетом кондишнов и инфопоршней. Дык вот как, сопсна получить число укрытий, которые там сложены? Подсмотрел, что можно написать #covers, но чегось не взлетает... По крайней мере, в лог не пишет, т.е. nil. Табличка заведомо заполнена. Не, ну можно нагородить конструкцию при заполнении, чтоб считало,но должен же быть способ... Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
UnLoaded 313 Опубликовано 1 Сентября 2015 Поделиться Опубликовано 1 Сентября 2015 но чегось не взлетает... По крайней мере, в лог не пишет, т.е. nil. Ну, если у тебя Lua не хочет размер таблицы посчитать - видно оно\она на тебя шибко обиделось\лась... Ссылка на комментарий
Romz 142 Опубликовано 1 Сентября 2015 Поделиться Опубликовано 1 Сентября 2015 чегось не взлетает...Внезапно - взлетело Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
-StalkMen- 159 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 (изменено) Оператор # возвращает целое число n, такое, что t[n] не nil, и t[n + 1] равно nil. Другими словами оператор #, возвращает максимальный индекс непрерывной последовательности ключей от начала массива. Соответственно, для таблицы: local t = {1, [100] = 2}print(#t) -- > 1, поскольку t[1] не nil, а t[1 + 1] равно nil.Для массива, в котором значения хранятся одно за другим, оператор # вернет количество элементов в массиве. Изменено 2 Сентября 2015 пользователем -StalkMen- Ссылка на комментарий
Romz 142 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 Нужна подсказка по циклам имеется вот такая конструкция for _, level_t in pairs(levels) do for i = 1, level_t.count do local tab_1 = {} pos_new= {} tab_1.game_vertex = level_t.game_vertex tab_1.level_vertex = math.random(1571597) repeat pos_new = level.vertex_position(tab_1.level_vertex) until pos_check(pos_new) == false tab_1.x = pos_new.x tab_1.y = pos_new.y tab_1.z = pos_new.z table.insert(items_q, tab_1) end end Функция pos_check возвращает true если pos_new не попадает в некие границы, и false, если попадает. Почему-то repeat / until приводит к бесконечному циклу... Я пробовал ставить и pos_check(pos_new) == true и pos_check(pos_new) ~= true Всегда получаю зависание игры. Или как ещё можно добиться, чтобы итерация не пропала зря. Потому что если сгородить конструкцию pos_new = ... if pos_check (pos_new) == true then ... table.insert end то цикл for i = 1, level_t.count do срабатывает, но координаты в таблицу не кладутся, т.к. они неверные. Мож чего невнятно объяснил, скажите, попробую разжевать... Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Shredder 49 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 (изменено) Потому что у тебя внутри цикла ничего не изменяется repeat pos_new = level.vertex_position(tab_1.level_vertex) until pos_check(pos_new) == false --Ты проверяешь одно и тоже tab_1.level_vertex = math.random(1571597) нужно занести внутрь цикла Изменено 2 Сентября 2015 пользователем Shredder 3 Ссылка на комментарий
Romz 142 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 @Shredder, Блин, точно... Затупил, признаю... Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Nazgool 250 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 (изменено) Nazgool, в функциях с неявным числом аргументов локальная таблица arg создается автоматически. Даже обидно как-то. Ну ладно, допустим я этого никогда не знал. И решил проверить. Написал бы что-то вроде : function f(...) print(arg and arg.n) end f(1,2,3) И в SciTE (читать стандартном lua) действительно увидел бы таблицу 'arg' с тремя полями. Но вот запустив этот же код в игре (print у меня работает как log), напечатало бы 'nil' Почему и сказал Стандартная переменная 'arg' в Lua vs STALKER не работает. Поэтому таблицу с переменным количеством аргументов нужно определять самому. Изменено 2 Сентября 2015 пользователем Nazgool Ссылка на комментарий
Kirgudu 1 217 Опубликовано 4 Сентября 2015 Поделиться Опубликовано 4 Сентября 2015 Никогда не был силён в регулярных выражениях.Требуется из строки вида, например, «aaa_bbb_ccc_ddd» вытащить подстроку от первого символа и до последнего подчёркивания включительно, то есть «aaa_bbb_ccc_», и присвоить это значение переменной средствами сталкеровского Lua. В строке могут быть буквы, цифры и подчёркивания, больше никаких знаков, регистр любой.Может кто-нибудь помочь? Инструмент Ссылка на комментарий
Shredder 49 Опубликовано 4 Сентября 2015 Поделиться Опубликовано 4 Сентября 2015 ^(.*_)[^_]+$ 1 Ссылка на комментарий
Карлан 1 049 Опубликовано 4 Сентября 2015 Поделиться Опубликовано 4 Сентября 2015 @Shredder, проще s:match('^(.*_)'), это если грубо, а если конкретно под тз, то так: s1 = '' for s in str:gmatch('[^%.%;%,]') do s1 = s1..s end Как доделать думаю ясно. 1 1 Ссылка на комментарий
UnLoaded 313 Опубликовано 6 Сентября 2015 Поделиться Опубликовано 6 Сентября 2015 Помощь требуется, однако... Собственно условия задачки: есть некое кол-во(ну в пределах не более 20) биндеров неких объектов, в апдейтах которых вычисляется значение в диапазоне от 0 до 100. Есть ф-ция, которая будет отображать эти значения динамически в виде линейного индикатора(тот-же ProgressBar, к примеру), с условием, что отображать надо на одном индикаторе от 0(если все значения по 0) до самого максимального(если есть 0, 18 и 76 - то отображать 76). Уж извиняйте, не знаю как это грамотными словами обозвать. Пока у меня думалка надумала такой вариант: заносить все значения из апдейтов в табличку. В ф-ции отображения, которую вызывать из этих-же апдейтов, парсить ее как-то так: local value_table = {} function set_pos() local pos = 0 for k, v in pairs(value_table) do if v > pos(или v >= pos ?) then pos = v end end SetProgressPos(pos) end Хотелось-бы подсказку: как оптимально табличку организовать(или она вообще не нужна ?), как ф-цию отображения организовать ? Ссылка на комментарий
Карлан 1 049 Опубликовано 6 Сентября 2015 Поделиться Опубликовано 6 Сентября 2015 Самое простое это сделать переменную, и обновлять максимальное значение. Либо если хочется таблицей, то таблицей и далее table.max какой-нибудь, то есть сортировка, но тут можно обойтись и без этого. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти