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

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

Нет ли тут подводных камней?

 

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

 

 

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

@-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 не работает.

Поэтому таблицу с переменным количеством аргументов нужно определять самому.

В принципе это можно считать подводным камнем )).
 

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

@Nazgool, в функциях с неявным числом аргументов локальная таблица arg создается автоматически.

Функция bind_member от bind_function по сути ничем не отличается.

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

@Nazgool,

У меня Lua 5.1.5, и то, что я написал робит.

 

"Шаблонность" в Lua зачётная, я блин больше времени убил, пока писал аналог на С++ того, что выше, а то, что ниже :russian_ru:...

 

 

function bind_member(func, inst, ...)
	local arg1 = arg
	return function (...)
	return func(inst, unpack(arg1), unpack(arg))
	end
end

 

 

Такой вопрос, стоит вводить систему "эвентов" ? Вроде же вызовы двиг<->скрипты дорогие, значит надо их минимизировать.

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

я блин больше времени убил, пока писал аналог на С++

Ну ты сравнил динамический и статический языки... Зато на плюсах надежно. Почти, гы.

Такой вопрос, стоит вводить систему "эвентов" ?

Этаж какую? Которую уже реализовали раза 2-3 профи и еще каждый любитель свою запилил? Или что то с движком связанное? Уточняй.

Прости мою придирчивость, но я поправлю, event произносится через И - "ивэнт"/"ивент".

ТЧ 1.0004. SAP и Trans mod

github

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

@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
Ссылка на комментарий

 

 

аналог 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

 

 

:facepalm:

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

Товарищи. Может, конечно, совсем нубский вопрос, но всё же.

Как получить количество строк в табличке?

Ну вот, допустим, есть табличка covers. В ней, соответственно, сложены укрытия на локации, с учетом кондишнов и инфопоршней. Дык вот как, сопсна получить число укрытий, которые там сложены? Подсмотрел, что можно написать #covers, но чегось не взлетает... По крайней мере, в лог не пишет, т.е. nil. Табличка заведомо заполнена. Не, ну можно нагородить конструкцию при заполнении, чтоб считало,но должен же быть способ...

Шаман - СисАдмин

Всяко-разно: для ЧН

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

 

 

но чегось не взлетает... По крайней мере, в лог не пишет, т.е. nil.

Ну, если у тебя Lua не хочет размер таблицы посчитать - видно оно\она на тебя шибко обиделось\лась...

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

 

Оператор # возвращает целое число n, такое, что t[n] не nil, и t[n + 1] равно nil. Другими словами оператор #, возвращает  максимальный индекс непрерывной последовательности ключей от начала массива. Соответственно, для таблицы:

local t = {1, [100] = 2}
print(#t) -- > 1, поскольку t[1] не nil, а t[1 + 1] равно nil.

Для массива, в котором значения хранятся одно за другим, оператор # вернет количество элементов в массиве.

 

 

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

Нужна подсказка по циклам

имеется вот такая конструкция

 

	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 

срабатывает, но  координаты в таблицу не кладутся, т.к. они неверные.

Мож чего невнятно объяснил, скажите, попробую разжевать...

Шаман - СисАдмин

Всяко-разно: для ЧН

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

Потому что у тебя внутри цикла ничего не изменяется

repeat
  pos_new = level.vertex_position(tab_1.level_vertex)
until pos_check(pos_new) == false --Ты проверяешь одно и тоже

tab_1.level_vertex = math.random(1571597) нужно занести внутрь цикла

 

 

Изменено пользователем Shredder
  • Согласен 3
Ссылка на комментарий
Nazgool, в функциях с неявным числом аргументов локальная таблица arg создается автоматически.

Даже обидно как-то. Ну ладно, допустим я этого никогда не знал. И решил проверить.

Написал бы что-то вроде :

function f(...)
    print(arg and arg.n)
end

f(1,2,3)

И в SciTE (читать стандартном lua) действительно увидел бы таблицу 'arg' с тремя полями.

Но вот запустив этот же код в игре (print у меня работает как log), напечатало бы 'nil'

Почему и сказал

Стандартная переменная 'arg' в Lua vs STALKER не работает.

Поэтому таблицу с переменным количеством аргументов нужно определять самому.

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

Никогда не был силён в регулярных выражениях.
Требуется из строки вида, например, «aaa_bbb_ccc_ddd» вытащить подстроку от первого символа и до последнего подчёркивания включительно, то есть «aaa_bbb_ccc_», и присвоить это значение переменной средствами сталкеровского Lua. В строке могут быть буквы, цифры и подчёркивания, больше никаких знаков, регистр любой.
Может кто-нибудь помочь?

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

@Shredder, проще s:match('^(.*_)'), это если грубо, а если конкретно под тз, то так:

s1 = ''
for s in str:gmatch('[^%.%;%,]') do
s1 = s1..s
end

 


Как доделать думаю ясно.

  • Спасибо 1
  • Согласен 1
Ссылка на комментарий

Помощь требуется, однако...

Собственно условия задачки: есть некое кол-во(ну в пределах не более 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

Хотелось-бы подсказку: как оптимально табличку организовать(или она вообще не нужна ?), как ф-цию отображения организовать ?

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

Самое простое это сделать переменную, и обновлять максимальное значение. Либо если хочется таблицей, то таблицей и далее table.max какой-нибудь, то есть сортировка, но тут можно обойтись и без этого.

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...