【问题标题】: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

【问题讨论】:

    标签: android ios lua coronasdk


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

    阅读更多:

    【讨论】:

    • 我想知道本地 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。这就是我从您的代码中删除括号的原因。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2019-03-06
    • 2020-07-27
    • 2012-01-11
    • 2018-03-03
    • 1970-01-01
    • 2022-07-13
    相关资源
    最近更新 更多