VioletaBabel

10일 : cocos2d-x 입문 본문

BCA/2. Cocos2d-x
10일 : cocos2d-x 입문
Beabletoet 2018. 2. 21. 14:55

코코스2d-x 프로젝트 만들기


콘솔에서 만들 폴더를 향해 cd로 이동 후

cocos new Mycppgame -p kr.academy.sample -l cpp

같은 식으로 입력하면 된다.


new는 새 프로젝트 생성

-p는 패키지 이름

-l은 개발에 쓸 언어



--

cocos2d-x

씬 안에 레이어가 있다. 레이어는 스프라이트를 가진다.


cocos2d-x는 new와 delete를 쓰지 않는다.

new 대신 create라는 함수를 사용. 자동으로 지워지는 명령어가 들어가있음.

따로 메모리를 우리가 관리할 필요가 없다.




========================================================

cocos2d-x에 새로운 씬 만들기


기본적으로 AppDelegate.cpp, AppDelegate.h, HelloWorldScene.cpp, HelloWorldScene.h가 있다.


추가적으로 GameScene과 GameLayer라는 클래스를 만들어주자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//GameScene.h
#pragma once
 
#include<cocos2d.h>
//using namespace cocos2d;
USING_NS_CC; // using namespace cocos2d; 를 줄여놓은 것.
 
class GameScene : public Scene //씬을 만들 것이므로 씬을 상속받자.
{
public:
    GameScene();
    ~GameScene();
    bool init();
    CREATE_FUNC(GameScene); 
    // 크리에이트펑션이란 매크로.
    // 이닛 해주고 오토릴리즈 해주는 애라고 함.
    // 매 프레임마다 검사하며 부모 클래스가 없으면 죽임(메모리를 알아서 관리)
};
cs


1
2
3
4
5
6
7
8
9
10
11
12
//GameLayer.h
#pragma once
#include <cocos2d.h>
USING_NS_CC;
class GameLayer : public Layer
{
public:
    GameLayer();
    ~GameLayer();
    bool init();
    CREATE_FUNC(GameLayer);
};
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "GameScene.h"
#include "GameLayer.h"
GameScene::GameScene()
{
}
GameScene::~GameScene()
{
}
bool GameScene::init()
{
    GameLayer* pLayer = GameLayer::create();
    addChild(pLayer); // 위에 게임레이어헤더를 부르고 이렇게 함으로써 씬에서도 레이어를 갖다붙일 수 있게 됨.
    return true;
}
cs


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
#include "GameLayer.h"
GameLayer::GameLayer()
{
}
GameLayer::~GameLayer()
{
}
bool GameLayer::init()
{
    //인터넷에 다운받아 프로젝트 폴더의 Resources 폴더의 res 폴더에 넣은 이미지파일을 스프라이트로 만든다.
    Sprite* pSprite = Sprite::create("res/moomin.png");
    /* // 정적인 이동법
    pSprite->setPosition(240, 160); // 위치를 240, 160으로 옮김
    pSprite->setScale(1.2f); // 1.2배 크기로 만듦
    pSprite->setRotation(90); // 시계 방향으로 90도 회전
    */
    
    MoveTo* pMove = MoveTo::create(1.0f, Point(240160)); // 1초동안 (240, 160)으로 이동시키는 이동을 만든다.
    pSprite->runAction(pMove); // pSprite가 pMove 이동을 하게 한다.
    
    RotateTo* pRot = RotateTo::create(1.5f, 90.0f); // 1.5초동안 90도로 회전
 
    ScaleTo* pSc = ScaleTo::create(1.5f, 2.0f); //1.5초동안 2배로 커짐
 
    //Sequence* pSeq = Sequence::create(pRot, pSc, NULL); // pRot과 pSc가 이어서 실행
    Spawn* pSpawn = Spawn::create(pRot, pSc, NULL); // 이건 동시에 실행.
    //pSprite->runAction(pSeq); // pSprite가 pSeq를 하게 함
    pSprite->runAction(pSpawn); // pSpawn 실행
 
    addChild(pSprite);//pSprite를 레이어의 자식으로 넣는다.
    return true;
}
cs



그리고 AppDelegate.cpp를 열어서

1
#include"../proj.win32/GameScene.h" // 직접 만든 GameScene.h를 불러온다.
cs

를 불러온다.


1
2
    //auto scene = HelloWorld::createScene(); // 씬을 만든다
    auto scene = GameScene::create(); // 우리가 만든 씬을 넣는다.
cs

기본으로 뜨는 씬을 우리가 만든 씬으로 대체한다.








CREATE_FUNC(GameScene);를 하면

GameScene* scene = GameScene::create(); 라는 방식으로 생성이 가능해진다.

이렇게 하면 저 매크로 안의 autorelease 함수를 호출하여 autorelease pool에 들어가게 되고, delete를 안해도 알아서 메모리가 필요 없어지면 지워주게 된다.

코코스에서는 기본적으로 사용하는 방식이니 꼭 기억해둘 것.


addChild(pLayer)는 객체를 화면에 출력하는 메소드인데, 위의 코드처럼 보면 pLayer라는 객체를 화면에 종속시키는 역할을 한다고 보면 된다. 부모-자식관계가 되기에 부모가 화면에서 안보이면 자식도 안보이고, 부모의 좌표가 바뀌면 자식도 함께 바뀐다. addChild는 addChild(pLayer, 1) 같은 식으로 두 번째 인수에 z값을 줄 수 있는데, 같은 위치에 이미지가 겹치면 z값이 큰 것이 위에 놓이고, z값을 설정하지 않은 경우(0으로 설정됨) 나중에 한 것이 더 위에 놓여진다.





Comments