【问题标题】:Name a Table with a Variable in LUA (LÖVE Engine)?在 LUA(LÖVE 引擎)中使用变量命名表?
【发布时间】:2013-01-19 16:43:12
【问题描述】:

基本上:

  • 我正在 LÖVE 引擎中制作一款游戏,您可以在其中点击创建积木
  • 每次单击时,鼠标 X 和鼠标 Y 上都会创建一个块
  • 但是,我只能显示一个块,因为我必须将该块(或表)命名为“object1”

有什么方法可以创建一个又一个表并增加值? (如 object1{}、object2{}、object3{} 等...但在主表中,'created_objects')

但只有在点击时,我想这排除了循环部分(但如果没有请告诉我)

这是我目前的代码,但无法编译。

function object_create(x, y, id) **--Agruments telling the function where the box should spawn and what the ID of the box is (variable 'obj_count' which increases every time a box is spawned)**

currobj = "obj" .. id **--Gives my currently created object a name**

crob.[currobj] = {} **--Is supposed to create a table for the current object, which holds all of its properties. **

crob.[currobj].body = love.physics.newBody(world, x, y, "dynamic")
crob.[currobj].shape = love.physics.newRectangleShape(30, 30) 
crob.[currobj].fixture = love.physics.newFixture(crob.[currobj].body, crob.[currobj].shape, 1)     **--The properties**
crob.[currobj].fixture:setRestitution(0.3) 

但是我应该用什么替换 [currobj]?


已解决

找到了我要找的东西。如果人们想知道,这是代码:

function block_create(x, y, id) --(鼠标x和y,以及增加的变量)

blocks[id] = {}
blocks[id][1] = love.physics.newBody(world, x, y, "dynamic")
blocks[id][2] = love.physics.newRectangleShape(45, 45)
blocks[id][3] = love.physics.newFixture(blocks[id][1], blocks[id][2])
blocks[id][3]:setRestitution(0.2)
blocks[id][4] = math.random(0, 255) --The Color
blocks[id][5] = math.random(0, 255)
blocks[id][6] = math.random(0, 255)

blockcount = blockcount + 1

【问题讨论】:

    标签: dynamic lua naming lua-table


    【解决方案1】:

    我可能会做这样的事情。

    local blocks = {} -- equivalent of your crob table
    
    function create_block(x, y)
        local block = funcToCreateBlock() -- whatever code to create the block
        table.insert(blocks, block)
        return block
    end
    

    如果您想获得对刚刚使用该函数创建的块的引用,只需捕获它即可。

    -- gives you the new block, automatically adds it to the list of created blocks
    local new_block = create_block(0, 10) 
    

    将块对象粘贴到块表中,并自动为每个对象分配表中的数字索引。因此,如果您为 3 次不同的鼠标点击调用了 3 次 create_block(),blocks 表将如下所示:

    blocks = {
        [1] = blockobj1,
        [2] = blockobj2,
        [3] = blockobj3
    }
    

    你可以通过这样做从块表中获取第二个块 obj

    local block2 = blocks[2]
    

    或者您可以使用pairsipairs 遍历表中的所有块

    for idx, block in pairs(blocks) do
         -- do something with each block
    end
    

    很抱歉,如果这不能完全回答您的问题。但从您写的内容来看,您似乎没有真正的理由需要将块命名为 crob 表中的任何特定内容。

    【讨论】:

    • 感谢您的回复,它确实给了我编辑代码的线索,但我仍然需要知道,有没有一种动态命名表的方法?类似于动态变量,但作为表中的类别。 (我需要将代码中的 [currobj] 替换为每次运行函数时都会增加的内容。谢谢
    • 您的意思是要创建一个变量,例如命名为“block1”,然后在 crob 中创建一个具有相同名称的键?
    • 是的,然后让它增加(block2,block3,block4...)并在每次运行函数时创建一个具有该名称的新表
    • 那么你可以按照他的回答中所说的'Back in a Flash'在全局命名空间中创建变量。我真的不明白为什么有人想这样做,但你可以这样做。
    【解决方案2】:

    如果您希望这些表是全局的,那么您可以执行以下操作:

    sNameOfTable = "NAME"
    _G[sNameOfTable] = {1,2}
    

    然后您将拥有一个表格变量NAME,如here(键盘)所示。

    否则,如果您希望它成为其他表的子项,也可以这样做:

    tTbl = {}
    for i = 1, 20 do
      local sName = string.format( "NAME%02d", i )
      tTbl[sName] = {1,2}
    end
    for i, v in pairs(tTbl) do
      print( i, v )
    end
    

    不用担心未排序的output here(键盘)。带有索引的 Lua 表无需排序即可使用。

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2021-12-17
      • 2021-04-10
      • 2022-01-06
      • 1970-01-01
      • 2013-01-22
      • 2013-04-21
      相关资源
      最近更新 更多