2015-04-04 14 views
0

我试图用可以从任何地方访问的各个属性创建同一显示对象的多个副本。特别是,我希望能够挖掘并与每个人互动。到目前为止我的代码低于: -可以分别与之交互的同一个对象的多个副本

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) 

代码工作在某种意义上说,没有任何错误和副本中,我想,但只能被点击对象的最后一个副本电网apppear。很显然,我在这里做错了什么。 任何帮助将不胜感激。

回答

1

不知道很多其他有关您的代码(或电晕),我想添加一个侦听正确的语法是:

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 
0

谢谢您回答米莉。你的方法可能会正常工作,但我偶然发现了另一种解决方案

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

+0

不客气。一般来说,您应该回复我的评论(我不确定您是否拥有这些权限)。还有一点需要注意:通常你不会将一个集合(在这种情况下是'spawnTable')传递给一个为该集合创建一个项目的函数。通常你建立这个项目(通常在构造函数中,但乍一看我不确定Lua是否有构造函数),然后你从函数中返回它。然后你将返回值放入集合中。像'local ball = getNewBall(...); ballTable [nextIndex] = ball;'。 – 2015-04-05 16:46:47

+0

这样你就不需要'ball'上的'index'属性,并且你不需要在'ball'上引用具有'ballTable'属性的集合。无论如何,这些球可能会在集合中移动,除非您更新它们,否则所有索引都将是错误的。如果他们是多个集合的一部分,“ballTable”就意味着什么。 (也不知道为什么你把球的名字设置为'index') – 2015-04-05 16:50:22

+0

另外,我希望我不会烦你,但是如果你在上面放置了'local offset = 60'或类似的东西,你可以在设置时引用它'ball.x'和'ball.y'。这样,如果您想将其更改为50,则可以将其更改为一个地方而不是四个。如果您出于某种原因需要另一个函数中的值,则该函数可用,并且它的名称使您的代码更易于阅读。 – 2015-04-05 16:56:14

相关问题