Скрипты |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
Скрипты |
13.07.2009, 11:34
Сообщение
#261
|
|
Навий черны у ношьти Репутация: 377 Группа: Забанен Сообщений: 2210 Регистрация: 11.03.2009 |
FAQ Lua в X-Ray Список всех функций, переменных, классов и т.п. что используются в Сталкере находится по адресу: Код gamedata/scripts/lua_help.script Для получения файла надо распаковать игру. Можно скачать, в принципе Тут =>> Уроки Сообщение отредактировал RayTwitty - 09.06.2018, 20:23 -------------------- нарушение правил п. 7.2
|
 
|
|
|
|
11.12.2020, 03:02
Сообщение
#262
|
|
Доктор Игровых Наук Репутация: 1084 Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
-------------------- |
 
|
|
11.12.2020, 05:33
Сообщение
#263
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
работает отлично в обоих случаях. А вот в стулкере в отличии от консольной Луа почему-то не сработало. Поэтому пришлось расчехлить функцию округления с заданной точностью и вручную указывать количество знаков: Код function math.round(n, exactness) return tonumber(string.format("%."..(exactness or 0).."f", n)) end local value = 0.65 value = value + 0.05 value = value + 0.05 print(value) --> 0.75 if math.round(value, 2) <= 0.75 then print("YES") else print("NO") end --> YES -------------------- |
 
|
|
11.12.2020, 13:14
Сообщение
#264
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
А вот в стулкере в отличии от консольной Луа почему-то не сработало. Потому что это дичь и не должно работать. Попробуй свою функцию не на 0.75, а 0.8, например. Почитай ссылку, которую дали. Цитата math.round(value, 2) <= 0.75 Можно нормально же записать в виде value < 0.75 + eps, где eps ты выбрал 0.01. Зачем тебе вообще проверять на равенство? Цитата Возможно в питонском классе внутри происходит тоже самое. Питоновский класс реализует арифметику на числах с фиксированной точкой. Основан на |
 
|
|
11.12.2020, 23:18
Сообщение
#265
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Можно нормально же записать в виде value < 0.75 + eps, где eps ты выбрал 0.01. В реальном коде условие сложнее, есть еще нижняя граница, где нужно уже отнимать eps. В целом, fsimilar из движка ровно это и делает, только нужно изменить функцию на предмет сравнения <= или >=. Цитата value < 0.75 У меня шаг 0.05, с таким условием застопорится на 0.7. Можно в константе указать заранее больше, но эта константа может меняться в дальнейшем и не хотелось бы подразумевать в ней некоторые условия и подводные камни. Потому что это дичь и не должно работать. Да, я об этом сразу и написал) Просто меня навело на мысль, что стандартный print выводит число с правильной точностью и возможно дело в банальном переводе в строку. Исходники не смотрел, быстрее было в консоли проверить на практике. Выходит, что нет и там скорее всего какой-нибудь format как у меня в round-функции. Почитай ссылку, которую дали. Я на основе этой ссылки и других, которые сам нашел, последний пост и написал. Ранее я уже писал про eps, это первое что я и сделал - прибавил и отнял 0.00001. Вопрос был даже не в этом скорее, а почему в Луа только со второй операции начинает портиться точность. Сообщение отредактировал RayTwitty - 11.12.2020, 23:24 -------------------- |
 
|
|
12.12.2020, 02:12
Сообщение
#266
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Ранее я уже писал про eps, это первое что я и сделал - прибавил и отнял 0.00001. Вопрос был даже не в этом скорее, а почему в Луа только со второй операции начинает портиться точность. Ни число 0.7, ни число 0.05 не могут быть представлены в формате ieee754. Вместо них берутся ближайшие значения. Условно 0.70000000001 и 0.04999999999. Так получается, что в сумме они дают 0.75. А если к 0.650000000001 прибавить два раза по 0.04999999999, то 0.75 не получится. Точность вычислений никуда не девается, она ровно такая же точная Цитата У меня шаг 0.05, с таким условием застопорится на 0.7. Если работает через преобразование в строку, то и с эпсилоном в условиях должен работать. Сообщение отредактировал abramcumner - 12.12.2020, 02:12 |
 
|
|
12.12.2020, 03:42
Сообщение
#267
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Если работает через преобразование в строку, то и с эпсилоном в условиях должен работать. А не прокатит с эпсилоном в моем случае. Но по другой причине: при изменении прозрачности, у меня вот эта погрешность с каждым шагом увеличивается и если погонять туда-сюда получается лютое смещение - не тысячные, а уже десятые. Я правда не совсем уверен, что это вина чисто Луа, возможно арифметика в сталкерском методе. У меня новый метод для оконных классов, который меняет прозрачность - по сути тот же стандартный SetColor, только устанавливает альфу 0..1 (умножается на 255). При получении соответственно делится. Сама прозрачность устанавливается v:SetOpacity(v:GetOpacity() + step), видимо здесь накапливается погрешность. Всё это удалось решить с помощью math.round на каждом шаге (заодно, оно же решило вопрос при сравнении с границами). Если делать совсем по красоте, то надо тащить питоновский класс)) Сообщение отредактировал RayTwitty - 12.12.2020, 03:44 -------------------- |
 
|
|
12.12.2020, 15:27
Сообщение
#268
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Сама прозрачность устанавливается v:SetOpacity(v:GetOpacity() + step), видимо здесь накапливается погрешность. Ну пусть здесь "копится погрешность", но по-прежнему непонятно в чем проблема. Похоже ты делаешь какое-то анимирование(типа проявляешь окно). Пусть у тебя на каком-то шаге(хотя по расчетам должно было сработать) не сработало условие value >= 0.75, потому что value = 0.7499999, ну так сработает на следующем. Будет 0.799999999. Это так принципиально? Или можно делать по шагам. Посчитал, что прозрачность нужно изменить за 5 итераций, ну и сделал 5 итераций. В конце можно установить прозрачность на то значение, которое требуется. |
 
|
|
12.12.2020, 16:41
Сообщение
#269
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Ну пусть здесь "копится погрешность", но по-прежнему непонятно в чем проблема. Было две разных проблемы: 1) Сравнение с пределом (константой 0.75). Лечится эпсилоном к константе или math.round к value. 2) Проблема с прозрачностью, выше пост. Скорее всего внутридвижковая проблема сталкера, лечится math.round на каждом шаге. Или можно делать по шагам. По шагам, по сути, я тоже делал но там именно накапливается погрешность. К примеру первые 10 раз получается от 0.25 до 0.74, потом вернулись на 10 назад, получили не 0.25, а уже 0.24 и т.д. Так нижний предел я легко сместил до 0.1 вообще Видимо где-то, что-то округляется, в Луа или в движке при делении/умножении хз. math.round корректировка на каждом шаге помогла. А могут быть потери при переводе float -> u32? У меня прозрачность float от 0 до 1, а альфа текстуры задается целым числом от 0 до 255: alpha = u32(opacity*255.f) соответственно геттер обратно преобразует u32 -> float. opacity = float(alpha)/255.f Сообщение отредактировал RayTwitty - 13.12.2020, 01:13 -------------------- |
 
|
|
14.12.2020, 22:58
Сообщение
#270
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
А могут быть потери при переводе float -> u32? У меня прозрачность float от 0 до 1, а альфа текстуры задается целым числом от 0 до 255: alpha = u32(opacity*255.f) соответственно геттер обратно преобразует u32 -> float. opacity = float(alpha)/255.f Да, конечно. К тому же здесь ты переводишь не в u32, а в u8 по сути. |
 
|
|
14.12.2020, 23:29
Сообщение
#271
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
abramcumner, исправить никак нельзя? Или только переписывать весь код цвета на один формат?
-------------------- |
 
|
|
14.12.2020, 23:33
Сообщение
#272
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Вот так в цикле не писать "v:SetOpacity(v:GetOpacity() + step)" и все. В начале сделать
local opacity = v:GetOpacity() и работать уже с переменной opacity. |
 
|
|
14.12.2020, 23:55
Сообщение
#273
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
abramcumner, идею понял, только в моем случае все несколько сложнее - окон (статиков) куда больше чем один, у базового окна куча дочерних, для которых я пропорционально тоже меняю прозрачность. В этом случае, придется в таблице хранить текущую прозрачность для каждого из них. В целом, пока выглядит более хлопотнее чем:
Код local normalize_opacity = function(opacity) return math.round(opacity, 2) end for k, v in pairs(windows_collection) do v:SetOpacity(normalize_opacity(v:GetOpacity() + step)) end Но если с типами в движке ничего замутить нельзя (и без переписывания целиком управления цветом), тогда ладно. Сообщение отредактировал RayTwitty - 15.12.2020, 00:15 -------------------- |
 
|
|
15.12.2020, 12:23
Сообщение
#274
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
 
|
|
10.01.2021, 02:00
Сообщение
#275
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Есть функция clamp, которая держит число в рамках диапазона. Стандартная функция и много где используется, в движке сталкера, в вебе (особенно в css) и т.д.
Код function clamp(n, min, max) return n < min and min or n > max and max or n end Есть еще такая функция - по сути тоже самое, что и предыдущее, только если n больше максимального, то возвращается минимальное и наоборот. Для простоты обозвал ее iclamp (inverted clamp). У меня часто используется в разных списках, прокрутках значений, переключении полей TABом и т.д. Код function iclamp(n, min, max) return min + (n - min) % (max - min + 1) end Вопрос - может быть у последней функции есть какое-то общепринятое название? Не сильно важно конечно, но мб кто-то в курсе. Пока оставлю как есть. Сообщение отредактировал RayTwitty - 10.01.2021, 02:02 -------------------- |
 
|
|
10.01.2021, 03:18
Сообщение
#276
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Цитата The modulo with offset a modd n is implemented in Mathematica as[16] Mod[a, n, d]. Думаю и для луа сойдет math.fmod с тремя аргументами. |
 
|
|
11.01.2021, 01:15
Сообщение
#277
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
abramcumner, а там разве не со смещением?
Вот кстати wrap, переписанный с википедии под луа, с включением мин/макса: Код function wrap(x, min, max) x = x - math.floor((x - min) / (max - min + 1)) * (max - min + 1) --[[if x < 0 then x = x + max - min end]] return x end PS условие с проверкой на ноль можно выпилить по идее. Сообщение отредактировал RayTwitty - 11.01.2021, 01:44 -------------------- |
 
|
|
11.01.2021, 02:14
Сообщение
#278
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
RayTwitty, со смещением. В твоем iclamp по идее тоже превышение прибавляется к min.
На мой взгляд все три функции делают одно и то же. Название wrap лучше и привычнее. |
 
|
|
11.01.2021, 02:42
Сообщение
#279
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
В твоем iclamp по идее тоже превышение прибавляется к min. Нет, при превышении max результат будет равен min, при принижении(? ) min результат будет равен max. wrap тоже самое, только учитывает смещение. В общем я понял, что в принципе, можно называть как угодно Видимо мой случай часто делают просто условиями по месту и не парятся с отдельными функциями. -------------------- |
 
|
|
12.01.2021, 22:54
Сообщение
#280
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Следующий код проигрывает звук в голове актора:
Код sound_object("zvuk"):play_no_feedback(db.actor, sound_object.s2d, 0, vector():set(0,0,0), 1.0) меня глючит или если указать вектор vector():set(0,0,1) Код sound_object("zvuk"):play_no_feedback(db.actor, sound_object.s2d, 0, vector():set(0,0,1), 1.0) то звук будет играть как бы чуть на расстоянии? Может у кого есть хорошие наушники чтобы проверить? Я на колонках разницы вообще не слышу. На всякий случай: Сообщение отредактировал RayTwitty - 12.01.2021, 23:56 -------------------- |
 
|
|
13.01.2021, 00:05
Сообщение
#281
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
 
|
|
Текстовая версия | Сейчас: 23.04.2024, 15:45 |