2

main 创建了一个简单的二维数组。现在我想为表中的每个对象创建一个 addeventlistener。我想我在课堂上这样做?虽然我创建了一个 taps 函数,然后定义了 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 对象都像普通的桌子一样,但它们实际上是特殊的对象。所以你有两个选择:

A. 不要使用类和 OOP。就像您现在的代码一样,没有理由让 dice 成为一个类。这是我会选择的选项,除非你有一些令人信服的理由让骰子成为一门课。以下是实现此选项的方法

--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. 对显示对象使用“具有”关系而不是“是”关系。由于您不能使它们同时成为骰子对象和显示对象,因此您的骰子对象可以包含显示对象。这就是它的样子。

--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

还有一些其他问题。在您的点击函数事件处理程序中,您必须使用 event.target.b 而不是 self.b。此外,在 dice.new b 中,b 是一个局部变量,因此它不是 dice 类的成员。

于 2012-08-11T23:05:45.020 回答
1

删除最后一行。

addEventListener 函数应该像这样调用

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