可以单独交互的同一对象的多个副本

时间:2015-04-04 21:26:02

标签: lua corona

我正在尝试使用可从任何位置访问的各个属性创建同一显示对象的多个副本。特别是,我希望能够点击并与每个人进行互动。到目前为止我的代码如下: -

centerX = display.contentCenterX
centerY = display.contentCenterY

local function onGemTouch(event)
    print("to see if each object can be tapped")
end

local spawnTable = {}


local function gamebegin(params)

    ball = display.newImageRect(params.image, 62,62)
    ball.x = centerX - 4*60 +2*(params.x-1)*60
    ball.y = centerY -3*60 + (params.y-1)*60
    ball.ballTable = params.ballTable
    ball.index = #ball.ballTable+1
    ball.myName = ball.index
    ball.ballTable[ball.index] = ball

    return ball
end
--i have four images that I want to use randomly--

for i = 1, 4 do
    for j = 1,7 do
        local spawn = gamebegin({image = "images/" .. math.random(4)  ..".png", x=i, y = j, ballTable = spawnTable})
    end
end

ball.tap = onGemTouch
ball:addEventListener( "tap", ball )

代码的工作原理是没有错误,并且我想要的网格中的副本可以被点击,但只能点击对象的最后一个副本。显然我在这里做错了。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

在不了解您的代码(或Corona)的情况下,我认为添加侦听器的正确语法是:

ball:addEventListener("tap", onGemTouch)

由于你想将它添加到每个球,你需要在循环内部创建球,或者你需要在创建球的功能内。如果我们把它放在创建球的函数中,我们得到:

local function gamebegin(params)
    ball = display.newImageRect(params.image, 62,62)
    ...
    ball:addEventListener("tap", onGemTouch)
    ball.ballTable[ball.index] = ball

    return ball
end

由于gamebegin似乎只是在创建新球,为什么不将其重命名为addBall?如果您将其添加到ballTable并且从不使用返回值,则不要返回任何内容:

local function addBall(params)
    ball = display.newImageRect(params.image, 62,62)
    ball.x = centerX - 4*60 +2*(params.x-1)*60
    ball.y = centerY -3*60 + (params.y-1)*60
    ball.ballTable = params.ballTable
    ball.index = #ball.ballTable+1
    ball.myName = ball.index
    ball:addEventListener("tap", onGemTouch)

    ball.ballTable[ball.index] = ball
end

for i = 1, 4 do
    for j = 1,7 do
        addBall({
            image = "images/" .. math.random(4)  ..".png", 
            x=i, 
            y = j, 
            ballTable = spawnTable})
    end
end

在我对你的答案的评论中添加建议:

local centerX = display.contentCenterX
local centerY = display.contentCenterY
local offset = 60
local imageSideLength = 62
local spawnTable = {}

local function onGemTouch(event)
    print("to see if each object can be tapped")
end

local function getBall(imagePath, x, y)
    local ball = display.newImageRect(imagePath, imageSideLength, imageSideLength)
    ball.x = centerX - 4*offset + 2*(x - 1)*offset
    ball.y = centerY - 3*offset + (y - 1)*offset

    return ball
end

for i = 1, 4 do
    for j = 1, 7 do
        local ball = getBall("images/" .. math.random(4) .. ".png", i, j)
        ball:addEventListener("tap", onGemTouch)
        table.insert(spawnTable, ball)
    end
end

答案 1 :(得分:0)

感谢您的答复Millie。您的方法可能会起作用,但我在此期间偶然发现了另一种解决方案

原来我需要将addEventListener(" tap",onGemTouch)添加到spawnTable。但我会尝试你的方法 - 看起来更容易。