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

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


Malandrinus

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

Есть такой вопрос.

В созданном скриптовом классе, на стадии __finalize обязательно следует всем переменным класса присваивать nil или уборщик сам уберет? В примерах смотрел, везде по-разному. Где-то делают, где-то нет.

Поделиться этим сообщением


Ссылка на сообщение

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

Поделиться этим сообщением


Ссылка на сообщение

Оператор while разумное решение, уже думал на этим, только именно к циклу его нужно приделать

while это и есть цикл. Зачем его ещё куда-то приделывать? Код-то тестил, который я выше привел?

Поделиться этим сообщением


Ссылка на сообщение

В API не упоминается что вместо номера кнопки можно переменную поставить

Зато в луа упоминается. Работать не хочет не из-за этого.

 

Выводи в лог на экран что-нибудь (вроде там функция была), проверь вообще идет ли выполнение кода внутри цикла.

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

Поделиться этим сообщением


Ссылка на сообщение

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

Дык синтаксических ошибок нет, чего ему ругаться?

 

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

EnablePrimaryMouseButtonEvents(true)

function OnEvent(event, arg)
     if arg == LEFT_BTN then
          if event == "MOUSE_BUTTON_PRESSED" then
               is_pressed = true
               start_cycle()
          elseif event == "MOUSE_BUTTON_RELEASED" then
               is_pressed = false
          end
     end
end

function start_cycle()
     while is_pressed do
          Sleep(delay)
          MoveMouseRelative(x, y)
     end
end
Пробуй так. Изменено пользователем Shadows

Поделиться этим сообщением


Ссылка на сообщение
@Nazgool, а, ну раз так, значит да, без апдейта или других, постоянно вызывающихся методов, никак не сделать. А их судя по всему нет, если я правильно прочитал тот мануал. Изменено пользователем Shadows

Поделиться этим сообщением


Ссылка на сообщение

Столкнулся с необходимостью сравнить две переменные типа userdata

В сталкере юзердаты так нельзя сравнивать.

 

копаю gui классы из луа и там возникла в этом потребность

Не уверен, что именно это тебе нужно, но попробуй нечто вроде tostring(CUIStatic) == tostring(CUIStatic). Изменено пользователем Shadows

Поделиться этим сообщением


Ссылка на сообщение

Вопрос следующего характера - как в Lua можно грамотно экранировать символ "\"? Чтобы при совпадении с "n" не получался символ перехода на следующую строку ("\n"). Это нужно например в окнах с режимом ComplexMode.

 

Пока сделал такой вариант

string.gsub(s, "\\", "/")
но, наверно можно придумать что-то поизящнее... Изменено пользователем Shadows

Поделиться этим сообщением


Ссылка на сообщение

т.е. есть типа строки yes\no?

Да.

 

если они более менее статичны

Данные не статичны, а постоянно меняются.

 

На самом деле оказалось, что внутри режима ComplexMode, идет поиск символа "\\n". Пробовал заменить его на символ с одним слешем - в итоге в строке его вообще не оказалось. Видимо, остается просто использовать мой первый вариант.

Поделиться этим сообщением


Ссылка на сообщение

@Desertir, да тут наверно уже вопрос не Lua, а чисто сталкерских заморочек и парсинга строки в режиме ComplexMode.

http://www.lua.org/cgi-bin/demo
print("vasya\new")
||
\/

vasya
ew

print("vasya\\new")
||
\/

vasya\new

Второй вариант работает нормально в Lua, но в сталкере он также расценивается как перенос на следующую строку. Так что видимо ничего лучше обратного слеша не придумать в моем случае.

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

Поделиться этим сообщением


Ссылка на сообщение

Да также второй вариант печатает и в игре - 'vasya\new'.

В окне (статике) в режиме ComplexMode?

st = CUIStatic()
st:Init(0, 0, 1024, 768)
st:SetText("vasya\\new")
st:SetTextComplexMode(true)
get_hud():AddDialogToRender(st)

Правда стоит lua by RvP. Может и поэтому ???

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

Поделиться этим сообщением


Ссылка на сообщение

Необходимо вызвать функцию для объекта, сама функция сохранена в виде строки, например:

-- обычный вызов
actor:name()

-- то что я хочу
func = "name"
actor:<<func>>()
либо как-то сохранять ссылку на метод без использования строки... Пока наколхозил такое:

function call_string(obj, method, ...)
	local args = {...}
	return loadstring("return function(obj, args) return obj:"..method.."(unpack(args)) end")()(obj, args)
end
возможно ли сделать лучше? Изменено пользователем RayTwitty

Поделиться этим сообщением


Ссылка на сообщение

t = {["A"] = "a", ["B"] = "b", ["C"] = "c", ["D"] = "d"}
for k, v in pairs(t) do
print(k.." "..v)
end
Перебор элементов идет в рандомном порядке, отчего так? Юзать ipairs очень неудобно, так как работает похоже только с числовыми ключами:

t = {[1] = "a", [2] = "b", [3] = "c", [4] = "d"}
for i, v in ipairs(t) do
print(v)
end

Поделиться этим сообщением


Ссылка на сообщение

next, через который работает pairs, не гарантирует никакого порядка.

Ну это-то я читал, вопрос был больше о том, почему так странно реализовано?..

 

Зачем нужен порядок? И чем не угодил ipairs?

На практике у меня там несколько вложенных таблиц, поэтому и порядок обработки важен. Если делать через ipairs, структура таблиц будет крайне убога. Изменено пользователем RayTwitty

Поделиться этим сообщением


Ссылка на сообщение

Может тебя надо получить список ключей и отсортировать их предварительно. А может тебе какая-то другая структура данных нужна.

Причем тут сортировка и другие структуры данных? Я вообще-то уже всё сказал и показал - какая таблица и что надо сделать - последовательно перебрать ключи A,B,C,D в этой таблице.

 

upd:

t = {[1] = {["A"] = "a"}, [2] = {["B"] = "b"}, [3] = {["C"] = "c"}, [4] = {["D"] = "d"}}
for i, tabl in ipairs(t) do
for k, v in pairs(tabl) do
print(k.." "..v)
end
end
Если только так, но выглядит ужасно. Изменено пользователем RayTwitty

Поделиться этим сообщением


Ссылка на сообщение

@Charsi, с A,B,C,D конечно работает, но название ключей в реальности могут быть какие угодно, поэтому сортировка может изменить порядок.

 

Детальный разбор вопроса показал, что сделать нормально никак нельзя. Если бы ключ был объектом или таблицей, в котором лежал бы его номер, тогда наверно и pairs работал нормально, а ipairs вообще стал не нужен:

local t = {sequence = {"first", "123", "qwerty"}, ["first"] = 2332, ["123"] = "rutr", ["qwerty"] = 999}
for i, v in ipairs(t.sequence) do
	print(v, t[v])
end
Изменено пользователем RayTwitty

Поделиться этим сообщением


Ссылка на сообщение

Если ключ это объект или таблица, то в table.sort вторым аргументом можно передать функцию, реализующую упорядочивание таких ключей.

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

Поделиться этим сообщением


Ссылка на сообщение

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

function clamp(n, min, max)
	if n < min then
		return max
	elseif n > max then
		return min
	else
		return n
	end
end
Пока обозвал clamp, но обычно clamp это запрет выхода за диапазон, а у меня значение идет по кругу. Не хочется путаться в дальнейшем с названиями.

Поделиться этим сообщением


Ссылка на сообщение
13.05.2024 в 05:48, Zander_driver сказал:

Были ли они в оригинальном движке ТЧ, честно говоря не помню. Если были, то их должно быть возможно найти тут.

Только для мировой модели объекта - play_cycle. В случае с НПС/монстрами play_cycle практически бесполезен, так как перебивается движком или другими скриптовыми схемами. Подходит по сути только для неживых объектов.

Для худа оружия (hud_item) проиграть анимацию на оригинальном движке нельзя.

  • Нравится 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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