Cocos2d x-6장 이준환

26
CH6. 게임 오브젝트 움직여보기 이준환

Transcript of Cocos2d x-6장 이준환

Page 1: Cocos2d x-6장 이준환

CH6. 게임 오브젝트 움직여보기

이준환

Page 2: Cocos2d x-6장 이준환

• 배경화면 로딩

• 오브젝트 배치

• 사용자의 입력

• 오브젝트 이동

6. 게임 오브젝트 움직여보기

Page 3: Cocos2d x-6장 이준환

6.1 터치 인터페이스 구현

//GameLayer.cpp

Page 4: Cocos2d x-6장 이준환

6.1.1 화면 터치

• CCTouch = 하나의 입력에 대한 정보를 가진 클래스

• pTouches = 입력정보를 저장하는 컨테이너

//GameLayer.cpp

Page 5: Cocos2d x-6장 이준환

6.1.1 화면 터치

• pTouches컨테이너에 가장 첫번째 오브젝트를 가져옴

//GameLayer.cpp

Page 6: Cocos2d x-6장 이준환

6.1.1 화면 터치

• getLocationInView로 좌표값을 얻어와서 CCPoint 구조체에 저장

• 화면상의 (0, 0)은 좌측 상단

• Coco2d-x상의 (0, 0)은 좌측 하단

• LogCat으로 좌표log 확인 가능

//GameLayer.cpp

Page 7: Cocos2d x-6장 이준환

6.2 게임 오브젝트 이동

Page 8: Cocos2d x-6장 이준환

6.2.1 게임 오브젝트 좌표 찾기

• 화면상의 좌표(좌측상단)를 보드상의 좌표로 변경

//GameLayer.cpp

Page 9: Cocos2d x-6장 이준환

6.2.1 게임 오브젝트 좌표 찾기

• 화면상의 좌표를 보드상의 좌표로 변경

//GameLayer.cpp

Page 10: Cocos2d x-6장 이준환

6.2.1 게임 오브젝트 좌표 찾기

• GameObject가 저장된 m_pBoard배열에서 boardX, boardY값을 가져옴

• isVisible() = 오브젝트의 가시성을 결정(CCSprite 객체 위에서)

Page 11: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환

• CCSprite를 상속받은 GameObject 클래스를

사용하도록 GameObject 클래스 선언

Page 12: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환

• m_pBoard배열의 타입을 CCSprite*타입에서

GameObject*타입으로 변경

• 사용자의 터치시작을 판단

• 최초로 터치한 보드좌표(X,Y) 저장

Page 13: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환

• m_bTouchStarted 변수가 false일 경우 이동을 인식할 준비

• 화면상의 좌표를 저장하고 추가적인 터치가 작동하지 않도록

m_bTouchStarted=true로 변경

Page 14: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환

• m_bTouchStarted 변수는 false로 들어오므로 터치를 받고 터치가 끝날때에

도 m_bTouchStarted 변수는 false로 바꾸어주어서 터치를 계속 받도록 함

Page 15: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환(드래그)

• getLocationInView()로 터치된 화면상의 좌표를 가져온 후에 이동중인 곳의

보드상의 좌표값을 boardX, boardY에 저장

Page 16: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환(드래그)

• ccTouchesBegan에서 저장해 두었던 보드상의 좌표값이 바뀌었다면 오브젝트

가 이동했다는 뜻이므로 SwapObjetcs로 오브젝트의 위치를 바꾸어 줌

• 오브젝트를 바꿀 때 인접한 오브젝트인지 확인하고 바꾸어줌

• m_bTouchStarted를 false로 해주어서 다음 입력을 받음

Page 17: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환(드래그)

• 오차로 인한 Swap을 방지하기 위해 인접되었는지 확인함

• 0=같은 위치

• 1=인접한 오브젝트(이때만 Swap가능)

• 2=대가선 방향 위치

Page 18: Cocos2d x-6장 이준환

6.2.2 이동 판별 및 교환(드래그)

• 임시 변수에 첫번째 오브젝트를 저장 하고 교환함

• m_pBoard 배열에 저장된 오브젝트를 교환함

• 화면상에서는 보드상의 좌표를 화면상의 좌표로 변환한 후에 setPosition으로 바

Page 19: Cocos2d x-6장 이준환

6.3 액션(Action)의 추가

Page 20: Cocos2d x-6장 이준환

6.3.1 액션이란?

• 한 지점(각도)에서 특정 지점(각도)까지 지정된 시간 동안 이동하는 액션

• 특수한효과로 깜빡거리기, 페이드인/아웃

• 연속적인 액션사용을 위해 시퀀스개념을 도입

• 시퀀스를 이용하면 이동하면서 동시에 회전도 같이 하는 액션이 가능

• 게임오브젝트를 그래그해서 교환할 때 특정 지점에서 특정 지점까지 지정한 시

간동안 이동하는 액션을 추가함

Page 21: Cocos2d x-6장 이준환

6.3.2 이동 액션

• 단순 setPosition코드를 삭제

• SetTargetBoardX 함수로 이동할 보

드상의 좌표를 설정

• ProcessSliding 함수는 오브젝트를

움직이게 하는 함수

Page 22: Cocos2d x-6장 이준환

6.3.2 이동 액션

• GameObject.h에 TargetBoardX(Y)의

Getter/Setter 선언

• ProcessSliding 함수 선언

Page 23: Cocos2d x-6장 이준환

6.3.2 이동 액션

• 이동하기 전의 좌표를 저장해 놓음

• m_prevBoardY에서 MAX_ROW_COUNT=10에서 Y값을 빼주는 것은 터치 함수

에서 좌표는 좌측 상단이 (0, 0)이고 coco2d-x는 좌측 하단이 (0, 0)이므로

Page 24: Cocos2d x-6장 이준환

6.3.2 이동 액션

• 이전 위치를 저장한 후에 targetPosition에 목표지점의 좌표를 계산해서 저장

• CCMoveBy 액션 클래스를 사용해서 현재 위치에서 (x, y)의 값만큼 이동하는 액

션(0.1초간격)

• runAction(pMoveBy);

Page 25: Cocos2d x-6장 이준환

6.3.3.2 콜백 함수

Page 26: Cocos2d x-6장 이준환

6.3.3.2 콜백 함수

• CCCallFunc 클래스의 create함수로 콜백 액션을 생성

• Thist 객체의 SlidingCOmpleteHandler를 호출하겠다고 지정한 것