지난 게시물에 이어서
벌집모양으로 배치한 육각형 테두리 안에 여러가지 색의 블록을 위치시킬 것이다.
블록 위치 시키기
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 != 0) continue;
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-1) return 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 != 0) continue;
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 != 0) continue;
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으로 설정했다.
각 블록이 배열의 어느 좌표에 저장되고 있는지를 확인할 수 있다.
이 디버깅은 당분간 계속 켜 둘 예정이다.
'안드로이드 > cocos2d-x' 카테고리의 다른 글
퍼즐 게임 만들기6 - 터치 구현하기2 (0) | 2016.01.17 |
---|---|
퍼즐 게임 만들기5 - 터치 구현하기1 (0) | 2016.01.17 |
퍼즐 게임 만들기3 - 게임화면에 블록 출력하기1 (0) | 2016.01.17 |
퍼즐 게임 만들기2 - 배경 이미지, 아이콘 등 리소스 만들기 (0) | 2016.01.17 |
퍼즐 게임 만들기1 - 프로젝트 생성 및 세팅 (0) | 2016.01.16 |