触摸时如何删除克隆

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 名称,因此我使用相同的名称。但是,spawntouched 函数中的 obj 对象是不同的对象,因为它们是这些函数的局部变量。这意味着它们不存在于这些功能之外。名称fish_tapped 表明它应该附加到单个鱼对象。这样你就可以检查鱼是否被轻拍了。这意味着代码的更多变化(我更新了上面的代码)。 感谢您的帮助。我实施了新的更改,但仍然有错误。我纠正了几个小错误,并评论了我所做的更改。我在触摸事件侦听器中为touched() 添加了括号。我还将touched() 设为全局变量。我现在遇到的错误是它说我正在尝试索引本地“事件”,它说它是一个 nil 值。然后它说错误发生在 touch 函数、spawn 和 onspawn 函数中,以及我调用 onspawn 的移动函数的行上。它还说:“?在函数 中”。我不确定为什么会出现此错误 obj:addEventListener() 的第二个参数是函数名,即touched。这就是我从您的代码中删除括号的原因。

以上是关于触摸时如何删除克隆的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mercurial 克隆中删除工作副本?

如何使用 jQuery 删除克隆的图像?

当内部按钮触摸时,如何从 Superview 中删除以编程方式创建的子视图?

使用“克隆”助手执行可拖动事件后,如何删除原始元素?

克隆 JavaScript 对象时如何排除键列表? [复制]

如何从 UITableViewCell 中的自定义 UIButton 中删除触摸延迟