Recursion Lua:递归函数中某一阶段的计时器

Recursion Lua:递归函数中某一阶段的计时器,recursion,timer,lua,coronasdk,Recursion,Timer,Lua,Coronasdk,所以我有个情况。我理解timer.performwithdelay,但它似乎以指数级速度增长,因为我有一个递归函数调用来循环一个阶段。因此,我们的游戏在屏幕上显示一个对象,您必须将其滑动到正确的位置。除了一件事:计时器,我的游戏一直在运行。我希望在第一个对象阶段开始后,每次形状弹出时都有5秒的计时器。这是我的密码: local composer = require( "composer" ) local scene = composer.newScene() local physics = re

所以我有个情况。我理解timer.performwithdelay,但它似乎以指数级速度增长,因为我有一个递归函数调用来循环一个阶段。因此,我们的游戏在屏幕上显示一个对象,您必须将其滑动到正确的位置。除了一件事:计时器,我的游戏一直在运行。我希望在第一个对象阶段开始后,每次形状弹出时都有5秒的计时器。这是我的密码:

local composer = require( "composer" )
local scene = composer.newScene()
local physics = require("physics")
physics.start()
physics.setGravity(0,0)

local game_sound = audio.loadStream( "GameScreenAudio.mp3" )
local sound = audio.loadStream( "splashMusic.mp3" )
audio.play(game_sound, {loops = -1} )
function scene:create( event )
local group = self.view


--LOAD IN BACKGROUND AND LOCATE IT TO FIT----------------------------------------------------
local background = display.newImage("game_background.png")

background.x = display.contentWidth / 2
background.y = display.contentHeight / 2
group:insert( background )
---------------------------------------------------------------------------------------------
--Screen GUI---------------------------------------------------------------------------------

local back_triangle = display.newImage("back_triangle.png")
back_triangle.x = display.contentWidth * .87
back_triangle.y = display.contentHeight * .5
back_triangle.xScale = .7; back_triangle.yScale = .7
back_triangle.alpha = .4

local back_diamond = display.newImage("back_diamond.png")
back_diamond.y = display.contentHeight * .5
back_diamond.x = display.contentWidth * .1
back_diamond.xScale = .7; back_diamond.yScale = .7
back_diamond.alpha = .4

local back_circle = display.newImage("back_circle.png")
back_circle.x = display.contentWidth * .5
back_circle.y = display.contentHeight * .1
back_circle.xScale = .7; back_circle.yScale = .7
back_circle.alpha = .35

local back_rectangle = display.newImage("back_rectangle.png")
back_rectangle.x = display.contentWidth * .5
back_rectangle.y = display.contentHeight * .9
back_rectangle.xScale = .7; back_rectangle.yScale = .7
back_rectangle.alpha = .4

group:insert( back_triangle )
group:insert( back_diamond )
group:insert( back_circle )
group:insert( back_rectangle )

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


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

--Load in Images-----------------------------------------------------------------------------
--GOOD
-- local excellent = display.newImage("excellent.png")
-- local incredible = display.newImage("incredible.png")
-- local wicked = display.newImage("wicked.png")
-- local good_for_you = display.newImage("good4you.png")
-- local amazing = display.newImage("amazing.png")
-- local spectacular = display.newImage("spectacular.png")
-- local groovy = display.newImage("groovy.png")
-- local stupendous = display.newImage("stupendous.png")
-- local class_act = display.newImage("classact.png")
-- local top_notch = display.newImage("topnotch.png")
-- local yea_man = display.newImage("yeaman.png")
-- local slayer = display.newImage("slayer.png")

-- --BAD
-- local wrecked = display.newImage("wrecked.png")
-- local atrocious = display.newImage("atrocious.png")
-- local bummer = display.newImage("bummer.png")
-- local unacceptable = display.newImage("unacceptable.png")
-- local wretched = display.newImage("wretched.png")
-- local despicable = display.newImage("despicable.png")
-- local revolting = display.newImage("revolting.png")
-- local fail = display.newImage("fail.png")
-- local wrong = display.newImage("wrong.png")
-- local nope = display.newImage("nope.png")

-- imageList_GOOD = {excellent, incredible, wicked, good_for_you, amazing, spectacular, groovy, stupendous, class_act, top_notch, yea_man, slayer} 
-- imageList_BAD = {wrecked, atrocious, bummer, unacceptable, wretched, despicable, revolting, fail, wrong, nope}

imageList_GAME = {"triangle.png", "circle.png", "rectangle.png", "diamond.png"}
------------------------1--------------2---------------3----------------4-----------------------

    local score = 0
    local streak = 0
    local strikes = 0
    local status = nil
    local neg_streak = 0
    local timeLimit = 5

    local score_text = display.newText("Score: ", display.contentWidth*.10, display.contentHeight*.98, native.systemFontBold, 20)
    group:insert( score_text )


function gameFunction()
    local game_number = math.random(1 , 4)


    local shape = display.newImage(imageList_GAME[game_number])
    shape.x = display.contentWidth * .5
    shape.y = display.contentHeight * .5
    local occupied = true
    group:insert( shape )

    --CREATE BACK BUTTON WITH FUNCTIONALITY---------------------------------------------------------
    local back_button = display.newImage("back_button.png")
    back_button.x = display.contentWidth * .93
    back_button.y = display.contentHeight * .945
    back_button.xScale = .25; back_button.yScale = .25



    function back_button:tap(event)
        if strikes < 3 then
            shape:removeSelf()
            composer.removeScene("game" )
            local options = 
            {
                effect = 'fromLeft',
                time = 400
            }
            audio.pause(game_sound)
            audio.play(sound)
            composer.gotoScene( "splash" , options)
        elseif strikes == 3 then
        end

    end
    back_button:addEventListener( "tap", back_button )
    group:insert( back_button )

    local score_points = display.newText(score, display.contentWidth* .30, display.contentHeight*.98, native.systemFontBold, 18)
    group:insert( score_points )

    physics.addBody(shape, "dynamic")
    local motion = nil

    -- touch listener function
    function shape:touch( event )

        local shape = event.target
        if event.phase == "began" then
            shape.previousX = shape.x
            shape.previousY = shape.y

        elseif event.phase == "moved" then
            shape.x = (event.x - event.xStart) + shape.previousX
            shape.y = (event.y - event.yStart) + shape.previousY
        elseif event.phase == "ended" and strikes < 3  then
            getPositionStatus()
            applyForce2Object()
            back_button:removeSelf()
            score_points:removeSelf()
            timeLimit = 5           
            gameFunction()
        end 
    end

    shape:addEventListener( "touch", shape )




    function getPositionStatus()
--SCORING-------------------------------------------------------------------------------------------
        if game_number == 1 and shape.x > display.contentWidth * .6 then
            status = "correct"
            score = score + 100
            streak = streak + 1
            neg_streak = 0
        elseif game_number == 2 and shape.y < display.contentHeight * .4 then
            status = "correct"
            score = score + 100
            streak = streak + 1
            neg_streak = 0
        elseif game_number == 3 and shape.y > display.contentHeight * .6 then
            status = "correct"
            score = score + 100
            streak = streak + 1
            neg_streak = 0
        elseif game_number == 4 and shape.x < display.contentWidth * .4 then
            status = "correct"
            score = score + 100
            streak = streak + 1
            neg_streak = 0
        else
            status = "incorrect"
            score = score - 100
            streak = 0
            neg_streak = neg_streak - 1
            strikes = strikes + 1
        end
        print("Status: " , status)
        print("Score: " , score)
        print("Strikes: " , strikes)
    end

    function applyForce2Object()
            --What did user do?-------------------------------
            if shape.x > display.contentWidth * .6 then
                shape:applyForce(2000, 0, shape.x, shape.y)
            elseif shape.y > display.contentHeight * .6 then
                shape:applyForce(0, 2000, shape.x, shape.y)
            elseif shape.y < display.contentHeight * .35 then
                shape:applyForce(0, -2000, shape.x, shape.y)
            elseif shape.x < display.contentWidth * .35 then
                shape:applyForce(-2000, 0, shape.x, shape.y)
            end  
    end

    if strikes == 3 then
        shape:removeSelf()
        print("*********GAME OVER************")
    end
end 
gameFunction()


end  --CREATE scene end


scene:addEventListener( "create", scene )

return scene
localcomposer=require(“composer”)
本地场景=composer.newScene()
本地物理=要求(“物理”)
物理开始
物理学.重力(0,0)
本地游戏声音=audio.loadStream(“GameScreenAudio.mp3”)
本地声音=audio.loadStream(“splashMusic.mp3”)
播放(游戏声音,{loops=-1})
功能场景:创建(事件)
本地组=self.view
--在后台加载,并将其定位到合适的位置----------------------------------------------------
本地背景=display.newImage(“game\u background.png”)
background.x=display.contentWidth/2
background.y=display.contentHeight/2
分组:插入(背景)
---------------------------------------------------------------------------------------------
--屏幕图形用户界面---------------------------------------------------------------------------------
本地back\u triangle=display.newImage(“back\u triangle.png”)
back_triangle.x=display.contentWidth*.87
back_triangle.y=display.contentHeight*.5
back_triangle.xScale=.7;后三角.yScale=.7
后三角α=0.4
本地back\u diamond=display.newImage(“back\u diamond.png”)
back_diamond.y=display.contentHeight*.5
back_diamond.x=display.contentWidth*.1
back_diamond.xScale=.7;背面菱形刻度=.7
背面菱形。α=0.4
本地back\u circle=display.newImage(“back\u circle.png”)
back_circle.x=display.contentWidth*.5
back_circle.y=display.contentHeight*.1
back_circle.xScale=.7;后圆.yScale=.7
后圆α=0.35
本地back\u rectangle=display.newImage(“back\u rectangle.png”)
back_rectangle.x=display.contentWidth*.5
back_rectangle.y=display.contentHeight*.9
back_rectangle.xScale=.7;背面矩形。yScale=.7
背面矩形。alpha=.4
组:插入(后三角)
分组:插入(后菱形)
分组:插入(后圆)
组:插入(后矩形)
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
--加载图像-----------------------------------------------------------------------------
--好
--本地优秀=display.newImage(“优秀的.png”)
--本地难以置信=display.newImage(“inclusible.png”)
--local wicked=display.newImage(“wicked.png”)
--本地good\u for\u you=display.newImage(“good4you.png”)
--本地惊人=display.newImage(“惊人的.png”)
--本地壮观=display.newImage(“specific.png”)
--本地groovy=display.newImage(“groovy.png”)
--local stappendous=display.newImage(“stappendous.png”)
--本地类=display.newImage(“classact.png”)
--本地top_notch=display.newImage(“topnotch.png”)
--本地yeaman=display.newImage(“yeaman.png”)
--本地slayer=display.newImage(“slayer.png”)
--”“坏
--本地失事=display.newImage(“失事的.png”)
--local arbious=display.newImage(“arbious.png”)
--本地bummer=display.newImage(“bummer.png”)
--本地不可接受=display.newImage(“unacceptable.png”)
--local wreted=display.newImage(“wreted.png”)
--本地可忽略=display.newImage(“可忽略的.png”)
--本地反抗=display.newImage(“反抗.png”)
--本地失败=display.newImage(“fail.png”)
--本地错误=display.newImage(“error.png”)
--本地nope=display.newImage(“nope.png”)
--imageList_GOOD={优秀,不可思议,邪恶,对你来说很好,惊人,壮观,精彩,惊人,一流,一流,是的,杀手}
--imageList_BAD={被破坏的,残暴的,沮丧的,不可接受的,可怜的,卑鄙的,反抗的,失败的,错误的,不}
imageList_GAME={“triangle.png”、“circle.png”、“rectangle.png”、“diamond.png”}
------------------------1--------------2---------------3----------------4-----------------------
本地分数=0
局部条纹=0
局部罢工=0
本地状态=零
局部负条纹=0
本地时间限制=5
本地分数\文本=display.newText(“分数:”,display.contentWidth*.10,display.contentHeight*.98,native.systemFontBold,20)
组:插入(分数\文本)
函数gameFunction()
本地游戏编号=数学随机(1,4)
本地形状=display.newImage(imageList\u游戏[游戏编号])
shape.x=display.contentWidth*.5
shape.y=display.contentHeight*.5
本地占用=真
组:插入(形状)
--创建具有功能的后退按钮---------------------------------------------------------
本地后退按钮=display.newImage(“后退按钮.png”)
后退按钮.x=display.contentWidth*.93
后退按钮.y=display.contentHeight*.945
后退按钮.xScale=.25;后退按钮。Y刻度=.25
功能返回按钮:点击(事件)
如果击数小于3,则
形状:removeSelf()
作曲家:removeScene(“游戏”)
本地选项=
{
效果='从左',
时间=400
}
音频。暂停(游戏声音)
音频。播放(声音)
作曲家。歌托塞内(“飞溅”,选项)
elseif Strokes==3那么
结束
结束
后退按钮:addEventListener(“轻触”,后退按钮)
组:插入(后退按钮)
本地分数=display.newText(分数,display.contentWidth*.30,display.contentHeight*.98,native.systemFontBold,18)
分组:插入(得分)
物理。addBody(形状,“动态”)
局部运动=零
--触摸监听功能
功能形状:触摸(事件)
局部形状=event.target
如果event.phase==“开始”,则
shape.previousX=shape.x
local gameTimer -- forward reference
local timeLimit = 5

local function = timerListener()
  --handles timer event
  timeLimit = timeLimit - 1
  --here you can print the time

  if (timeLimit == 0) then
    --time's up
    timer.cancel(gameTimer)
    gameTimer = nill --we clear it out
    timerLimit = 5 --reset the timer back to 5
    --in here you can print that the player has strike.
    --anything you want to do when the player failed to move the shape
  end
end

gameFunction()
  --code to show the shape
  gameTimer = timer.performWithDelay( 1000, timerListener , 5) 
end --end of gameFunction
local function resetTimer()
    timer.cancel(gameTimer)
    gameTimer = nill
    timerLimit = 5
end