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

Язык Lua. Общие вопросы программирования


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

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий
@Struck, только непонятно зачем это шаманство с псевдотестами. Условия совершенно разные, да, дело в "скрытом посыле", но к чему тут время? Операции элементарные, некоторое количество тактов процессора и все. В конкретном случае при value = nil условия проходят одинаково. За такие штуки никто никогда не парится.

ТЧ 1.0004. SAP и Trans mod

github

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

@Desertir, я же написал для наглядности, пусть и время будет, разумеется что оно -> 0, но тем не менее возможно автору вопроса и на это нужен был ответ. 
 

В конкретном случае при value = nil условия проходят одинаково.


Не понял. Ты хочешь еще другие случаи расписать? Удачи :)

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

Переменные в Lua по умолчанию принимают значение nil.

Всё что не false и nil - это true (даже пустая строка).

Поэтому явное сравнение с nil, занимает всё же больше времени, нежели банальная подстановка объекта (он либо true, либо false). Но есть мнение, что это не совсем надёжный случай, т.е. проверка if not nil then не всегда срабатывает (у меня такого никогда не было).

 

local val

local time = os.clock()
for i = 1, 1000000 do
	if not val then
	end
end
print (os.clock() - time)

time = os.clock()
for i = 1, 1000000 do
	if val ~= nil then
	end
end
print (os.clock() - time)
Результат как и предполагалось:
0.046
0.063

 

 

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

Если говорить не о языке вообще, а о вполне конкретном сталкере (и конкретном ТЧ) в частности, то if not var then сработает в случае, если var == nil, var == false, а также, ВНИМАНИЕ, var - результат return без аргумента.

 

if var == nil then сработает  только тогда, когда var действительно == nil.

 

If var then - любое var кроме случая, описанного в п1.

if var == true then - только если var действительно == true.

 

Несколько раз очень забавно нарывался на п1.

  • Не нравится 1
Ссылка на комментарий

ВНИМАНИЕ, var - результат return без аргумента.

а разве return без аргумента - не то же самое что return nil ?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

"return" без аргумента возвращает 0 значений. "return nil" возвращает одно значение, равное nil.

Трактовка возвращаемого значения зависит от конкретного контекста. Пусть будет, например, выше упомянутый type.

print(pcall(type,loadstring"return nil"())) --> true nil
print(pcall(type,loadstring"return"())) --> false bad argument #1 to '?' (value expected)

do
local _type = type
type = function(arg) return arg and _type(arg) or "nil" end
end

print(pcall(type,loadstring"return"())) --> true nil
  • Согласен 1
Ссылка на комментарий
Вроде тут всё уже и сказано, но для новичка, по сути, трудно разобраться.
В принципе проверка if "что-то" then - это булева проверка. И это "что-то" расценивается как булево значение.

Такой вот простенький вопрос:
.....
if not value then....
Для наглядности лучше переформулировать так :
if value then....
Это означает следующее, - "Если (if) значение (value) существует, и оно есть истинна (т.е. по правилам Lua не false и не nil), то данная проверка сработает (then).
 
Что значит - "существует" значение?
 
В Lua есть 8 типов значений.
Не попадающее ни под одно из них и будет "не существующим".
Пример тебе уже показал  Charsi - это возврат из функции без аргументов.
Но...В lua определено одно из восьми значений (обзывается оно - nil), которое указывает на то, что у некой Lua переменной значение "вроде бы и задано", но его пока нет. Типа разметили территорию, а что тут будем строить - разберёмся позже.
Но всё же это уже Lua значение, которое указывает на "не существование" значения.
Оно тоже попадает под определение "не существующего" значения.
 
Итак, мы например определились, что Lua значение существует. Т.е. оно (как уже выяснили) реально есть и не nil.
Т.е. в контексте проверки if "что-то" then - это уже почти "true". Почему почти?
Потому что эта проверка булева. Поэтому остаётся проверить, что "что-то" не является булевым значением "false".
 
Ну а проверки типа if value == "что-то" then.... - это проверки строго на определённый (из 8-ми существующих) тип Lua значений.
Т.е. те типы значений, которые сможет определить функция type(var_type)
Изменено пользователем Nazgool
Ссылка на комментарий

Вопрос. Какие проблемы могут быть (и будут ли?) если в файлах луа-скрипта присутствует текст кириллицы. не в названиях функций или переменных само собой, а к примеру так:

local t = "Текст кириллицей"

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
@Zander_driver, никаких. Строка, она строка и есть, не зависимо от того, какие символы в ней содержатся: кириллица или латиница.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

@naxac, а ты хоть знаешь что такое строка?

Проблема может быть с кодировкой, но никто раньше за такое не запаривался, если будут кракозябры - пробуй ставить Юникод или Вин-1251, что-нибудь такое. Главное поставить ту, в которой эта самая кириллица есть, иначе строка побьется. Можно глянуть в xml файлы с русским текстом, где диалоги или описания вещей.

Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

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

@Zander_driver

А как ты хочешь использовать эту строку?

Если как идентификатор, то сохрани её в переменной, а потом используй как хочешь :

var = 'ключ'
_G[var] = 555
Ссылка на комментарий

@Desertir, конечно знаю. Про кодировки и отображение текста в игре речи не шло, я написал, что в общем проблем не будет)

А так: все скрипты с кириллицей лучше создавать в кодировке windows-1251

Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

@Nazgool, В основном у меня такие вещи для вывода текста на статик. Ну еще бывает с ними перед этим string.format работает.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Уважаемые форумчане, помогите пожалуйста со скриптом. Привожу упрощенный пример гашения отдачи в шутере. Как сделать, чтобы при отпускании кнопки мыши цикл сразу прерывался? Сейчас дашь небольшую очередь, отпускаешь кнопку, а мышь дёргает пока цикл не закончится.

delay = 54 --задержка между выстрелами
x,y = 0,50
EnablePrimaryMouseButtonEvents(true);
function OnEvent(event, arg)

if (event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
Sleep(delay)
MoveMouseRelative(x,y)
Sleep(delay)
MoveMouseRelative(x,y)
Sleep(delay)
MoveMouseRelative(x,y)
Sleep(delay)
MoveMouseRelative(x,y)
Sleep(delay)
MoveMouseRelative(x,y)
Sleep(delay)
MoveMouseRelative(x,y)
end  
end  

Пробовал вариант:

repeat
-- Тело
if not IsMouseButtonPressed(1) then break end

и ему подобные, но либо выдаётся ошибка, либо остановки не происходит. В инете искал информацию, но везде примеры прерывания только с оператором for и введением переменной, как это применить здесь пока не разобрался, удивлён что нет простого решения для игровой мыши.

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

@Solomon753, Всем будет гораздо проще, если вы опишете задачу которую пытаетесь решить.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

@Solomon753, я конечно не особо въехал че тебе надо, но по догадкам вот так:

for i=1,6 do
if (event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
MoveMouseRelative(x,y)
Sleep(delay)
else
break
end
Ссылка на комментарий

@Карлан, нет, это совершенно неверно, это возможно работало бы, если переменные event или arg менялись в другом потоке, но это не так.

Вопрос действительно поставлен неверно и без необходимых пояснений. Ждем автора.


@Solomon753, скорее всего тут тебе не помогут, надо хоть немного знать документацию по твоему случаю. Я бы сделал так, нашел какой нибудь апдейт мышки, сравнивал положение с центром, если различается - сдвигал бы мышь на некоторое постоянное расстояние (ну или для плавности - зависящее от от отклонения, чем меньше осталось до центра, тем меньше значение сдвига). Но так как я не знаю, какими возможностями обладает данный API, возможно этого не получится. А с событием нажатия мышки я так ничего и не понял. Наверное, лучше обратиться на спец форум, если такие в РУнете вообще есть.

Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

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

 

Solomon753, Всем будет гораздо проще, если вы опишете задачу которую пытаетесь решить.

 

 У меня ировая мышка Logitech G500, играю в онлайн-шутер, а именно Warface. У всего оружия есть отдача, эту отдачу хорошо убирают макросы для мышек X7 компании A4tech, там прилагается специальное ПО для этого дела, и макросы писать проще. У лоджитека только консоль на Lua, но тоже народ пишет, только в русскоязычном инете очень мало примеров именно для шутеров.

 

 Теперь к делу. Макрос нужен чтобы при стрельбе из автоматического оружия, после каждой выпущенной пули центр прицела(экрана) возвращался на исходную позицию, т.е. чтобы команды макроса синхронно с выстрелом тянули мышь в противоположное направление отдачи на расстояние увода прицела. Задержки и координаты подобрать опытным путём не сложно, макрос работает. Только проблема в том, что патронов 30 и если дал очередь из 5 и отжал кнопку макрос не останавливается, а дёргает мышь пока не истечёт время вылета всех 30.

 

 Итак задача, чтобы при отжатии левой кнопки мыши мгновенно останавливался цикл компенсации отдачи, а при повторном нажатии начинался сначала. У A4tech подобное прерывание цикла реализовано в ПО, а не в самом макросе, хотелось бы это же реализовать на Lua.

 

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

http://forums.logitech.com/t5/G-series-Gaming-Mice/Help-Regarding-Lua-Mouse-Script-in-LGS/m-p/1331203/highlight/true

 

Вот ещё тщетная попытка остановить цикл с помощью оператора until not , тут он сперва тело завершает, потом по событию останавливается.

http://stackoverflow.com/questions/24578998/game-lua-scripting-using-couroutine-or-polling

 

Я так понимаю нужны операторы либо break, либо AbortMacro, как работать с последним не разобрался, мало примеров нашел. Хотелось бы такое решение, чтобы можно было быстро редактировать смещение мыши для каждой итерации. В крайнем случае хоть какое-то решение уже результат.

 

Ещё появилась следующая идейка: создать переменную принимающую при нажатии кнопки значение A, а при отпускании B, как только она принимает значение B цикл прерывается, а по принятию А выполняется тело. Если такое возможно подскажите как это более грамотно прописать в скрипте.

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

http://www.amk-team.ru/forum/index.php?showtopic=11584&p=896785

Один я тут цикл не вижу?

 


Попробуй:

local delay = 54 -- задержка между выстрелами
local x, y = 0, 50
local LEFT_BTN = 1 -- ЛКМ

EnablePrimaryMouseButtonEvents(true) -- видимо включение событий

function OnEvent(event, arg)
     if event == "MOUSE_BUTTON_PRESSED" and arg == LEFT_BTN then
          while IsMouseButtonPressed(LEFT_BTN) do
               Sleep(delay)
               MoveMouseRelative(x, y)
          end
     end
end
Если я всё правильно наванговал, то должно сработать. Изменено пользователем Shadows
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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