인디 게임 강좌

전체보기

모바일 상단 메뉴

본문 페이지

[코코스2D] [Box2D] #08 - 프리스마틱 조인트

아이콘 내폰젤무거워
조회: 1777
2017-07-08 18:17:35

Document Version : V1.3 - 2017.07.08 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 Box2dEx07 -p com.study.box07 -l cpp  ↵


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

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


■ HelloWorldScene.h

■ HelloWorldScene.cpp

■ GLES-Render.h

■ GLES-Render.cpp



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

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

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


■  blocks.png


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



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

[ HelloWorldScene.h  박스2D 프리스마틱 조인트 ]

     생략 : Box2dEx04의 코드와 같음 




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

[ HelloWorldScene.cpp – 박스2D 프리스마틱 조인트 ]

     생략 : Box2dEx04의 코드와 같음 


void HelloWorld::setBox2dWorld()

{

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

    bDrag = false;

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


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


    b2Body* body1, *body2;

    body1 = this->addNewSprite(Vec2(240160), Size(2020),

                                                   b2_staticBodynullptr0);

    body2 = this->addNewSprite(Vec2(240160), Size(4040),

                                                   b2_dynamicBody"SpinningPeas.png"0);

//    body2 = this->addNewSprite(Vec2(240, 160), Size(40, 40),

//                                                   b2_dynamicBody, nullptr, 0);


    b2PrismaticJointDef priJointDef;

    b2PrismaticJoint* priJoint;


    priJointDef.Initialize(body1, body2, body1->GetPosition(), b2Vec2(1.00.0));

    priJointDef.lowerTranslation = -4;

    priJointDef.upperTranslation = 4;

    priJointDef.enableLimit = true;


    priJointDef.enableMotor = true;

    priJointDef.motorSpeed = 4.0;

    priJointDef.maxMotorForce = 100;


    priJoint = (b2PrismaticJoint *)_world->CreateJoint(&priJointDef);

}


     생략 : Box2dEx04의 코드와 같음 




위 코드에서 프리스마틱 조인트는 다음의 코드에서 만들어집니다.

    b2Body* body1, *body2;


    b2PrismaticJointDef priJointDef;

    b2PrismaticJoint* priJoint;


    priJointDef.Initialize(body1, body2, body1->GetPosition(), b2Vec2(1.00.0));


body1과 body2 를 조인트로 연결하는데, body1의 위치에 프리스마틱 조인트 위치를 지정한 것입니다. 즉, body1의 위치에서 body2가 x축으로 이동(b2Vec2(1.00.0))하는 형태의 조인트입니다.


프리스마틱 조인트는 피스톤 운동이나 엘리베이터처럼 지정된 직선 운동만 한다고 앞에서 설명한 바 있습니다. 
이때 움직일 수 있는 범위를 lowerTranslation, upperTranslation 으로 지정합니다. 이 코드에 의해서 body2는 지정된 범위 이상은 움직이지 않게 됩니다.

    priJointDef.lowerTranslation = -4;

    priJointDef.upperTranslation = 4;

    priJointDef.enableLimit = true;


그리고 다음 코드로 모터값을 설정하면 body2가 body1을 기점으로 힘을 받을 때 피스톤 운동을 하게 됩니다.

    priJointDef.enableMotor = true;

    priJointDef.motorSpeed = 4.0;

    priJointDef.maxMotorForce = 100;



완성된 코드를 실행해보면 body2를 움직이면 다시 제자리로 가는 것을 확인할 수 있습니다.












Lv28 내폰젤무거워

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징