안드로이드/cocos2d-x

퍼즐 게임 만들기10 - 중간 수정

gharlic 2016. 1. 18. 18:19

터치를 수정해야한다

 중간 점검 차 Visual Studio에서 디버깅하지 않고

Eclipse로 넘어가 안드로이드 휴대폰에서 디버깅하는 과정에서

터치에 관련된 문제를 찾았다.

 

터치가 조금 이상했다

터치가 묘하게 되다 안되다 하는 느낌이었다.

 

 

이유는 이랬다

 기존의 터치는 좌측 사진과 같았다.

터치 -> 드래그 -> 릴리즈해서

릴리즈된 위치의 블록과 swap하는 방식이었다.

 

문제는 터치를 딱! 그 블록까지만 해야한다는 것이다.

우측 사진과 같이 손가락이 더 멀리가면 문제가 생긴다는 것이다.

 

 개선된 방식은 다음과 같다

터치 -> 드래그 -> 드래그 중 인접한 블록을 찾아 스왑

손가락이 더 멀리가더라도 드래그하는 도중 인접한 블록을 찾았으면

바로 스왑해버리기 때문에

손가락을 길게 늘려도 정상적으로 터치한다.

 

CGameLayer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    // [ 터치 제어 ]
    void onTouchesBegan(const std::vector<cocos2d::Touch*>&pTouches, cocos2d::Event* pEvent) {
        if (!m_bTouchStarted) {
            Touch* pTouch = (Touch*)pTouches.back();
            Point point = pTouch->getLocation();
 
            m_gestureStartBoardX = Common::ComputeBoardX(point);
            m_gestureStartBoardY = Common::ComputeBoardY(point);
 
            m_bTouchStarted = true;
        }
    }
    void onTouchesMoved(const std::vector<cocos2d::Touch*>&pTouches, cocos2d::Event* pEvent) {
        if (m_bTouchStarted) {
            Touch* pTouch = (Touch*)pTouches.back();
            Point point = pTouch->getLocation();
 
            int boardX = Common::ComputeBoardX(point);
            int boardY = Common::ComputeBoardY(point);
 
            if (m_gestureStartBoardX != boardX || m_gestureStartBoardY != boardY)
            if (isAdjacent(m_gestureStartBoardX, m_gestureStartBoardY, boardX, boardY)) {
                swapObjects(m_gestureStartBoardX, m_gestureStartBoardY, boardX, boardY);
                m_bTouchStarted = false;
            }
        }
    }
    void onTouchesEnded(const std::vector<cocos2d::Touch*>&pTouches, cocos2d::Event* pEvent) {
        if (m_bTouchStarted) {
            Touch* pTouch = (Touch*)pTouches.back();
            Point point = pTouch->getLocation();
        }
    }
cs

 

변경된 점은 onTouchesEnded()에 있던 코드를

onTouchesMoved로 옮겨 터치가 이어지고 있는 도중

계속해서 인접한 블록이 있는지를 검사하는 방식으로 변경되었다.

 

24행 - m_bTouchStarted = false; 를 if문 안으로 옮겼다