Document Version : V1.3 - 2017.07.07 with cocos2d-x 3.15.1

Document Version : V1.2 - 2015.06.08 with cocos2d-x 3.6

Document Version : V1.1 - 2014.03.14 with cocos2d-x 3.0beta2

Document Version : V1.0 - 2013.07.10 with cocos2d-x 2.1.4


제 책인 "시작하세요! Cocos2d-x 3.0 프로그래밍" 내용을  3.15.1 버전에 맞게 수정하여 올리고 있습니다.

이 글은 네이버카페 "Cocos2d-x 사용자 모임"에 동시에 게재되고 있습니다.


개발환경 : 

  • Windows7
  • Visual Studio Community 2017
  • Cocos2d-x 3.15.1
  • 사용 프로젝트 : proj.win32


웰드 조인트

커맨드창을 열어 원하는 디렉터리로 이동한 후에, 다음과 같이 cocos 명령어를 이용하여 새로운 프로젝트를 생성합니다.


c:> cocos new Box2dEx06 -p com.study.box06 -l cpp  ↵


Box2dEx04의 모든 코드를 방금 만든 Box2dEx06에 적용시킵니다.

Box2dEx04의 Classes 폴더의 다음 파일들을 Box2dEx06의 Classes 폴더에 덮어 쓰면 됩니다.


■ HelloWorldScene.h

■ HelloWorldScene.cpp

■ GLES-Render.h

■ GLES-Render.cpp



그러고 나서 다음의 디렉터리에서 

{Cocos2d-x가 설치된 디렉터리} / tests / cpp-tests / Resources / Images

아래의 파일을 찾아 리소스 폴더에 추가합니다.


■  blocks.png


Box2dEx06은 Box2dEx04 - 마우스 조인트까지 적용된 상태에서 시작합니다.



헤더 부분은 변경된 점이 없습니다.

[ HelloWorldScene.h  박스2D 웰드 조인트 ]

     생략 : Box2dEx04의 코드와 같음 




다음은 웰드 조인트 프로젝트에서 Box2dEx04와 달라진 코드 부분입니다.
setBox2dWorld 메서드에서 웰드 조인트를 생성하는 부분만이 추가되고 다른 것은 변한 것이 없습니다.

[ HelloWorldScene.cpp – 박스2D 웰드 조인트 ]

     생략 : Box2dEx04의 코드와 같음 


void HelloWorld::setBox2dWorld()

{

    // 마우스 조인트 바디를 생성해서 월드에 추가한다.

    bDrag = false;

    gbody = this->addNewSprite(Vec2(00), Size(00), b2_staticBody, nullptr0);


    // *****************************************************************************


    // 바디를 생성해서 월드에 추가한다.

    b2Body* body1, * body2, * body3, * body4;

    b2RevoluteJointDef revJointDef;

    b2WeldJointDef weldJointDef;


    body1 = this->addNewSprite(Vec2(100, winSize.height / 2), Size(6060),

                                                   b2_dynamicBody, "test"0);

    body2 = this->addNewSprite(Vec2(100, winSize.height / 2), Size(3737),

                                                   b2_dynamicBody, "SpinningPeas.png"0);


    revJointDef.Initialize(body1, body2, body1->GetPosition());

    _world->CreateJoint(&revJointDef);



    body3 = this->addNewSprite(Vec2(200, winSize.height / 2), Size(6060),

                                                   b2_dynamicBody, "test"0);

    body4 = this->addNewSprite(Vec2(200, winSize.height / 2), Size(3737),

                                                   b2_dynamicBody, "SpinningPeas.png"0);


    weldJointDef.Initialize(body3, body4, body3->GetPosition());

    _world->CreateJoint(&weldJointDef);

}


     생략 : Box2dEx04의 코드와 같음 



위 코드에서 웰드 조인트는 다음의 코드에서 만들어집니다.
참고로 body1, body2를 연결하는 리볼루트 조인트는 웰드 조인트와의 비교를 위해 추가했습니다.

    b2Body* body1, * body2, * body3, * body4;

    b2WeldJointDef weldJointDef;


    body3 = this->addNewSprite(Vec2(200, winSize.height / 2), Size(6060),

                                                   b2_dynamicBody, "test"0);

    body4 = this->addNewSprite(Vec2(200, winSize.height / 2), Size(3737),

                                                   b2_dynamicBody, "SpinningPeas.png"0);


    weldJointDef.Initialize(body3, body4, body3->GetPosition());

    _world->CreateJoint(&weldJointDef);


body3과 body4 를 조인트로 연결하는데, body3의 위치에 웰드 조인트 위치를 지정한 것입니다. 즉, body3의 위치에 body4가 용접된 것입니다.
리볼루트 조인트와 마찬가지로 두 바디가 반드시 겹쳐 있을 필요는 없습니다.


그리고 addNewSprite 메서드는 앞으로 스프라이트를 추가할 때 사용할 메서드인데, 파라미터로 위치, 크기, 바디의 형태, 이미지 이름, 타입을 사용합니다.

b2Body* addNewSprite(Vec2 point, Size size, b2BodyType bodytype,

                                       const char* spriteName, int type);


파라미터의 이미지 이름을 “test”라고 지정하면 임의의 사각형 그림을 그려지도록 처리했습니다. 또한 nullptr로 지정하면 바디의 유저데이터에 스프라이트를 사용하지 않고 디버그 모드에서만 볼 수 있는 바디의 형태로 나오게 처리했습니다.

그리고 타입은 0을 입력하면 박스 형태를 그리고, 0이 아니면 원형태의 바디를 그리게 됩니다.

 
이제 코드를 실행하면 다음과 같은 화면을 볼 수 있습니다.
좌측의 리볼루트 조인트로 연결된 바디는 마우스로 잡아서 움직이면 안에서 회전을 하나, 우측의 웰드 조인트로 연결된 바디는 용접된 듯이 붙어 있기에 회전하는 모습을 볼 수 없습니다.