【问题标题】:Can Display Objects have a Runtime Event in LUA?显示对象可以在 LUA 中具有运行时事件吗?
【发布时间】:2014-03-03 21:40:16
【问题描述】:

我在想我的图像是否可以有运行时事件?喜欢

当应用程序运行时,如果满足某个条件,对象将触发其运行时事件。

myImage = display.newImage("MYIMAGE")

myImage:addEventListener("enterFrame", myImage)

myImage.occurence = onEventTriggered

我不确定此代码是否有效,我当前的计算机中没有 LUA/Corona

【问题讨论】:

  • 你所说的“某些条件”是什么意思?您是否需要所有对象的触摸/点击侦听器,而不向所有对象添加单独的侦听器......?
  • 如果 z == 0 那么对象将在“transition.to”的帮助下到达那里,顺便说一下这些对象是生成的,我不需要点击/触摸它只是在应用程序上继续运行这就是我使用“enterFrame”的原因

标签: lua coronasdk


【解决方案1】:

你可以做基于对象的 enterFrames。它们仍然是 Runtime 对象的一部分,但它可以是表处理程序而不是函数处理程序:

myObject = display.newImageRect("player.png",64, 64)
function myObject:doSomething()
   -- do stuff
end
Runtime:addEventListener("enterFrame", myObject)

【讨论】:

  • 如果在表格中插入“myImage”,由于某种原因会创建一个新的myImage,这个myImage是否仍然包含它的功能?还是会传给新创建的myImage
【解决方案2】:

enterFrame 事件仅由运行时执行,但在 enterFrame 处理程序中,您可以检查对象的状态并在每一帧执行所需的任何检查:

myImage = display.newImage("MYIMAGE")
local function enterFrame(event)
    if myImage.y == 0 then -- move it to 50, 50 in one second
         local settings = { time=1000, x=50, y=50 }
         transition.to( square, settings)
    end
end
Runtime:addEventListener("enterFrame", enterFrame)

使用这种技术,enterFrame 和对象是独立的:enterFrame 将每帧调用一次,在其中您可以检查 enterFrame 函数可见的任何对象。如果您有一个对象表,您将遍历表内容。例如,

myImages = {}
local function enterFrame(event)
    for i, image in ipairs(myImages) do
        if myImage.y == 0 then -- move it to 50, 50 in one second
             local settings = { time=1000, x=50, y=50 }
             transition.to( square, settings)
        end
    end
    -- create new images: 
    local newImage = display.newImage("MYIMAGE")
    table.insert(myImages, newImage)
end

Runtime:addEventListener("enterFrame", enterFrame)

请注意,如果对象属性上存在现有转换,则必须在开始新转换之前取消该转换。在这种情况下,您可以将 transition.to 的返回值放入一个表中,并在开始新的转换之前检查该表中是否有项目;如果是,请取消并删除它。

如果您使用 Rob 在您的问题的另一个答案中解释的每个对象 enterFrame 事件,则此与转换相关的问题也适用。不同的是,使用每个对象的 enterFrame,您不需要 myImages 表。但是,您确实需要在调用 enterFrame 之前创建对象,这不是全局 enterFrame 的情况。如果你在每一帧都生成对象,那么你想要的是一个全局 enterFrame。 OTOH,您没有理由不能同时使用两者:

local checkConditionPerObject(self, event)
     if myImage.y == 0 then -- move it to 50, 50 in one second
          local settings = { time=1000, x=50, y=50 }
          transition.to( self, settings)
     end
end             ...

local function spawn(event)
    local newObject = display.newImage(...)
    newObject.enterFrame = checkConditionPerObject
    Runtime:addEventListener('enterFrame', newObject)
end

local function enterFrameGlobal(event)
    if someCondition() then
        spawn()
    end
end

Runtime:addEventListener("enterFrame", enterFrameGlobal)

这提供了很好的关注点分离。

【讨论】:

  • 如果在表格中插入“myImage”,由于某种原因会创建一个新的myImage,这个myImage是否仍然包含它的功能?还是会传给新创建的myImage
猜你喜欢
  • 2019-05-23
  • 2021-08-27
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多