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