제 실수입니다..
- 기존 드래그 틀 (영상에서)
local function drag( event )
if( event.phase == "began" ) then
display.getCurrentStage():setFocus( event.target )
event.target.isFocus = true
-- 드래그 시작할 때
elseif( event.phase == "moved" ) then
if ( event.target.isFocus ) then
-- 드래그 중일 때
event.target.x = event.xStart + event.xDelta
event.target.y = event.yStart + event.yDelta
end
elseif ( event.phase == "ended" or event.phase == "cancelled") then
display.getCurrentStage():setFocus( nil )
event.target.isFocus = false
-- 드래그 끝났을 때
end
end
- 수정본 (week02.md파일에서는 수정됨)
local function drag( event )
if( event.phase == "began" ) then
display.getCurrentStage():setFocus( event.target )
event.target.isFocus = true
-- 드래그 시작할 때
elseif( event.phase == "moved" ) then
if ( event.target.isFocus ) then
-- 드래그 중일 때
event.target.x = event.xStart + event.xDelta
event.target.y = event.yStart + event.yDelta
end
elseif ( event.phase == "ended" or event.phase == "cancelled") then
if ( event.target.isFocus ) then
display.getCurrentStage():setFocus( nil )
event.target.isFocus = false
-- 드래그 끝났을 때
else
display.getCurrentStage():setFocus( nil )
event.target.isFocus = false
end
end
end
-
event.target.isFocus에 대해
-
상호배제를 위한 플래그로 쓰입니다.
-
객체에 이벤트 리스너가 추가되면(object:addEventListener()) 그 객체는 계속 그 이벤트가 발생하는 지 감지하게 되는데, 이벤트 리스너가 돌아가는 와중에도 이벤트를 감지하고 있는 상태가 계속됩니다.
-
이 때문에 동시에 똑같은 코드를 여러번 반복할 수도 있습니다..!
- ex) 드래그가 끝났을 때 점수가 1점 오르기를 바랐지만, 여러번 돌아가는 바람에 2, 3점이 한번에 올라가버린다.
-
이런 경우는 코드가 길고 복잡할 수록 더 심하게 일어납니다.
-
실습 프로젝트에서는 간단한 코드로 진행해서 이런 오류가 나타나지 않았습니다.
-
예시코드 drag()에서 이를 방지하기 위해 사용하는 것이 event.target.isFocus입니다.
if( event.phase == "began" ) then -- 드래그를 시작할 때 event.target.isFocus = true -- isFocus 플래그를 세운다. ... elseif ( event.phase == "ended" or event.phase == "cancelled") then -- 드래그가 끝났을 때 if ( event.target.isFocus ) then -- isFocus 플래그가 세워져 있을 때, event.target.isFocus = false -- 바로 isFocus 플래그를 내린다. -- 드래그가 끝났을 때, 단 한번만 돌아가게 하기 위해서다. score = score + 1 ... end
-
그래서 위와 같이 드래그가 끝났을 때는 isFocus가 true일 때 딱 한번만 돌아가도록 바로 false로 바꿔버린다.
-
원래 이 부분이 들어가야 했지만, 예제 코드를 변형하는 과정에서 빼먹었습니다. 앗 실수~
-