Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!

> Помощь по разделу

Сайт 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

Для получения файла надо распаковать игру. Можно скачать, в принципе smile.gif Тут =>>Ссылко<<=
Уроки

Пример создания непися скриптами ЛУА. Автор: меченый(стрелок)
Скриптинг на инсайде



Сообщение отредактировал RayTwitty - 09.06.2018, 20:23


--------------------
нарушение правил п. 7.2
Перейти в начало страницы
 
15 страниц V  « < 12 13 14 15 >  
Начать новую тему
Ответов
1001v
сообщение 11.12.2020, 03:02
Сообщение #262


Доктор Игровых Наук
*******************

Репутация:   1084  
Группа: Участник
Сообщений: 3950
Награды: 6
Регистрация: 24.08.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


RayTwitty, https://0.30000000000000004.com/

Сообщение отредактировал 1001v - 11.12.2020, 03:04


--------------------

Перейти в начало страницы
 
RayTwitty
сообщение 11.12.2020, 05:33
Сообщение #263


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 11.12.2020, 02:18) *
работает отлично в обоих случаях.

А вот в стулкере в отличии от консольной Луа почему-то не сработало.

Поэтому пришлось расчехлить функцию округления с заданной точностью и вручную указывать количество знаков:
Код
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

pardon.gif


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 11.12.2020, 13:14
Сообщение #264


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 11.12.2020, 05:33) *
А вот в стулкере в отличии от консольной Луа почему-то не сработало.

Потому что это дичь и не должно работать. Попробуй свою функцию не на 0.75, а 0.8, например.
Почитай ссылку, которую дали.

Цитата
math.round(value, 2) <= 0.75

Можно нормально же записать в виде value < 0.75 + eps, где eps ты выбрал 0.01.

Зачем тебе вообще проверять на равенство?

Цитата
Возможно в питонском классе внутри происходит тоже самое.

Питоновский класс реализует арифметику на числах с фиксированной точкой. Основан на сишной библиотеке. Можно затащить в луа и будет, как в питоне smile.gif
Перейти в начало страницы
 
RayTwitty
сообщение 11.12.2020, 23:18
Сообщение #265


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 11.12.2020, 13:14) *
Можно нормально же записать в виде value < 0.75 + eps, где eps ты выбрал 0.01.

В реальном коде условие сложнее, есть еще нижняя граница, где нужно уже отнимать eps. В целом, fsimilar из движка ровно это и делает, только нужно изменить функцию на предмет сравнения <= или >=.

Цитата
value < 0.75

У меня шаг 0.05, с таким условием застопорится на 0.7. Можно в константе указать заранее больше, но эта константа может меняться в дальнейшем и не хотелось бы подразумевать в ней некоторые условия и подводные камни.

Цитата(abramcumner @ 11.12.2020, 13:14) *
Потому что это дичь и не должно работать.

Да, я об этом сразу и написал) Просто меня навело на мысль, что стандартный print выводит число с правильной точностью и возможно дело в банальном переводе в строку. Исходники не смотрел, быстрее было в консоли проверить на практике. Выходит, что нет и там скорее всего какой-нибудь format как у меня в round-функции.

Цитата(abramcumner @ 11.12.2020, 13:14) *
Почитай ссылку, которую дали.

Я на основе этой ссылки и других, которые сам нашел, последний пост и написал. Ранее я уже писал про eps, это первое что я и сделал - прибавил и отнял 0.00001.
Вопрос был даже не в этом скорее, а почему в Луа только со второй операции начинает портиться точность.

Сообщение отредактировал RayTwitty - 11.12.2020, 23:24


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 12.12.2020, 02:12
Сообщение #266


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 11.12.2020, 23:18) *
Ранее я уже писал про 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
Перейти в начало страницы
 
RayTwitty
сообщение 12.12.2020, 03:42
Сообщение #267


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 12.12.2020, 02:12) *
Если работает через преобразование в строку, то и с эпсилоном в условиях должен работать.

А не прокатит с эпсилоном в моем случае. Но по другой причине: при изменении прозрачности, у меня вот эта погрешность с каждым шагом увеличивается и если погонять туда-сюда получается лютое смещение - не тысячные, а уже десятые. Я правда не совсем уверен, что это вина чисто Луа, возможно арифметика в сталкерском методе. У меня новый метод для оконных классов, который меняет прозрачность - по сути тот же стандартный SetColor, только устанавливает альфу 0..1 (умножается на 255). При получении соответственно делится. Сама прозрачность устанавливается v:SetOpacity(v:GetOpacity() + step), видимо здесь накапливается погрешность.
Всё это удалось решить с помощью math.round на каждом шаге (заодно, оно же решило вопрос при сравнении с границами).

Если делать совсем по красоте, то надо тащить питоновский класс))

Сообщение отредактировал RayTwitty - 12.12.2020, 03:44


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 12.12.2020, 15:27
Сообщение #268


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 12.12.2020, 03:42) *
Сама прозрачность устанавливается v:SetOpacity(v:GetOpacity() + step), видимо здесь накапливается погрешность.

Ну пусть здесь "копится погрешность", но по-прежнему непонятно в чем проблема. Похоже ты делаешь какое-то анимирование(типа проявляешь окно). Пусть у тебя на каком-то шаге(хотя по расчетам должно было сработать) не сработало условие value >= 0.75, потому что value = 0.7499999, ну так сработает на следующем. Будет 0.799999999. Это так принципиально?

Или можно делать по шагам. Посчитал, что прозрачность нужно изменить за 5 итераций, ну и сделал 5 итераций. В конце можно установить прозрачность на то значение, которое требуется.
Перейти в начало страницы
 
RayTwitty
сообщение 12.12.2020, 16:41
Сообщение #269


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 12.12.2020, 15:27) *
Ну пусть здесь "копится погрешность", но по-прежнему непонятно в чем проблема.

Было две разных проблемы:
1) Сравнение с пределом (константой 0.75). Лечится эпсилоном к константе или math.round к value.
2) Проблема с прозрачностью, выше пост. Скорее всего внутридвижковая проблема сталкера, лечится math.round на каждом шаге.

Цитата(abramcumner @ 12.12.2020, 15:27) *
Или можно делать по шагам.

По шагам, по сути, я тоже делал но там именно накапливается погрешность. К примеру первые 10 раз получается от 0.25 до 0.74, потом вернулись на 10 назад, получили не 0.25, а уже 0.24 и т.д. Так нижний предел я легко сместил до 0.1 вообще biggrin.gif Видимо где-то, что-то округляется, в Луа или в движке при делении/умножении хз. 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


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 14.12.2020, 22:58
Сообщение #270


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 12.12.2020, 16:41) *
А могут быть потери при переводе float -> u32? У меня прозрачность float от 0 до 1, а альфа текстуры задается целым числом от 0 до 255:
alpha = u32(opacity*255.f)
соответственно геттер обратно преобразует u32 -> float.
opacity = float(alpha)/255.f

Да, конечно. К тому же здесь ты переводишь не в u32, а в u8 по сути.
Перейти в начало страницы
 
RayTwitty
сообщение 14.12.2020, 23:29
Сообщение #271


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


abramcumner, исправить никак нельзя? Или только переписывать весь код цвета на один формат?


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 14.12.2020, 23:33
Сообщение #272


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Вот так в цикле не писать "v:SetOpacity(v:GetOpacity() + step)" и все. В начале сделать
local opacity = v:GetOpacity()
и работать уже с переменной opacity.
Перейти в начало страницы
 
RayTwitty
сообщение 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


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 15.12.2020, 12:23
Сообщение #274


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 14.12.2020, 23:55) *
Но если с типами в движке ничего замутить нельзя (и без переписывания целиком управления цветом), тогда ладно.

Можно перевести SetOpacity/GetOpacity на работу с диапазоном 0-255, а не 0..1. Тогда вообще все должно круто работать.
Перейти в начало страницы
 
RayTwitty
сообщение 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


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 10.01.2021, 03:18
Сообщение #276


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Modulo with ofset biggrin.gif

Цитата
The modulo with offset a modd n is implemented in Mathematica as[16] Mod[a, n, d].

Думаю и для луа сойдет math.fmod с тремя аргументами.
Перейти в начало страницы
 
RayTwitty
сообщение 11.01.2021, 01:15
Сообщение #277


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


abramcumner, а там разве не со смещением? Например, когда то, насколько превысили max, прибавляется к min? В моем случае, при превышении max всегда будет на выходе min, то есть по смыслу (применения) функция как раз ближе к clamp-у.

Вот кстати 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


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 11.01.2021, 02:14
Сообщение #278


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


RayTwitty, со смещением. В твоем iclamp по идее тоже превышение прибавляется к min.
На мой взгляд все три функции делают одно и то же. Название wrap лучше и привычнее.
Перейти в начало страницы
 
RayTwitty
сообщение 11.01.2021, 02:42
Сообщение #279


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 11.01.2021, 02:14) *
В твоем iclamp по идее тоже превышение прибавляется к min.

Нет, при превышении max результат будет равен min, при принижении(? biggrin.gif ) min результат будет равен max. wrap тоже самое, только учитывает смещение.

В общем я понял, что в принципе, можно называть как угодно biggrin.gif Видимо мой случай часто делают просто условиями по месту и не парятся с отдельными функциями.


--------------------
Перейти в начало страницы
 
RayTwitty
сообщение 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)

то звук будет играть как бы чуть на расстоянии?
Может у кого есть хорошие наушники чтобы проверить? Я на колонках разницы вообще не слышу.

На всякий случай: https://xray-engine.org/index.php?title=Класс_sound_object

Сообщение отредактировал RayTwitty - 12.01.2021, 23:56


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 13.01.2021, 00:05
Сообщение #281


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(RayTwitty @ 12.01.2021, 22:54) *
Код
sound_object("zvuk"):play_no_feedback(db.actor, sound_object.s2d, 0, vector():set(0,0,1), 1.0)

то звук будет играть как бы чуть на расстоянии?

sound_object.s2d должен игнорировать настройки расстояния и просто играть, как будто ты звук в медиаплеере слушаешь.
Перейти в начало страницы
 

15 страниц V  « < 12 13 14 15 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 23.04.2024, 15:45