-StalkMen- 159 Опубликовано 28 Августа 2015 Кто-нибудь сталкивался с Луа потоками, приостановкой потоков и тп.? Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 28 Августа 2015 @Nazgool, Тепло, но я не совсем про это. if( l_tpIniFile->section_exist( type_name() ) ) if (l_tpIniFile->r_string(type_name(),"script")) ai().script_engine().add_script_process(ScriptEngine::eScriptProcessorGame,xr_new<CScriptProcess>("game",l_tpIniFile->r_string(type_name(),"script"))); else ai().script_engine().add_script_process(ScriptEngine::eScriptProcessorGame,xr_new<CScriptProcess>("game","")); А про это... Вроде как это сломано, но я починил, выпилив JIT и обновив луа. Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 28 Августа 2015 (изменено) @Nazgool, Там суть в создании новых Lua_State'ов, которые движок каждый апдейт пинает (resume), но только если они ещё не завершены. Я собственно искал аналог Sleep (в луа это wait ) , чтоб приостановить луашный поток. Те можно изобразить что-то вроде такого function main() local m_surge_manager = surge_manager.get_surge_manager() m_surge_manager:initialize() while true do m_surge_manager:update() wait(10000) end end Причём таймер работает как надо, раньше времени поток не продолжится.Вроде в ТЧ или ЧН ПЫС использовали это [single] script = ;level_weathers Теперь погода перенесена на биндер актера и апдейтится оттуда. Потоковый скрипт убран. Изменено 28 Августа 2015 пользователем -StalkMen- Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 29 Августа 2015 @Карлан, Уже ничего не надо Ответ на мой вопрос - аналог Sleep (в луа это wait ) Просто интересно, пользовался ли кто таким. (Это не связано coroutine) Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 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- Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 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- Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 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 аналог 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 Поделиться этим сообщением Ссылка на сообщение
-StalkMen- 159 Опубликовано 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- Поделиться этим сообщением Ссылка на сообщение