안드로이드/cocos2d-x2016. 1. 17. 05:29

지난 시간까지

구현한 프로젝트를 실행해보면 인접한 두 블록의 위치가 서로 바뀜을 확인할 수 있다.

이번엔 두 블록이 뿅!하고 바뀌는게 아니라 이동하는 액션을 추가하도록 하겠다.

 

액션 - 이동 모션 추가하기

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에서 실행해보도록 한다.

마우스로 클릭->드래그->릴리즈하면 블록이 이동되는 모션을 볼 수 있다.

 

 

 

 

Posted by gharlic