尝试在使用Corona的Lua中的数组的一部分对象中添加事件监听器。

主函数创建了一个简单的二维数组。现在我想为表格中的每个对象创建一个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))
点赞
用户1137788
用户1137788

移除最后一行。

addEventListener函数应该像这样被调用

newdice:addEventListener("tap", taps)
2012-07-19 01:34:54
用户1440756
用户1440756

这让我困惑了很久,主要问题是你将newdice设置为Corona display.newText对象,然后重新分配为一个dice对象。所有的Corona对象都像普通的表格一样,但它们实际上是特殊的对象。所以你有两个选择:

A.不使用类和面向对象编程。像现在这样的代码,没有理由让dice成为一个类。除非你有一些强制性的原因让dice成为一个类。这个选项我会选择,以下是如何实现此选项

--dice不是类--
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 = display.newText(a, display.contentWidth*posx,
    display.contentHeight*posy, nil, 60)
    newdice:addEventListener("tap", taps)
    newdice.b = true
    return newdice
end

or B.使用“has a”关系而不是“is a”关系表示显示对象。由于你不能将它们同时设置为dice对象和display对象,因此你的dice对象可以包含一个display对象。以下是它的外观。

--dice类--
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函数的事件处理程序中,你必须使用event.target.b而不是self.b。此外,在dice.new中,b是一个局部变量,所以它不是你的dice类的成员。

2012-08-11 23:05:45