オブジェクトのインデックスをどのようにprint()または検索しますか?
たとえば、画面上に20個のランダムな岩のオブジェクトを配列にスポーンした場合RockTable = {};
このようなRockTable[#RockTable + 1] = rock;
そして、20個の岩すべてが画面に表示されます。それらをクリックして、各岩がどのキーまたはインデックスを持っているかをどのように確認できますか?
CoronaSDKを使用しています。
どんな助けでも大歓迎です。
テーブルを反転します。
function table_invert(t)
local u = { }
for k, v in pairs(t) do u[v] = k end
return u
end
次に、反転テーブルを使用してインデックスを見つけることができます。
この関数は非常に便利なので、永続的な「Luaユーティリティ」ライブラリに入れられます。
メタメソッドを使用してそれを行う別の方法があります。[値も削除できるように編集]
t = {} -- Create your table, can be called anything
t.r_index = {} -- Holds the number value, i.e. t[1] = 'Foo'
t.r_table = {} -- Holds the string value, i.e. t['Foo'] = 1
mt = {} -- Create the metatable
mt.__newindex = function (self, key, value) -- For creating the new indexes
if value == nil then -- If you're trying to delete an entry then
if tonumber(key) then -- Check if you are giving a numerical index
local i_value = self.r_index[key] -- get the corrosponding string index
self.r_index[key] = nil -- Delete
self.r_table[i_value] = nil
else -- Otherwise do the same as above, but for a given string index
local t_value = self.r_table[key]
self.r_index[t_value] = nil
self.r_table[key] = nil
end
else
table.insert(self.r_index, tonumber(key), value) -- For t[1] = 'Foo'
self.r_table[value] = key -- For t['Foo'] = 1
end
end
mt.__index = function (self, key) -- Gives you the values back when you index them
if tonumber(key) then
return (self.r_index[key]) -- For For t[1] = 'Foo'
else
return (self.r_table[key]) -- For t['Foo'] = 1
end
end
setmetatable(t, mt) -- Creates the metatable
t[1] = "Rock1" -- Set the values
t[2] = "Rock2"
print(t[1], t[2]) -- And *should* proove that it works
print(t['Rock1'], t['Rock2'])
t[1] = nil
print(t[1], t[2]) -- And *should* proove that it works
print(t['Rock1'], t['Rock2'])
t
値をコピーして持ち運ぶことができるため、より用途が広いです。また、ほとんどの場合、1 つの変数をいじるだけでよいことも意味します。うまくいけば、間違ったものにアクセスしようとする可能性が減るはずです。
最も簡単な方法は、各岩に「インデックス」プロパティを追加することです。
RockTable = {}
for i=1,20 do
local rock
-- do your thing that generates a new 'rock' object
rock.index = #RockTable + 1
RockTable[rock.index] = rock
end
タッチ リスナー メソッドを使用する場合は、次の方法でロックを取得できます。
function touchListener( event )
local rock = event.target
local rockIndex = rock.index
-- ...
end
インデックスを使用して 2 番目のテーブルを維持できるのは事実ですが、私の方法はよりクリーンであることがわかります。何かを削除するときは、メインのテーブルの 1 つだけを気にする必要があります。
ただし、質問があります。なぜそのインデックスを取得する必要があるのですか? ほとんどの場合、適切に設計されたイベント リスナー関数で十分です。オブジェクトを「検索」する必要はありません。もちろん、あなたが何をしようとしているのかについての情報は不足していますが、物事を複雑にしすぎている可能性があります。
インデックスを見つけるためにテーブルを絶えずループする手間を省くために、このようなことを行うことができます...
RockTable = {}
RockIndicies = {}
for i = 1, 20 do
idx = #RockTable + 1
RockTable[idx] = rock
RockIndicies[rock] = idx
end
次に、インデックスを知る必要がある場合は、RockIndicesにインデックスを付ける必要があるロックを使用して、すばやく取得できます。岩を「削除」する場合は、両方の場所で必ず削除する必要があります。
残念ながら、私の知る限り、テーブルをブルートする必要があります。ただし、クリックされたことを知るために、何らかの方法でそれらをループする必要はありません。したがって、すでにインデックスを知っていますか?
編集
ああ、コロナがクリックのための何らかのコールバックイベントを持っていない限り。使ったことはありませんが、Lua の経験はあります。
次のように、後方参照を行うことができます。
Rocks = {a rock, a rockB, a rockC}
RocksB = {[a rock] = 1, [a rockB] = 2, [a rockC] = 3}
次に、rockNum = RocksB[rock] と言うだけです。
うまくいくはずですが、保証はできませんが、試してみる価値はあります。
編集2
ブルートメソッドは次のようになります。
function getRock(rock)
for _,v in pairs(rocks) do
if (v == rock)
return _
end
end
return "Rock does not exist."
end