Table.insert 函数将表参数识别为字符串

bulletsPlayer1 = {
   Pistol = {},
   Shotgun = {}
}

bulletsPlayer2 = {
   Pistol = {},
   Shotgun = {}
}

我有这些表,并且我有这个函数用来创建子弹:

function createBullet(x, y, angle, speed, weapon, player)
   local directionx = speed * math.cos(angle)
   local directiony = speed * math.sin(angle)

   table.insert(
      "bulletsPlayer"..player.."."..weapon,
      {
         positionx = x,
         positiony = y,
         directionx = directionx,
         directiony= directiony,
         speed = speed
      }
   )
end

例如,如果我像这样调用该函数:

createBullet(100,100,0,300,'Shotgun',1)

我将收到以下错误:

shooting.lua:77: 在“insert”中的坏参数#1(需要表,已获得字符串)

如何使我的代码将table.insert()函数的第一个参数识别为表而不是字符串?

点赞
用户4984564
用户4984564

如何使我的代码将table.insert()的第一个参数识别为我的tables而不是字符串?

这不是Lua的工作方式。字符串就是字符串,表就是表。如果您想按数字对玩家进行索引,请将它们存储在表中:

local bulletsPlayer = {
   {
      Pistol = {},
      Shotgun = {}
   };
   {
      Pistol = {},
      Shotgun = {}
   };
}

然后您可以像这样用数字索引它

bulletsPlayer[1]["shotgun"]
2019-12-02 14:43:30
用户2858170
用户2858170

"bulletsPlayer"..player.."." ..weapon 是一个字符串。因此错误消息正是你所期望的。

你不能只是从字符串中构建变量名称而希望 Lua 知道该怎么做。

由于 bulletsPlayer1 是一个全局表值,所以你可以通过全局环境来访问它。

_ENV["bulletsPlayer"..player][weapon]

请参阅https://www.lua.org/manual/5.3/manual.html#2.2

但通常你只使用表键来获取你需要的内容。你不从字符串中构建全局名称。

然后你应该有类似这样的代码:

local players{[1] = {bullets = {shotgun = 20, pistol = 9}}}

但如果你走这条路,你可能想了解一些关于 Lua 的面向对象编程的知识。如果子弹是你的玩家的一个属性,为什么不将该信息存储在一个玩家对象中呢?此外,元表可以让你的生活更加轻松。

2019-12-02 14:59:45