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, когда в бою.
Другие вопросы по тегам