第六話 時間控制

第六話 時間控制

第五話的章節,我試著用故事的方式來說明程式概念,但是這樣的做法可能會造成過多的廢話,內容不夠精萃,而有趣度也沒得到網友的共鳴。

在學習效度的評估上,決定第六話還是回到以技術教學文為主,輔以一些生活範例來進行解說的方式。

Corona在時間的相關控制,是在timer這個Library進行實作,主要目的是讓開發者能在某段時間後呼叫一個function而非立即呼叫。

 

講到timer的生活中類似的概念,就像是廚房常用的鬧鐘,一般會需要的三個要素,那就是多久跑一格?當時間到的時候要做什麼,通知誰?以及究竟要跑幾次?

想像上方的這個咕咕雞鬧鐘,每十秒跑一格就會叫一聲咕咕,也就是每十秒呼叫一次function的概念,而function的內容就是咕咕叫。當十秒時間一到,就需要知道要呼叫哪一個function,也就是所謂前稱通知誰的概念。最後,究竟是通知一次這個鬧鐘就結束還是要跑固定次數甚至是無窮次數,也需要你來告訴它。

概念很簡單,就讓我們來說明關鍵程式碼

1.利用performWithDelay來建立timer

   範例:

local tmr = timer.performWithDelay( 2000 ,gugu , -1 )

暫停timer,意即讓鬧鐘暫停轉動,回傳值為剩餘微秒

    範例:

local result = timer.pause( tmr )

啟動timer,意即取消鬧鐘的暫停,回傳值為剩餘微秒

    範例:

local result = timer.resume( tmr )

取消timer,意即關掉鬧鐘

     範例:

timer.cancel( tmr )

傳入參數到timer裡頭以及取出,如果需要將參數傳到偵聽的function時可用的技巧

     範例:


tmr.params = { myParam1 = “Parameter1” , myParam2 = “Parameter2” }
local params = event.source.params  --從timer取出參數

細節小知識:

  1.  timer時間區間的最小單位為1000/FPS
  2. 當App跳出時,timer並不會自動暫停,需要自行暫停

最後,放上本話的範例碼,主要示範如何使用Timer來製作碼表功能。


-----------------------------------------------------------------------------------------
-- 本範例用來解說如何使用Timer來搭配performWithDelay,如需更多資料請參考下列網址
-- https://docs.coronalabs.com/api/library/timer/performWithDelay.html
-- Author: Zack Lin
-- Time: 2015/8/17
-----------------------------------------------------------------------------------------
_SCREEN = {
	WIDTH = display.viewableContentWidth,
	HEIGHT = display.viewableContentHeight
}
_SCREEN.CENTER = {
	X = display.contentCenterX,
	Y = display.contentCenterY
}

----UI設置區塊
--顯示碼表數字
local output = display.newText( "10.0", 0, 0, native.systemFont, 64 )
output:setTextColor( 255, 255, 255 )
output.x = _SCREEN.WIDTH * 0.5
output.y = _SCREEN.HEIGHT * 0.5

--顯示狀態文字
local stateText = display.newText( "Paused", 0 , 0 ,  native.systemFont , 24 )
stateText:setTextColor( 255 , 255 , 255 )
stateText.x = _SCREEN.WIDTH * 0.5
stateText.y = _SCREEN.HEIGHT - 20

--指向Timer的變數,用以控制Timer
local tmr
local sec = 10.0

--偵聽performWithDelay的function,取用e.count可以得知被呼叫的次數
function listener (e)

	--[[此為數字增加的版本
	output.text = e.count
	if(e.count == 40) then
		timer.cancel( tmr )
		tmr = nil;
		stateText.text = "Timer Finished"
	end
	]]
	
	
	if sec >= 0.1 then
		print( "sec:" .. sec )
		sec = sec - 0.1
		--將浮點數格式化為指定格式,下例為保持小數點後一位
		output.text = string.format( "%.1f",sec )
	else 
		-- 取用timer裡的params
		local params = e.source.params
		print('Name:' .. params.name)
		print('Version:' .. params.version)

		output.text = "0.0"
		-- 將timer取消
		timer.cancel( tmr )
		tmr = nil;
		stateText.text = "Timer Finished"

	end
end

--  timer可用來監視時間,performWithDelay用於當過一指定期間便會通知偵聽器
--  第一個參數為期間,單位為微秒
--  第二個參數為偵聽器
--  第三為呼叫幾次後結束,如為無限可設為-1 or 0,預設為1
tmr = timer.performWithDelay( 100, listener, -1)
--可設定改timer使用的參數
tmr.params = {name='zack' , version='1.0'}

--暫停指定的timer
timer.pause( tmr )
local pause = true


local function touchHandler(e)
	if(tmr) then
		if(e.phase == "ended" or e.phase == "canceled") then
			if(pause == false) then
				timer.pause( tmr )
				stateText.text = "Paused"
				pause = true
			elseif(pause == true) then
				--重新啟動Timer
				timer.resume( tmr )
				stateText.text = "Running"
				pause = false
			end
		end
	end
	--print('touchHandler')
end

--當該timer已經用不到,可以將該timer給cancel掉
--timer.cancel( tmr )

--追蹤螢幕上所有的Touch事件
Runtime:addEventListener( "touch", touchHandler )


更多timer相關的資訊,可參考網址

分享這篇文章:

發佈自 林品爵

林品爵
一個堅信程式教育能夠改變下一代未來的狂熱者,青少年揚帆計畫的推動者。十年以上全端程式開發,上百場程式教學經驗,累積學生數達百人以上。 成大學士畢業,使用過J2EE.PHP.MySQL.CoronaSDK.Android.Objective-C.Swift.Python等技術知識,歷任友訊科技總部Java工程師首席.黑快馬股份有限公司研發經理.諾亞數碼娛樂執行長等職位,現任哥布林程式教育學苑創辦人,所開發過專案涵括產品管理系統.POS系統.拍賣平台.擴增實境.問券.社區等等。因觀察到學員英文不好產生挫折發展出布林程式教育系統。

關聯文章:

留下留言