Skip to content

Latest commit

 

History

History
100 lines (73 loc) · 3.43 KB

01.md

File metadata and controls

100 lines (73 loc) · 3.43 KB

드래그 함수 관련 오류

elseif ( event.phase == "ended" or event.phase == "cancelled") then ~ end 부분의 코드가 의도치않게 중복 실행되는 경우

제 실수입니다..

  • 기존 드래그 틀 (영상에서)
	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로 바꿔버린다.

    • 원래 이 부분이 들어가야 했지만, 예제 코드를 변형하는 과정에서 빼먹었습니다. 앗 실수~