Lua游戏开发,每次交互后表似乎都会删除自己

时间:2018-08-15 15:54:11

标签: list lua lua-table

我想做的是一个小插件,它可以让我知道我在战斗中花费了多少时间,以%为单位,

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 个答案:

答案 0 :(得分:0)

您说您是Lua的新手,所以我将尝试详细解释什么地方出了问题以及如何加以改进,因此请您认真阅读。

我假设您的函数将在游戏的每个帧/步骤/刻度/任何您想调用的地方被调用。由于您在函数的开头设置了sum = 0casting = {},因此每次都会调用此函数。这就是为什么总是总是得到0或1的原因。

抢救价值更高!

Lua有一个很好的东西,叫做词法作用域。我不会赘述,但基本思想是:如果在定义函数时访问变量(在范围内),则该函数会记住该变量,无论在何处调用它。例如:

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.

将其应用于您的情况,从一次调用到下一次调用需要保持哪些值?

  • 在战斗中花费的滴答声次数
  • 投放的of子数量

在函数的外部中定义这两个值,并根据需要递增/读取/重置它们;它会在重复调用函数之间持续存在。

注意事项:

  • 您需要在玩家不再施放和/或参加战斗时重置这些计数器,否则它们将继续从中断的地方继续。
  • casting不必是表格。表与整数相比要慢一些,即使重新使用它们也是如此。如果您需要数数,那么数字就绰绰有余。不在战斗中时,只需casting = 0,在战斗中时将其增加1即可。

答案 1 :(得分:0)

感谢大家的反馈,最后在您提出建议和研究后,我的代码看起来像这样,效果很好:

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 fps,多数民众赞成18k输入),我也看不到任何性能问题,这也是为了学习一种新的语言来更好我觉得更难做到

致谢