【问题标题】:multiple copies of the same object that can be interacted with separately可以单独交互的同一对象的多个副本
【发布时间】:2017-01-10 20:05:00
【问题描述】:

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

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 )

代码在没有错误的意义上有效,并且副本出现在我想要的网格中,但只能单击对象的最后一个副本。所以很明显我在这里做错了什么。 任何帮助将不胜感激。

【问题讨论】:

    标签: lua coronasdk


    【解决方案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
    

    在您的回答中添加我的 cmets 的建议:

    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
    

    【讨论】:

      【解决方案2】:

      感谢您的回复米莉。您的方法可能只是有效,但与此同时我偶然发现了另一种解决方案

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

      【讨论】:

      • 不客气。一般来说,您应该在评论中回复我(我不确定您是否拥有这些特权)。还要注意:通常您不会将集合(在这种情况下为spawnTable)传递给为集合创建项目的函数。通常,您构建项目(通常在构造函数中,但乍一看我不确定 Lua 是否有构造函数),然后从函数中返回它。然后将返回值放入集合中。喜欢local ball = getNewBall(...); ballTable[nextIndex] = ball;
      • 这样您就不需要ball 上的index 属性,也不需要使用ball 上的ballTable 属性来引用集合。无论如何,球可能会在集合中移动,然后所有索引都会出错,除非您更新它们。如果它们是多个集合的一部分,ballTable 毫无意义。 (也不确定为什么将球名设置为index
      • 另外,希望我不会打扰您,但是如果您将local offset = 60 或类似的东西放在顶部,您可以在设置ball.xball.y 时引用它。那样的话,如果你想把它改成 50,你可以在一个地方改变它而不是四个。如果您出于某种原因在另一个函数中需要该值,它是可用的,并且它的名称使您的代码更易于阅读。
      • 我在回答的末尾添加了一个完整的重写,其中包含这些建议和更多内容(将所有全局变量更改为局部变量,因为全局变量通常会使编程更加困难,并且我添加了一些间距以提高可读性这里和那里)。
      • 还将params 更改为imagePath, x, y,因为它使代码更具可读性,并且我将所有变量声明彼此相邻。
      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多