안드로이드/cocos2d-x2016. 1. 17. 02:30

지난 게시물에 이어서

벌집모양으로 배치한 육각형 테두리 안에 여러가지 색의 블록을 위치시킬 것이다.

 

 

 

 

블록 위치 시키기

CGameLayer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef PuzzleGame_GameLayer
#define PuzzleGame_GameLayer
 
#include "Common.h"
 
class CGameLayer : public cocos2d::Layer {
public:
    static cocos2d::Scene* createScene();
 
    virtual bool init();
 
    void startGame();
 
    CREATE_FUNC(CGameLayer);
 
protected:
    Sprite* m_pBoard[COLUMN_COUNT][ROW_COUNT];
};
 
#endif
cs

 

CGameLayer.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void CGameLayer::startGame() {
    for (int x = 0; x < COLUMN_COUNT; x++) {
        for (int y = 0; y < ROW_COUNT; y++) {
            if (x == COLUMN_COUNT - 1 && y % 2 != 0continue;
 
            Sprite* pGameObjectBack = Sprite::create("blockBack.png");
            Sprite* pGameObject = Sprite::create("blockBlue.png");
            m_pBoard[x][y] = pGameObject;
 
            pGameObjectBack->setAnchorPoint(ccp(0.5f, 0.5f));
            pGameObjectBack->setPosition(Common::ComputeXY((float)x, (float)y));
            pGameObject->setAnchorPoint(ccp(0.5f, 0.5f));
            pGameObject->setPosition(Common::ComputeXY((float)x, (float)y));
            
 
            addChild(pGameObjectBack, 1);
            addChild(pGameObject, 2);
        }
    }
}
cs

빨간 줄로 표시한 부분이 추가된 부분이다.

4행 - 짝수 열의 가장 오른쪽 블록을 생성하지 않게 한다.

8행 - m_pBoard[][]에 불러온 이미지를 저장시키는데

     이 것이 앞으로 블록을 제어할 때 쓸 2차원 배열이다.

12,13행 - 육각형테두리와 동일한 방식으로 동일한 좌표로 설정한다.

17행 - Depth를 2로 설정해 육각형테두리보다 위에 그려지게 한다.

 

 정상적으로 파란 색 블록이 위치된 것을 볼 수 있다.

 

 

 

 

 

 

이제 여러가지 색깔을 나타내보자

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
#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);
 
private:
    int m_type;
};
 
#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
26
27
28
29
30
31
32
33
34
#include "GameObject.h"
 
USING_NS_CC;
 
CGameObject::CGameObject() {}
CGameObject::~CGameObject() {}
 
CGameObject* CGameObject::create(const char* pszFileName, const CCRect& rect) {
    CGameObject* pSprite = new CGameObject();
    if (pSprite && pSprite->initWithFile(pszFileName, rect)) {
        pSprite->autorelease();
        return pSprite;
    }
    CC_SAFE_DELETE(pSprite);
    return NULL;
}
 
CGameObject* CGameObject::Create(int type) {
    static std::string objectNames[TYPE_COUNT] = {
        "blockBlue.png",
        "blockBrown.png",
        "blockGreen.png",
        "blockPink.png",
        "blockGreen.png",
        "blockYellow.png"
    };
    if(type<0 || type>TYPE_COUNT-1return NULL;
    CGameObject* pGameObject = CGameObject::create(objectNames[type].c_str(),
        CCRectMake(0.0f, 0.0f, OBJECT_WIDTH, OBJECT_HEIGHT));
    return pGameObject;
}
 
int CGameObject::GetType() { return m_type; }
void CGameObject::SetType(int type) { m_type = type; }
cs

 게임 오브젝트가 많아지고 있으므로 게임 오브젝트를 제어하기 위한 클래스를 추가하여 분리했다.

8~16행 - protected로 처리되어 있는 CGameObject클래스에서 사용할 블록 생성함수이다.

            파일 이름을 받아와 그에 해당하는 블록을 생성한다.

18~31행 - CGameObject클래스 외부에서 호출하는 블록 생성함수이다.

              int type인자로 받아온 블록 번호를 통해 그에 해당하는 블록을 생성한다.

              24행은 원래 Green이 아닌 White인데 디버깅을 위해서 임시로 바꿔두었다.

              어떤 디버깅인지는 잠시 뒤에 나온다.

33,44행 - 나중에 사용될 get,set함수이다. 블록의 색을 바꿀 수 있고, 블록이 현재 무슨 색인지를 검사한다.

 

 

CGameLayer.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
void CGameLayer::startGame() {
    srand(time(NULL));
 
    for (int x = 0; x < COLUMN_COUNT; x++) {
        for (int y = 0; y < ROW_COUNT; y++) {
            if (x == COLUMN_COUNT - 1 && y % 2 != 0continue;
 
            int type = rand() % TYPE_COUNT;
 
            Sprite* pGameObjectBack = Sprite::create("blockBack.png");
            CGameObject* pGameObject = CGameObject::Create(type);
            m_pBoard[x][y] = pGameObject;
 
 
            pGameObjectBack->setAnchorPoint(ccp(0.5f, 0.5f));
            pGameObjectBack->setPosition(Common::ComputeXY((float)x, (float)y));
            pGameObject->setAnchorPoint(ccp(0.5f, 0.5f));
            pGameObject->setPosition(Common::ComputeXY((float)x, (float)y));
            
 
            addChild(pGameObjectBack, 1);
            addChild(pGameObject, 2);
        }
    }
}
cs

 빨간 줄로 표시한 부분이 추가된 부분이다.

2행 - 랜덤함수 시드 초기화

8행 - 0~TYPE_COUNT-1 사이의 랜덤 값을 선정

11행 - 랜덤으로 정해진 블록 번호로 블록을 생성

 

 

 

 

 

 

 

 

좌표계가 어떻게 되있는지 디버깅해보자

CGameLayer.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void CGameLayer::startGame() {
    srand(time(NULL));
 
    for (int x = 0; x < COLUMN_COUNT; x++) {
        for (int y = 0; y < ROW_COUNT; y++) {
            if (x == COLUMN_COUNT - 1 && y % 2 != 0continue;
 
            int type = rand() % TYPE_COUNT;
 
            Sprite* pGameObjectBack = Sprite::create("blockBack.png");
            CGameObject* pGameObject = CGameObject::Create(type);
            m_pBoard[x][y] = pGameObject;
 
            
            // debug --------------------------------------------------------------
            // 각 블록의 좌표를 출력
            std::string str, str2, str3;
            str = std::to_string(x);
            str2 = ",";
            str3 = std::to_string(y);
            str.append(str2);
            str.append(str3);
            auto label = LabelTTF::create(str, "Arial"50);
            Point pos; pos.set(Common::ComputeXY((float)x, (float)y));
            label->setPosition(pos);
            // end of debug -------------------------------------------------------
            
 
 
            pGameObjectBack->setAnchorPoint(ccp(0.5f, 0.5f));
            pGameObjectBack->setPosition(Common::ComputeXY((float)x, (float)y));
            pGameObject->setAnchorPoint(ccp(0.5f, 0.5f));
            pGameObject->setPosition(Common::ComputeXY((float)x, (float)y));
            
 
            addChild(pGameObjectBack, 1);
            addChild(pGameObject, 2);
            addChild(label, 3);
        }
    }
    
}
cs

빨간 줄로 표시한 부분이 추가된 부분이다.

stdio.h와 string.h를 사용하였다.

17~22행 - 2차원 배열의 좌표값을 "x,y"형태로 string에 저장한다.

23~25행 - 글자를 출력하는 기능을 하는 LabelTTF를 통해 블록과 같은 좌표에 글자를 출력한다.

38행 - 글자가 블록보다 위에 있기 위해 Depth를 3으로 설정했다.

 

 

각 블록이 배열의 어느 좌표에 저장되고 있는지를 확인할 수 있다.

이 디버깅은 당분간 계속 켜 둘 예정이다.

Posted by gharlic