2

メインは単純な2D配列を作成します。次に、テーブル内のオブジェクトごとにaddeventlistenerを作成します。私はクラスでこれを行うと思いますか?タップ関数を作成してからaddeventlistenerを定義しましたが、エラーが発生します。

--main.lua--
grid={}
for i =1,5 do
grid[i]=  {}
for j =1,5 do

        grid[i][j]=diceClass.new( ((i+2)/10),((j+2)/10))
    end
end
--dice class--
local dice = {}
local dice_mt = { __index = dice } -- metatable


function dice.new( posx, posy) -- constructor
local a=math.random(1,6)
local b= true
local newdice = display.newText(a, display.contentWidth*posx,
    display.contentHeight*posy, nil, 60)
--newdice:addEventListener("tap", taps(event))

return setmetatable( newdice, dice_mt )
end


function dice:taps(event)
self.b = false
print("works")
end
function dice:addEventListener("tap", taps(event))
4

2 に答える 2

2

これは今日まで私を困惑させました。主な問題は、newdiceをCorona display.newTextオブジェクトにしてから、それをdiceオブジェクトに再割り当てしていることです。すべてのCoronaオブジェクトは通常のテーブルのように機能しますが、実際には特別なオブジェクトです。したがって、2つのオプションがあります。

A.クラスとOOPを使用しないでください。あなたのコードは今のように、サイコロをクラスにする理由はありません。これは、サイコロをクラスにするやむを得ない理由がない限り、私が選択するオプションです。このオプションを実装する方法は次のとおりです

--dice not a class--
local dice = {}

local function taps(event)
    event.target.b = false
    print("works")
end

function dice.new( posx, posy) -- constructor
    local a=math.random(1,6)
    --local b= true
    local newdice = {}
    newdice = display.newText(a, display.contentWidth*posx,
    display.contentHeight*posy, nil, 60)
    newdice:addEventListener("tap", taps)
    newdice.b = true
    return newdice
end

またはB.表示オブジェクトに「isa」関係の代わりに「hasa」関係を使用します。それらをサイコロオブジェクトと表示オブジェクトの両方にすることはできないため、サイコロオブジェクトに表示オブジェクトが含まれている可能性があります。これがどのように見えるかです。

--dice class--
local dice = {}
local dice_mt = { __index = dice } -- metatable

local function taps(event)
    event.target.b = false
    print("works")
end

function dice.new( posx, posy) -- constructor
    local a=math.random(1,6)
    --local b= true
    local newdice = {}
    newdice.image = display.newText(a, display.contentWidth*posx,
    display.contentHeight*posy, nil, 60)
    newdice.image:addEventListener("tap", taps)
    newdice.b = true
    return setmetatable( newdice, dice_mt )
end

他にもいくつか問題がありました。Taps関数のイベントハンドラーでは、self.bの代わりにevent.target.bを使用する必要があります。また、dice.newではbはローカル変数であるため、diceクラスのメンバーではありません。

于 2012-08-11T23:05:45.020 に答える
1

最後の行を削除します。

addEventListener関数は次のように呼び出す必要があります

newdice:addEventListener("tap", taps)
于 2012-07-19T01:34:54.270 に答える