cocos2d x-6장 이준환
TRANSCRIPT
![Page 1: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/1.jpg)
CH6. 게임 오브젝트 움직여보기
이준환
![Page 2: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/2.jpg)
• 배경화면 로딩
• 오브젝트 배치
• 사용자의 입력
• 오브젝트 이동
6. 게임 오브젝트 움직여보기
![Page 3: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/3.jpg)
6.1 터치 인터페이스 구현
//GameLayer.cpp
![Page 4: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/4.jpg)
6.1.1 화면 터치
• CCTouch = 하나의 입력에 대한 정보를 가진 클래스
• pTouches = 입력정보를 저장하는 컨테이너
//GameLayer.cpp
![Page 5: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/5.jpg)
6.1.1 화면 터치
• pTouches컨테이너에 가장 첫번째 오브젝트를 가져옴
//GameLayer.cpp
![Page 6: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/6.jpg)
6.1.1 화면 터치
• getLocationInView로 좌표값을 얻어와서 CCPoint 구조체에 저장
• 화면상의 (0, 0)은 좌측 상단
• Coco2d-x상의 (0, 0)은 좌측 하단
• LogCat으로 좌표log 확인 가능
//GameLayer.cpp
![Page 7: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/7.jpg)
6.2 게임 오브젝트 이동
![Page 8: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/8.jpg)
6.2.1 게임 오브젝트 좌표 찾기
• 화면상의 좌표(좌측상단)를 보드상의 좌표로 변경
//GameLayer.cpp
![Page 9: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/9.jpg)
6.2.1 게임 오브젝트 좌표 찾기
• 화면상의 좌표를 보드상의 좌표로 변경
//GameLayer.cpp
![Page 10: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/10.jpg)
6.2.1 게임 오브젝트 좌표 찾기
• GameObject가 저장된 m_pBoard배열에서 boardX, boardY값을 가져옴
• isVisible() = 오브젝트의 가시성을 결정(CCSprite 객체 위에서)
![Page 11: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/11.jpg)
6.2.2 이동 판별 및 교환
• CCSprite를 상속받은 GameObject 클래스를
사용하도록 GameObject 클래스 선언
![Page 12: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/12.jpg)
6.2.2 이동 판별 및 교환
• m_pBoard배열의 타입을 CCSprite*타입에서
GameObject*타입으로 변경
• 사용자의 터치시작을 판단
• 최초로 터치한 보드좌표(X,Y) 저장
![Page 13: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/13.jpg)
6.2.2 이동 판별 및 교환
• m_bTouchStarted 변수가 false일 경우 이동을 인식할 준비
• 화면상의 좌표를 저장하고 추가적인 터치가 작동하지 않도록
m_bTouchStarted=true로 변경
![Page 14: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/14.jpg)
6.2.2 이동 판별 및 교환
• m_bTouchStarted 변수는 false로 들어오므로 터치를 받고 터치가 끝날때에
도 m_bTouchStarted 변수는 false로 바꾸어주어서 터치를 계속 받도록 함
![Page 15: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/15.jpg)
6.2.2 이동 판별 및 교환(드래그)
• getLocationInView()로 터치된 화면상의 좌표를 가져온 후에 이동중인 곳의
보드상의 좌표값을 boardX, boardY에 저장
![Page 16: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/16.jpg)
6.2.2 이동 판별 및 교환(드래그)
• ccTouchesBegan에서 저장해 두었던 보드상의 좌표값이 바뀌었다면 오브젝트
가 이동했다는 뜻이므로 SwapObjetcs로 오브젝트의 위치를 바꾸어 줌
• 오브젝트를 바꿀 때 인접한 오브젝트인지 확인하고 바꾸어줌
• m_bTouchStarted를 false로 해주어서 다음 입력을 받음
![Page 17: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/17.jpg)
6.2.2 이동 판별 및 교환(드래그)
• 오차로 인한 Swap을 방지하기 위해 인접되었는지 확인함
• 0=같은 위치
• 1=인접한 오브젝트(이때만 Swap가능)
• 2=대가선 방향 위치
![Page 18: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/18.jpg)
6.2.2 이동 판별 및 교환(드래그)
• 임시 변수에 첫번째 오브젝트를 저장 하고 교환함
• m_pBoard 배열에 저장된 오브젝트를 교환함
• 화면상에서는 보드상의 좌표를 화면상의 좌표로 변환한 후에 setPosition으로 바
꿈
![Page 19: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/19.jpg)
6.3 액션(Action)의 추가
![Page 20: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/20.jpg)
6.3.1 액션이란?
• 한 지점(각도)에서 특정 지점(각도)까지 지정된 시간 동안 이동하는 액션
• 특수한효과로 깜빡거리기, 페이드인/아웃
• 연속적인 액션사용을 위해 시퀀스개념을 도입
• 시퀀스를 이용하면 이동하면서 동시에 회전도 같이 하는 액션이 가능
• 게임오브젝트를 그래그해서 교환할 때 특정 지점에서 특정 지점까지 지정한 시
간동안 이동하는 액션을 추가함
![Page 21: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/21.jpg)
6.3.2 이동 액션
• 단순 setPosition코드를 삭제
• SetTargetBoardX 함수로 이동할 보
드상의 좌표를 설정
• ProcessSliding 함수는 오브젝트를
움직이게 하는 함수
![Page 22: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/22.jpg)
6.3.2 이동 액션
• GameObject.h에 TargetBoardX(Y)의
Getter/Setter 선언
• ProcessSliding 함수 선언
![Page 23: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/23.jpg)
6.3.2 이동 액션
• 이동하기 전의 좌표를 저장해 놓음
• m_prevBoardY에서 MAX_ROW_COUNT=10에서 Y값을 빼주는 것은 터치 함수
에서 좌표는 좌측 상단이 (0, 0)이고 coco2d-x는 좌측 하단이 (0, 0)이므로
![Page 24: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/24.jpg)
6.3.2 이동 액션
• 이전 위치를 저장한 후에 targetPosition에 목표지점의 좌표를 계산해서 저장
• CCMoveBy 액션 클래스를 사용해서 현재 위치에서 (x, y)의 값만큼 이동하는 액
션(0.1초간격)
• runAction(pMoveBy);
![Page 25: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/25.jpg)
6.3.3.2 콜백 함수
![Page 26: Cocos2d x-6장 이준환](https://reader033.vdocuments.net/reader033/viewer/2022061601/559de2651a28ab59288b47aa/html5/thumbnails/26.jpg)
6.3.3.2 콜백 함수
• CCCallFunc 클래스의 create함수로 콜백 액션을 생성
• Thist 객체의 SlidingCOmpleteHandler를 호출하겠다고 지정한 것