Timer Corona SDK(LUA)生成对象和计时器问题

Timer Corona SDK(LUA)生成对象和计时器问题,timer,lua,coronasdk,Timer,Lua,Coronasdk,我试图在屏幕高度以上产生物体,使其坠落。 到目前为止,我编写的代码都能正常工作,但当我让场景用完后,返回并再次启动该级别时,场景有两个问题: 1.spawn函数“spawnObjects”似乎每0.5秒触发两次,但只是有时,但总是在第二次运行时触发。通常情况下,控制台看起来是在发射3(就像他们在堆叠一样) 2.在第二次运行时,当计时器变为0或更小时应该运行的函数不是 这是我的代码,它可能很粗,有值什么的,不在奇怪的地方。这是因为我一直在和定时器斗争,现在这个(仍然有点定时器)已经有几天了,我尝试

我试图在屏幕高度以上产生物体,使其坠落。 到目前为止,我编写的代码都能正常工作,但当我让场景用完后,返回并再次启动该级别时,场景有两个问题: 1.spawn函数“spawnObjects”似乎每0.5秒触发两次,但只是有时,但总是在第二次运行时触发。通常情况下,控制台看起来是在发射3(就像他们在堆叠一样) 2.在第二次运行时,当计时器变为0或更小时应该运行的函数不是

这是我的代码,它可能很粗,有值什么的,不在奇怪的地方。这是因为我一直在和定时器斗争,现在这个(仍然有点定时器)已经有几天了,我尝试了很多不同的事情。希望任何人都能看到我做错了什么,如果你有一个更好的解决方案,倒计时计时器和/或产卵的对象的方式,那么我会永远尝试

local composer = require( "composer" )
local scene = composer.newScene()
local myData = require( "myData" )
local physics = require("physics")
physics.setDrawMode( "hybrid" )
-- forward references
local w = display.actualContentWidth
local h = display.actualContentHeight
local dropCount = 0
local spawnShit = 0
local spawnTime = 17
local countdownTimer
local score = 0
local countNumber = 10
local countDownNumber = 10
local scoreT = display.newText( {text="Score: "..score, font=system.nativeSystemFont, fontSize=14,} )
scoreT.x = w * 0.5
scoreT.y = h * 0.1
local countDownText = display.newText( {text="", font=system.nativeSystemFont, fontSize=14} )
countDownText.x = w * 0.5
countDownText.y = h * 0.2
local drop01 = display.newImage("drop01.png")
drop01.x = -100
local drop02 = display.newImage("drop02.png")
drop02.x = -100
local drop03 = display.newImage("drop03.png")
drop03.x = -100
local drop04 = display.newImage("drop04.png")
drop04.x = -100
local timerSpawn

-- Display objects
local background = display.newImage( "bluebg.png" )
background.x = w*0.5
background.y = h*0.5
background.width = w 
background.height = h 

local bckBtn = display.newText({text="<--BACK", font=system.nativeSystemFont, fontSize=14})
bckBtn.x = 50
bckBtn.y = 20


local egon = display.newImage( "Egon.png" )
egon.x = w*0.5
egon.y = h*0.85
egon.width = 100
egon.height = 97



--functions

function goBack (event)

    if "began" == event.phase then

        elseif event.phase == "ended" then

    composer.gotoScene("select", "fade", 500)

    end




    return true

end

 function moveEgon (event)
    egon.x = event.x
 end

------------------------------------------------vvv---------------------------------------------------
------------------------------------------------vvv---------------------------------------------------
------------------------------------------------vvv---------------------------------------------------
 function spawnObjects (event)

        dropCount = math.random(1,4)



        if stopTimer == 1 then
            timer.cancel(timerSpawn)
            timerSpawn = nil
            spawnShit = nil
        end
        if spawnShit == 1 then
            print( 'spawnShit' )
            if dropCount == 1 then
            -- Drop01 function and settings
            drop01 = display.newImage( "drop01.png" )
            drop01.x = math.random(10, 470)
            drop01.y = 40
            drop01.width = 50
            drop01.height = 50
            drop01.myName = "01"
            physics.addBody( drop01, "dynamic", {density=0.1, friction=0.1, bounce=0.8 } )
            elseif dropCount == 2 then
                --Do shit for drop02
            drop02 = display.newImage( "drop02.png" )
            drop02.x = math.random(10, 470)
            drop02.y = 40
            drop02.width = 50
            drop02.height = 50
            drop02.myName = "02"
                physics.addBody( drop02, "dynamic", {density=0.1, friction=0.1, bounce=0.8 } )
                elseif dropCount == 3 then
            drop03 = display.newImage( "drop03.png" )
            drop03.x = math.random(10, 470)
            drop03.y = 40
            drop03.width = 50
            drop03.height = 50
            drop03.myName = "03"
            physics.addBody( drop03, "dynamic", {density=0.9, friction=0.1, bounce=0.8 } )
                    elseif dropCount == 4 then
            drop04 = display.newImage( "drop04.png" )
            drop04.x = math.random(10, 470)
            drop04.y = 40
            drop04.width = 50
            drop04.height = 50
            drop04.myName = "04"
            physics.addBody( drop04, "dynamic", {density=0.9, friction=0.1, bounce=0.8 } )
            end

        end
        return true
end

---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------

 function onCollision (event)

    if "began" == event.phase then
        --v--do shit when touching surface

    if event.other.myName == "01" then
        -- Do shit for drop01 -- 
        -- Change score, powersups etc
        event.other:removeSelf( )
    end

        if event.other.myName == "02" then
            -- Do shit for drop02 -- 
        -- Change score, powersups etc
        event.other:removeSelf( )
    end

        if event.other.myName == "03" then 
            -- Do shit for drop03 -- 
        -- Change score, powersups etc
        event.other:removeSelf( )

        end

        if event.other.myName == "04" then
            -- Do shit for drop04 -- 
        -- Change score, powersups etc
        event.other:removeSelf( )
        end

    elseif "ended" == event.phase then 
    -- Do shit when leaving surfaces
end 

    return true

 end
------------------------------------------------vvv---------------------------------------------------
------------------------------------------------vvv---------------------------------------------------
------------------------------------------------vvv---------------------------------------------------
function showCountDown (event)
-- Condition to show and hide countdown
    if countDownNumber <= 0  then
        timer.cancel(event.source)
        countDownTimer = nil
        spawnShit = 0
        print( 'NO MORE SPAAAAAAAAAAAAAAAWWNS' )
    else 
        countDownNumber = countDownNumber -1 
        countDownText.text = countDownNumber
         spawnShit = 1
    end
    return true
end

---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------

--function scene:create( event )
function scene:create( event )
    local sceneGroup = self.view

    -- Initialize the scene here.
    -- Example: add display objects to "sceneGroup", add touch listeners, etc

    --Listeners

    background:addEventListener( "touch", moveEgon )
    bckBtn:addEventListener( "touch", goBack )
    egon:addEventListener( "collision", onCollision )
    --SceneGroup insert
    sceneGroup:insert( background )
    sceneGroup:insert(egon)
    sceneGroup:insert(bckBtn)
    sceneGroup:insert(drop01)
    sceneGroup:insert(drop02)
    sceneGroup:insert(drop03)
    sceneGroup:insert(drop04)
    sceneGroup:insert(scoreT)
    sceneGroup:insert(countDownText)


    end


-- "scene:show()"
function scene:show( event )

    local sceneGroup = self.view
    local phase = event.phase

    if ( phase == "will" ) then
        -- Called when the scene is still off screen (but is about to come on screen).
    elseif ( phase == "did" ) then
        -- Called when the scene is now on screen.
        -- Insert code here to make the scene come alive.
        -- Example: start timers, begin animation, play audio, etc.
        physics.start( )
        timercount = 10



            -- ADD physic bodies ----
            physics.addBody( egon, "static", {density=0.1, friction=0.1, bounce=0.8 } )
            countDownNumber = 10
            countdownTimer = timer.performWithDelay( 1000, showCountDown, countNumber )
            ----------- Timers ------------
            timerSpawn = timer.performWithDelay(500, spawnObjects, 0 )


    end
end


-- "scene:hide()"
function scene:hide( event )

    local sceneGroup = self.view
    local phase = event.phase

    if ( phase == "will" ) then
        -- Called when the scene is on screen (but is about to go off screen).
        -- Insert code here to "pause" the scene.
        -- Example: stop timers, stop animation, stop audio, 
        --timer.pause( timerSpawn )
        physics.stop()

        spawnShit = 0
        timerSpawn = nil
        countdownTimer = nil
        physics.removeBody( egon )



    elseif ( phase == "did" ) then
        -- Called immediately after scene goes off screen.
    end
end


-- "scene:destroy()"
function scene:destroy( event )

    local sceneGroup = self.view

    -- Called prior to the removal of scene's view ("sceneGroup").
    -- Insert code here to clean up the scene.
    -- Example: remove display objects, save state, etc.
    bckBtn:removeEventListener("touch", goBack )
    egon:removeEventListener("touch", moveEgon )

end



-- -------------------------------------------------------------------------------

-- Listener setup
scene:addEventListener( "create", scene )
scene:addEventListener( "show", scene )
scene:addEventListener( "hide", scene )
scene:addEventListener( "destroy", scene )

-- -------------------------------------------------------------------------------

return scene
localcomposer=require(“composer”)
本地场景=composer.newScene()
本地myData=require(“myData”)
本地物理=要求(“物理”)
物理。setDrawMode(“混合”)
--转发参考
本地w=显示。实际内容宽度
本地h=显示。实际内容灯
本地dropCount=0
本地值=0
本地时间=17
本地倒计时
本地分数=0
本地countNumber=10
本地倒计时数=10
本地scoreT=display.newText({text=“Score:…Score,font=system.nativeSystemFont,fontSize=14,})
分数x=w*0.5
分数y=h*0.1
本地倒计时文本=display.newText({text=”“,font=system.nativeSystemFont,fontSize=14})
倒计时文本.x=w*0.5
倒计时文本。y=h*0.2
本地drop01=display.newImage(“drop01.png”)
drop01.x=-100
本地drop02=display.newImage(“drop02.png”)
drop02.x=-100
本地drop03=display.newImage(“drop03.png”)
drop03.x=-100
本地drop04=display.newImage(“drop04.png”)
drop04.x=-100
当地时间兵
--显示对象
本地背景=display.newImage(“blubg.png”)
背景x=w*0.5
背景y=h*0.5
背景宽度=w
背景高度=h
本地bckBtn=display.newText({text=“当您的
场景:show()
时,执行

timerSpawn = timer.performWithDelay(500, spawnObjects, 0 )
这将导致无限期地每隔0.5秒调用一次
spawObjects
(即直到应用程序退出,或计时器取消或暂停)。这没关系,只是当您返回到该场景时,该行会再次执行,这将导致创建一个新的计时器,
timeSpawn
现在引用新的计时器。因此,现在大约每0.5秒会有两个计时器触发。当您离开场景并再次返回时,您将有3个计时器,等等。
timerSpawn
设置为引用新计时器,但不会停止旧计时器。当场景隐藏时,您可能应该暂停
timerSpawn
;然后在
show()
中,仅当计时器不存在时,才应创建该计时器:

function scene:show( event )
        ....
        ----------- Timers ------------
        countDownNumber = 10
        if countdownTimer == nil then
            countdownTimer = timer.performWithDelay( 1000, showCountDown, countNumber )
        else 
            timer.resume(countownTimer)
        end
        if timerSpawn == nil then
            timerSpawn = timer.performWithDelay(500, spawnObjects, 0 )
        else 
            timer.resume(timerSpawn)
        end
end

function scene:hide( event )
    ...
    if ( phase == "will" ) then
        timer.pause( timerSpawn )
        timer.pause( countdownTimer )
        -- NO: 
        -- timerSpawn = nil
        -- countdownTimer = nil
        ...
    end
end

刚刚测试了我给你的代码,由于某种原因,它从未触发应该停止繁殖的函数。通过编辑感谢这一点,我不知道为什么我没有想到这一点。不过,我遇到了一些新的错误,我发布了另一个问题,因为这个答案修复了主要问题。这很好。别忘了o接受答案,这样它就可以关闭,一旦你有足够的分数进行投票,就投票给你觉得有启发性/有用的任何答案(甚至是对其他人的问题)(以及任何你认为自己某一天需要答案的问题,只要你搜索答案)。