3

オブジェクトのインデックスをどのようにprint()または検索しますか?

たとえば、画面上に20個のランダムな岩のオブジェクトを配列にスポーンした場合RockTable = {};

このようなRockTable[#RockTable + 1] = rock;

そして、20個の岩すべてが画面に表示されます。それらをクリックして、各岩がどのキーまたはインデックスを持っているかをどのように確認できますか?

CoronaSDKを使用しています。

どんな助けでも大歓迎です。

4

5 に答える 5

4

テーブルを反転します。

function table_invert(t)
  local u = { }
  for k, v in pairs(t) do u[v] = k end
  return u
end

次に、反転テーブルを使用してインデックスを見つけることができます。

この関数は非常に便利なので、永続的な「Luaユーティリティ」ライブラリに入れられます。

于 2012-03-19T02:56:09.077 に答える
2

メタメソッドを使用してそれを行う別の方法があります。[値も削除できるように編集]

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 つの変数をいじるだけでよいことも意味します。うまくいけば、間違ったものにアクセスしようとする可能性が減るはずです。

于 2012-03-19T18:11:26.050 に答える
2

最も簡単な方法は、各岩に「インデックス」プロパティを追加することです。

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 つだけを気にする必要があります。

ただし、質問があります。なぜそのインデックスを取得する必要があるのですか? ほとんどの場合、適切に設計されたイベント リスナー関数で十分です。オブジェクトを「検索」する必要はありません。もちろん、あなたが何をしようとしているのかについての情報は不足していますが、物事を複雑にしすぎている可能性があります。

于 2012-03-22T15:30:41.860 に答える
1

インデックスを見つけるためにテーブルを絶えずループする手間を省くために、このようなことを行うことができます...

RockTable = {}
RockIndicies = {}

for i = 1, 20 do
    idx = #RockTable + 1
    RockTable[idx] = rock
    RockIndicies[rock] = idx
end

次に、インデックスを知る必要がある場合は、RockIndicesにインデックスを付ける必要があるロックを使用して、すばやく取得できます。岩を「削除」する場合は、両方の場所で必ず削除する必要があります。

于 2012-03-17T23:57:18.050 に答える
0

残念ながら、私の知る限り、テーブルをブルートする必要があります。ただし、クリックされたことを知るために、何らかの方法でそれらをループする必要はありません。したがって、すでにインデックスを知っていますか?

編集

ああ、コロナがクリックのための何らかのコールバックイベントを持っていない限り。使ったことはありませんが、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
于 2012-03-17T22:29:43.427 に答える