用一个函数替代多个输入的函数?

3

我试图通过使用一个函数产生多个输出,简化输入,并用于另一个函数。是否有办法做到这一点?我必须为每个输入创建一个返回单个变量的函数吗?

--here is a snippet of what im trying to do (for a game)
--Result is the same for game environment and lua demo.

en = {
box ={x=1,y=2,w=3}
}
sw = {
box = {x=1,y=2,w=3}
}

function en.getbox()
return en.box.x,en.box.y,en.box.w,en.box.w
end

function sw.getbox()
return sw.box.x,sw.box.y,sw.box.w,sw.box.w
end

function sw.getvis()
return true
end

function CheckCollision(x1,y1,w1,h1, x2,y2,w2,h2)
  return x1 < x2+w2 and
         x2 < x1+w1 and
         y1 < y2+h2 and
         y2 < y1+h1
end

if CheckCollision(en.getbox(),sw.getbox()) == true then
        if sw.getvis() == true then
            en.alive = false
        end
    end

print(tostring(en.alive))

我希望敌人(en)死亡(en.alive = false),但是我得到了错误:input:25: attempt to perform arithmetic on a nil value (local 'w2')。


1
CheckCollision(en.getbox(),sw.getbox())中,你不能像想象中那样随意地将一个元组放在另一个元组后面 - 第一个元组将被调整为一个值。这是Lua的非常奇怪的一面。 - Egor Skriptunoff
1个回答

1
你可以在这里找到有关你所看到的问题的解释: Lua编程:5.1 - 多个结果
我建议你阅读整个页面,但这是一个相关部分:
一个函数调用如果不是列表中的最后一个元素,则始终会产生一个结果: x,y = foo2(), 20 -- x='a', y=20 x,y = foo0(), 20, 30 -- x=nil, y=20,30被丢弃
我建议进行以下更改以使您的代码正常工作。将来自getbox的输出包装到一个具有清晰键的表格中,这样易于理解。
  function en.getbox()
    return {
      x = en.box.x,
      y = en.box.y,
      w = en.box.w,
      h = en.box.w
    }
  end

  function sw.getbox()
    return {
      x = sw.box.x,
      y = sw.box.y,
      w = sw.box.w,
      h = sw.box.w
    }
  end

  function CheckCollision(o1, o2)

    return o1.x < o2.x + o2.w and
    o2.x < o1.x + o1.w and
    o1.y < o2.y + o2.h and
    o2.y < o1.y + o1.h
  end

或者您可以像这样“即时”包装getbox的输出:

function CheckCollision(o1, o2)

  return o1[1] < o2[1] + o2[3] and
         o2[1] < o1[1] + o1[3] and
         o1[2] < o2[2] + o2[4] and
         o2[2] < o1[2] + o1[4]
end

if CheckCollision({en.getbox()},  {sw.getbox()}) == true then
        if sw.getvis() == true then
            en.alive = false
        end
end

我强烈推荐第一种选择而不是最后一种。最后一种选择会导致代码难以理解,并应该附有清晰的注释来解释它。

第一种解决方案非常好!谢谢!我曾经想过在一个函数中添加多个变量,甚至用一个虚拟程序进行了测试,结果也很好。 - Heatso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接