반응형
안녕하세요?
이번주에는 코로나에서 enterFrame에 대한 블로그 강좌를 했네요.
이 강좌 내용을 아래에 정리했습니다.
원본은 여기를 클릭하시면 보실 수 있습니다.
Understanding Corona’s enterFrame Event
오늘은 코로나의 enterFrame Event에 대해 알아보겠습니다.
Event 전반에 대해 알고 싶으시면 여기를 클릭하세요.
****** What is an enterFrame event?
앱이 시작하면서 여러분의 앱은 아주 빠른 속도로 화면을 새로 갱신하면서 보여주게 됩니다.
이 속도를 나타내는 단위는 frames-per-second (FPS)입니다. 코로나에서는 두가지 세팅을 지원하는데요. 30과 60 FPS입니다.
관련된 정보는 여기에 있습니다.
이 속도를 다른 말로는 framerate이라고도 합니다.
여러분이 config.lua파일에 60FPS로 설정을 했으면 이것은 1초에 스크린을 60번 다시 그린다는 겁니다.
enterFrame아라는 말은 새로운 프레임에 entering하는 순간을 말합니다. 즉 framerate이 30이라면 이 enterFrame이벤트는 1초에 30번 일어나게 됩니다.
그러니까 이 enterFrame 이벤트를 사용하면 여러분은 매 프레임마다 어떤 컨트롤을 할 수 있게 되는 겁니다.
****** enterFrame Listeners
이 enterFrame이벤트와 다른 많은 코로나 이벤트와 다른점은 리스너를 Runtime으로만 설정할 수 있다는 겁니다.
각 object마다 이 enterFrame을 따로 적용할 수는 없습니다.
아래 이 enterFrame 사용 예제를 보세요.
-- listener function
local function onEveryFrame( event )
print( "This function will be called on every frame." )
end
-- assign the above function as an "enterFrame" listener
Runtime:addEventListener( "enterFrame", onEveryFrame )
우선 함수를 만들고 그 다음에 Runtime에 enterFrame 이벤트를 add합니다.
이 예제는 아주 기본적인 거구요. 다음 예제에서 조금 응용한 걸 보여드리겠습니다.
***** Translating objects
아래 예제는 각 프레임마다 객체가 천천히 아래로 내려갔다가 한번에 다시 올라가고 또 내려오는 동작을 반복하는 움직임을 보일 겁니다.
local ball = display.newImage( "redball.png" )
ball.x = math.random( display.contentWidth )
ball.y = -ball.contentHeight
-- listener function for enterFrame event
local function onEveryFrame( event )
ball:translate( 0, 1 ) -- move ball 1pt down on every frame
-- move ball above top of screen when it goes below the screen
if ball.y > display.contentHeight then
ball.y = -ball.contentHeight
end
end
-- assign the above function as an "enterFrame" listener
Runtime:addEventListener( "enterFrame", onEveryFrame )
***** Tracking Time
enterFrame 리스너의 이벤트 테이블 안에는 여러분의 앱이 시작한 이후부터 지금까지의 시간에 대한 정보가 들어있습니다.
event.time이 시작한 시간인데요. system.getTimer()메소드를 통해서 값을 얻을 수 있습니다.
아래 예제는 유저가 버튼을 누르고 3초 이상 지났을 때를 체크하는 코드 입니다.
local timeThresh = 3
local button = display.newImage( "button.png" )
button.markTime = system.getTimer()
-- enterFrame listener function
local function trackTime( event )
local secondsPassed = (event.time - button.markTime) / 1000 -- divide by 1k to get seconds
if secondsPassed >= timeThresh then
print( "You held down the button for at least " .. timeThresh .. " seconds." )
-- stop tracking time
Runtime:removeEventListener( "enterFrame", trackTime )
end
end
-- touch event for the button object
function button:touch( event )
if event.phase == "began" then
print("Touched");
-- assign touch focus to this object
display.getCurrentStage():setFocus( self )
self.isFocus = true
-- mark time and start tracking time with enterFrame listener
self.markTime = system.getTimer()
Runtime:addEventListener( "enterFrame", trackTime )
elseif self.isFocus then
if event.phase == "ended" or event.phase == "cancelled" then
-- stop tracking time
Runtime:removeEventListener( "enterFrame", trackTime )
-- remove touch focus from button
display.getCurrentStage():setFocus( nil )
self.isFocus = false
end
end
return true
end
button:addEventListener( "touch", button )
이 코드 아주 유용하게 쓰여질 수도 있겠네요.
****** Special Considerations
이 enterFrame은 각 프레임별로 체크를 하기 때문에 아주 강력합니다. 대신에 메모리를 많이 소비하므로 꼭 필요할 때만
사용하고 그렇지 않을 때는 없애 줘야 합니다.
한 scene에서 enterFrame을 사용했는데 다른 scene으로 넘어갈 때 이 enterFrame을 제거하지 않는다면 유저가 다시 첫번째
scene으로 돌아 왔을 때는 각 프레임마다 이 enterFrame이 두번 실행 될 겁니다.
다시 다른데 갔다가 돌아오면 세번 실행되겠죠? 각 프레임마다.... 그럼 performance가 아주 형편 없어질 겁니다.
이 enterFrame사용시 절대 잊어서는 안되는 것이 이런 상황을 만들지 않는 겁니다.
~~~~~ ~~~~~
이번주에는 코로나에서 enterFrame에 대한 블로그 강좌를 했네요.
이 강좌 내용을 아래에 정리했습니다.
원본은 여기를 클릭하시면 보실 수 있습니다.
Understanding Corona’s enterFrame Event
오늘은 코로나의 enterFrame Event에 대해 알아보겠습니다.
Event 전반에 대해 알고 싶으시면 여기를 클릭하세요.
****** What is an enterFrame event?
앱이 시작하면서 여러분의 앱은 아주 빠른 속도로 화면을 새로 갱신하면서 보여주게 됩니다.
이 속도를 나타내는 단위는 frames-per-second (FPS)입니다. 코로나에서는 두가지 세팅을 지원하는데요. 30과 60 FPS입니다.
관련된 정보는 여기에 있습니다.
이 속도를 다른 말로는 framerate이라고도 합니다.
여러분이 config.lua파일에 60FPS로 설정을 했으면 이것은 1초에 스크린을 60번 다시 그린다는 겁니다.
enterFrame아라는 말은 새로운 프레임에 entering하는 순간을 말합니다. 즉 framerate이 30이라면 이 enterFrame이벤트는 1초에 30번 일어나게 됩니다.
그러니까 이 enterFrame 이벤트를 사용하면 여러분은 매 프레임마다 어떤 컨트롤을 할 수 있게 되는 겁니다.
****** enterFrame Listeners
이 enterFrame이벤트와 다른 많은 코로나 이벤트와 다른점은 리스너를 Runtime으로만 설정할 수 있다는 겁니다.
각 object마다 이 enterFrame을 따로 적용할 수는 없습니다.
아래 이 enterFrame 사용 예제를 보세요.
-- listener function
local function onEveryFrame( event )
print( "This function will be called on every frame." )
end
-- assign the above function as an "enterFrame" listener
Runtime:addEventListener( "enterFrame", onEveryFrame )
우선 함수를 만들고 그 다음에 Runtime에 enterFrame 이벤트를 add합니다.
이 예제는 아주 기본적인 거구요. 다음 예제에서 조금 응용한 걸 보여드리겠습니다.
***** Translating objects
아래 예제는 각 프레임마다 객체가 천천히 아래로 내려갔다가 한번에 다시 올라가고 또 내려오는 동작을 반복하는 움직임을 보일 겁니다.
local ball = display.newImage( "redball.png" )
ball.x = math.random( display.contentWidth )
ball.y = -ball.contentHeight
-- listener function for enterFrame event
local function onEveryFrame( event )
ball:translate( 0, 1 ) -- move ball 1pt down on every frame
-- move ball above top of screen when it goes below the screen
if ball.y > display.contentHeight then
ball.y = -ball.contentHeight
end
end
-- assign the above function as an "enterFrame" listener
Runtime:addEventListener( "enterFrame", onEveryFrame )
***** Tracking Time
enterFrame 리스너의 이벤트 테이블 안에는 여러분의 앱이 시작한 이후부터 지금까지의 시간에 대한 정보가 들어있습니다.
event.time이 시작한 시간인데요. system.getTimer()메소드를 통해서 값을 얻을 수 있습니다.
아래 예제는 유저가 버튼을 누르고 3초 이상 지났을 때를 체크하는 코드 입니다.
local timeThresh = 3
local button = display.newImage( "button.png" )
button.markTime = system.getTimer()
-- enterFrame listener function
local function trackTime( event )
local secondsPassed = (event.time - button.markTime) / 1000 -- divide by 1k to get seconds
if secondsPassed >= timeThresh then
print( "You held down the button for at least " .. timeThresh .. " seconds." )
-- stop tracking time
Runtime:removeEventListener( "enterFrame", trackTime )
end
end
-- touch event for the button object
function button:touch( event )
if event.phase == "began" then
print("Touched");
-- assign touch focus to this object
display.getCurrentStage():setFocus( self )
self.isFocus = true
-- mark time and start tracking time with enterFrame listener
self.markTime = system.getTimer()
Runtime:addEventListener( "enterFrame", trackTime )
elseif self.isFocus then
if event.phase == "ended" or event.phase == "cancelled" then
-- stop tracking time
Runtime:removeEventListener( "enterFrame", trackTime )
-- remove touch focus from button
display.getCurrentStage():setFocus( nil )
self.isFocus = false
end
end
return true
end
button:addEventListener( "touch", button )
이 코드 아주 유용하게 쓰여질 수도 있겠네요.
****** Special Considerations
이 enterFrame은 각 프레임별로 체크를 하기 때문에 아주 강력합니다. 대신에 메모리를 많이 소비하므로 꼭 필요할 때만
사용하고 그렇지 않을 때는 없애 줘야 합니다.
한 scene에서 enterFrame을 사용했는데 다른 scene으로 넘어갈 때 이 enterFrame을 제거하지 않는다면 유저가 다시 첫번째
scene으로 돌아 왔을 때는 각 프레임마다 이 enterFrame이 두번 실행 될 겁니다.
다시 다른데 갔다가 돌아오면 세번 실행되겠죠? 각 프레임마다.... 그럼 performance가 아주 형편 없어질 겁니다.
이 enterFrame사용시 절대 잊어서는 안되는 것이 이런 상황을 만들지 않는 겁니다.
반응형
'Corona SDK > Corona SDK TIPs' 카테고리의 다른 글
Corona SDK 수요일의 FAQ (0) | 2012.04.22 |
---|---|
Corona SDK로부터 받은 답변 (2) | 2012.04.18 |
Ansca (Corona SDK) CEO의 Stanford 대학 강의 (0) | 2012.04.16 |
imageSuffix로 디바이스 해상도에 맞는 이미지 출력하기 (0) | 2012.02.27 |
코로나로 물방울 올라가는 효과 내기 (0) | 2012.02.26 |
Corona SDK로 cross platform 앱 개발시 주의해야 할 10가지 (4) | 2012.02.09 |
iOS - armv6 (-19033) error (0) | 2012.01.25 |
앱 화면 Screen Capture하기 (0) | 2011.12.29 |
Modular Classes in Corona - 모듈과 클래스 이해하기 - (0) | 2011.12.08 |
코로나로 책장 넘기는 효과 주기 (0) | 2011.12.06 |