Lua разработки игр, таблица, кажется, удаляет себя после каждого взаимодействия
Я пытаюсь сделать небольшой аддон, который позволит мне узнать, сколько времени я потратил на чтение во время боя в%,
function()
local spell, _, _, _, _, endTime = UnitCastingInfo("player")
-- getting information from the game itself whether im "Casting"
local inCombat = UnitAffectingCombat("player")
-- getting information form the game if combat is true (1) or not (nil)
local casting = {}
local sum = 0
if inCombat == 1 then
if spell then
table.insert(casting, 1)
else
table.insert(casting, 0)
end
else
for k in pairs (casting) do
casting [k] = nil
end
end
for i=1, #casting, 1 do
sum = sum + casting[i]
end
return( sum / #casting ) end
-- creating a list which adds 1 every frame I am casting and I am in combat,
-- or adds 0 every frame I'm not casting and I'm not in combat.
-- Then I sum all the numbers and divide it by the number of inputs to figure
-- out how much % I have spent "casting".
-- In case the combat condition is false, delete the list
По какой-то причине эти цифры вообще не суммируются, я вижу "1" только тогда, когда оба условия выполнены, или 0, если условие боя выполнено.
Я уверен, что может быть лучший подход, но я немного новичок в lua и программировании в целом.
2 ответа
Спасибо всем за отзывы, в конце концов после ваших предложений и некоторых исследований мой код выглядит следующим образом и прекрасно работает:
function()
local spell, _, _, _, startTime, endTime, _, _, _ = UnitCastingInfo("player")
local inCombat = UnitAffectingCombat("player")
local inLockdown = InCombatLockdown()
local _, duration, _, _ = GetSpellCooldown("Fireball")
casting = casting or {}
local sum = 0
if inCombat == 1 or inLockdown == 1 then
if spell or duration ~= 0 then
casting[#casting+1] = 1
elseif spell == nil or duration == 0 then
casting[#casting+1] = 0
end
else
local next = next
local k = next(casting)
while k ~= nil do
casting[k] = nil
k = next(casting, k)
end
end
for i=1, #casting, 1 do
sum = sum + casting[i]
end
return(("%.1f"):format( (sum / #casting)*100 ).. "%%") end
я заметил, что возникла проблема с перезапуском таблицы в исходном коде:
for k in pairs (casting) do
casting [k] = nil
казалось, что либо там остались одни нули, либо размер таблицы не "уменьшился", я не знаю.
Может быть, intereger будет быстрее, чем таблица, но, честно говоря, я не вижу никаких проблем с производительностью, даже когда таблица становится невероятно большой (5 минут, 60 кадров в секунду, то есть 18 тыс. Входов), а также ради изучения нового языка лучше делать это сложнее кстати на мой взгляд
С уважением
Вы говорите, что вы новичок в Lua, поэтому я постараюсь подробно объяснить, что не так и как это можно улучшить, так что приготовьтесь к долгому чтению.
Я предполагаю, что ваша функция будет вызываться каждый кадр / шаг / тик / все, что вы хотите, чтобы вызвать вашу игру. Так как вы установили sum = 0
а также casting = {}
в начале функции это будет выполняться каждый раз, когда вызывается функция. Вот почему вы всегда получаете 0 или 1 в конце.
Upvalues на помощь!
У Луи есть эта замечательная вещь, называемая лексической областью видимости. Я не буду вдаваться в подробности, но основная идея такова: если переменная доступна (в области видимости) при определении функции, эта функция запоминает эту переменную независимо от того, где она вызывается. Например:
local foo
do
local var = 10
foo = function() return var end
end
print(bar) -- nil
print(foo()) -- 10
Вы также можете назначить новое значение переменной, и в следующий раз, когда вы вызовете функцию, она все равно будет иметь это новое значение. Например, вот простая функция счетчика:
local counter
do
count = 0
counter = function() count = count + 1; return count; end
end
print(counter()) -- 1
print(counter()) -- 2
-- etc.
Применяя это к вашей ситуации, каковы значения, которые должны сохраняться от одного вызова к другому?
- Количество тиков, проведенных в бою
- Количество тиков, потраченных на кастинг
Определите эти два значения вне вашей функции и увеличивайте / читайте / сбрасывайте их по мере необходимости; оно будет сохраняться между повторными вызовами вашей функции.
Что нужно иметь в виду:
- Вам нужно сбросить эти жетоны, когда игрок больше не работает и / или в бою, или они просто продолжат с того места, на котором остановились.
casting
не должен быть столом. Таблицы медленны по сравнению с целыми числами, даже если вы используете их повторно. Если вам нужно посчитать вещи, число более чем достаточно. Просто сделайcasting = 0
когда не в бою и увеличить его на 1, когда в бою.