触摸时如何删除克隆
Posted
技术标签:
【中文标题】触摸时如何删除克隆【英文标题】:How to delete a clone when touched 【发布时间】:2019-11-17 01:04:24 【问题描述】:我正在开发一个程序,该程序将创建一堆克隆,当克隆被粘贴时,它将删除一个克隆。我只希望它删除录制的克隆。我遇到了触摸事件侦听器的问题。它说我正在尝试索引一个 nil 变量,但我在程序的前面定义了它。
我尝试将变量更改为全局变量。
display.setDefault("background", 0, 0, 200)
math.randomseed(os.time())
local boat = display.newImage( "boatt.png" )
boat.x = 163
boat.y = 225
local score = 0
local spawnCnt = 0
local spawnTable =
local startTime = os.time()
local startTime2 = os.time()
local fish_tapped
local function spawn ()
local obj = display.newImageRect("fishpic.png",70,70)
obj.x = math.random(1, 300)
obj.y = (0 - math.random(30, 400))
obj.isDone = false
-- Note: Second argument is function name without brakets
obj:addEventListener("touch", touched()) --i added brackets to this
return obj
end
local function onSpawn ()
spawnCnt = spawnCnt + 1
spawnTable[spawnCnt] = spawn()
end
local function movement (event)
-- SPAWN OBJECT USING TIMER
if os.time() - startTime >= 1 then
onSpawn()
startTime = os.time()
end
-- MOVE OBJECT
if spawnCnt > 0 then
for i = 1, spawnCnt do
if spawnTable[i].isDone == false then
if spawnTable[i].y > 600 or spawnTable[i].fish_tapped == true then
spawnTable[i].y = 700
spawnTable[i].isDone = true
display.remove(self)
self = nil
else
spawnTable[i].y = spawnTable[i].y + 4
end
end
end
end
end
Runtime:addEventListener ("enterFrame",movement)
--when i tried to have touched() in the event listener for touch it said that i was calling a
--nill value, so I made the funciton global.
function touched( event )
local obj = event.target
obj.fish_tapped = true
end
【问题讨论】:
【参考方案1】:尝试(未测试)
local function movement (event)
...
-- Replace
-- if spawnTable[i].y > 600 or fish_tapped == true then
-- with
if spawnTable[i].y > 600 or spawnTable[i].fish_tapped == true then
...
end
local function touched( event )
local obj = event.target
obj.fish_tapped = true
end
local function spawn ()
local obj = display.newImageRect("fishpic.png",70,70)
obj.x = math.random(1, 300)
obj.y = (0 - math.random(30, 400))
obj.isDone = false
-- Note: Second argument is function name without brakets
obj:addEventListener("touch", touched)
return obj
end
阅读更多:
Scope for Beginners Tap/Touch Anatomy【讨论】:
我想知道本地 obj = event.target 在这段代码中做了什么。我尝试了代码,它现在没有错误,但是当我单击对象时它没有注册。另外,我想知道为什么你必须把 obj.在fish_tapped = true。为什么需要 obj.fish_tapped 而不是 fish_tapped?event.target
表示屏幕上点击的对象。由于您为新的鱼对象使用了obj
名称,因此我使用相同的名称。但是,spawn
和 touched
函数中的 obj
对象是不同的对象,因为它们是这些函数的局部变量。这意味着它们不存在于这些功能之外。名称fish_tapped
表明它应该附加到单个鱼对象。这样你就可以检查鱼是否被轻拍了。这意味着代码的更多变化(我更新了上面的代码)。
感谢您的帮助。我实施了新的更改,但仍然有错误。我纠正了几个小错误,并评论了我所做的更改。我在触摸事件侦听器中为touched() 添加了括号。我还将touched() 设为全局变量。我现在遇到的错误是它说我正在尝试索引本地“事件”,它说它是一个 nil 值。然后它说错误发生在 touch 函数、spawn 和 onspawn 函数中,以及我调用 onspawn 的移动函数的行上。它还说:“?在函数 中”。我不确定为什么会出现此错误
obj:addEventListener()
的第二个参数是函数名,即touched
。这就是我从您的代码中删除括号的原因。以上是关于触摸时如何删除克隆的主要内容,如果未能解决你的问题,请参考以下文章
当内部按钮触摸时,如何从 Superview 中删除以编程方式创建的子视图?