1

基本的に:

  • クリックしてブロックを作成するLÖVEエンジンでゲームを作成しています
  • クリックするたびに、マウスXとマウスYにブロックが作成されます
  • ただし、そのブロック(またはテーブル)に「object1」という名前を付ける必要があるため、表示できるブロックは1つだけです。

値を増やしながらテーブルを次々に作成する方法はありますか?(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
4

2 に答える 2

3

私はおそらくこのようなことをするでしょう。

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) 

これは、ブロックオブジェクトをブロックテーブルに固定し、各オブジェクトにテーブル内の数値インデックスを自動的に付与します。したがって、create_block()を3回呼び出して3回マウスクリックすると、blocksテーブルは次のようになります。

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

次のようにして、blocksテーブルから2番目のblockobjを取得できます。

local block2 = blocks[2]

pairsまたは、またはを使用してテーブル内のすべてのブロックをループすることができますipairs

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

これがあなたの質問に正確に答えない場合は申し訳ありません。しかし、あなたが書いたことから、ブロックにcrobテーブルで特定の名前を付ける必要がある本当の理由はないようです。

于 2013-01-19T17:05:29.210 に答える
2

これらのテーブルをグローバルにしたい場合は、次のようにすることができます:

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

次に、ここNAMEに示すようにテーブル変数が作成されます(Codepad)。

それ以外の場合、他のテーブルの子にしたい場合は、次のようにすることもできます。

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

ここでのソートされていない出力(コードパッド)について心配する必要はありません。インデックス付きの Lua テーブルを使用するためにソートする必要はありません。

于 2013-01-20T15:29:19.393 に答える