지난 시간까지
구현한 프로젝트를 실행해보면 인접한 두 블록의 위치가 서로 바뀜을 확인할 수 있다.
이번엔 두 블록이 뿅!하고 바뀌는게 아니라 이동하는 액션을 추가하도록 하겠다.
액션 - 이동 모션 추가하기
CGameObject.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
34
35
36
37 |
#ifndef PuzzleGame_GameObject
#define PuzzleGame_GameObject
#include "Common.h"
class CGameObject : public Sprite {
public:
CGameObject();
~CGameObject();
protected:
static CGameObject* create(const char* pszFileName, const CCRect& rect);
public:
static CGameObject* Create(int type);
int GetType();
void SetType(int type);
// 액션-이동
int GetTargetBoardX();
void SetTargetBoardX(int x);
int GetTargetBoardY();
void SetTargetBoardY(int x);
void ProcessSliding();
void SlidingCompleteHandler();
private:
int m_type;
// 액션-이동 이동 전 좌표
int m_prevBoardX;
int m_prevBoardY;
// 액션-이동 목표 좌표
int m_targetBoardX;
int m_targetBoardY;
};
#endif |
cs |
빨간색으로 표시된 부분이 변경된 부분이다.
CGameObject.cpp
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 |
// 액션-이동 관련
// ==============================================================================================================
int CGameObject::GetTargetBoardX() { return m_targetBoardX; }
void CGameObject::SetTargetBoardX(int x) { m_targetBoardX = x; }
int CGameObject::GetTargetBoardY() { return m_targetBoardY; }
void CGameObject::SetTargetBoardY(int y) { m_targetBoardY = y; }
void CGameObject::ProcessSliding() {
Point position = getPosition();
m_prevBoardX = Common::ComputeBoardX(position);
m_prevBoardY = Common::ComputeBoardY(position);
Point targetPosition = Common::ComputeXY(m_targetBoardX, m_targetBoardY);
MoveBy* pMoveBy = MoveBy::create(0.1f, ccp(targetPosition.x - position.x, targetPosition.y - position.y));
FiniteTimeAction* pAction = Sequence::create(pMoveBy,
CallFunc::create(this, callfunc_selector(CGameObject::SlidingCompleteHandler)), NULL);
runAction(pMoveBy);
}
void CGameObject::SlidingCompleteHandler() {
}
// ============================================================================================================== |
cs |
위와 같은 코드를 추가한다.
8~20행 - 이 함수가 실행되기 전 미리 SetTargetBoardX, Y 함수를 통해 이동할 목표위치를 받아두어야 한다.
이 함수가 실행되면 현재 배열좌표를 저장해두고
MoveBy 액션을 생성해 실행한다.
http://www.cocos2d-x.org/reference/native-cpp/V3.0beta2/db/d61/classcocos2d_1_1_action.html#details
위 링크를 참고하기 바란다.
다양한 액션 클래스가 존재하는데 모두 ::create로 생성할 수 있다.
MoveBy의 첫번째 인지 0.1f는 0.1초에 거쳐 액션이 수행된다는 뜻이다.
2번째 인자는 현재 위치를 0,0으로 보고 어디로 움직일 지를 뜻한다.
17행은 액션이 완료된 후 특정 함수를 실행하는 역할을 한다.
21행 - 아직 구현하지 않았지만 액션이 완료되고 난 후 호출되는 이벤트 핸들러이다.
CGameLayer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
// 두 블록의 위치를 서로 교환
void CGameLayer::swapObjects(int x1, int y1, int x2, int y2) {
CGameObject* pTemp = m_pBoard[x1][y1];
m_pBoard[x1][y1] = m_pBoard[x2][y2];
m_pBoard[x2][y2] = pTemp;
m_pBoard[x1][y1]->SetTargetBoardX(x1);
m_pBoard[x1][y1]->SetTargetBoardY(y1);
m_pBoard[x2][y2]->SetTargetBoardX(x2);
m_pBoard[x2][y2]->SetTargetBoardY(y2);
m_pBoard[x1][y1]->ProcessSliding();
m_pBoard[x2][y2]->ProcessSliding();
} |
cs |
빨간색으로 표시된 부분이 변경된 부분이다.
7~10행 - 이동할 목표 좌표를 미리 설정한다.
12,13행 - 두 블록을 목표 좌표로 이동시킨다.
여기까지 구현했으면
Visual Studio에서 실행해보도록 한다.
마우스로 클릭->드래그->릴리즈하면 블록이 이동되는 모션을 볼 수 있다.
'안드로이드 > cocos2d-x' 카테고리의 다른 글
퍼즐 게임 만들기10 - 중간 수정 (0) | 2016.01.18 |
---|---|
퍼즐 게임 만들기9 - 블록 매칭 구현하기 (0) | 2016.01.18 |
퍼즐 게임 만들기7 - 터치해서 두 블록의 위치 바꾸기 (0) | 2016.01.17 |
퍼즐 게임 만들기6 - 터치 구현하기2 (0) | 2016.01.17 |
퍼즐 게임 만들기5 - 터치 구현하기1 (0) | 2016.01.17 |