인디 게임 강좌

전체보기

모바일 상단 메뉴

본문 페이지

[코코스2D] [Box2D] #14 - 휠 조인트

아이콘 내폰젤무거워
조회: 2403
2017-07-13 19:26:58

Document Version : V1.3 - 2017.07.13 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 Box2dEx13 -p com.study.box13 -l cpp  ↵


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

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


■ HelloWorldScene.h

■ HelloWorldScene.cpp

■ GLES-Render.h

■ GLES-Render.cpp



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

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

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


■  blocks.png


Box2dEx13은 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);


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


    b2WheelJointDef jd1;

    b2WheelJointDef jd2;


    body0 = this->addNewSprite(Vec2(34070), Size(10040), b2_dynamicBody, nullptr0);

    b2Body* body1 = this->addNewSprite(Vec2(31050), Size(3030),

                                                                  b2_dynamicBody, nullptr1);

    b2Body* body2 = this->addNewSprite(Vec2(37050), Size(3030),

                                                                  b2_dynamicBody, nullptr1);


    b2Vec2 axis(0.0f1.0f);


    jd1.Initialize(body0, body1, body1->GetPosition(), axis);

    jd1.motorSpeed = 30.0f;

    jd1.maxMotorTorque = 20.0f;

    jd1.enableMotor = true;

    jd1.frequencyHz = 4.0f;

    //jd1.dampingRatio = 0.7f;


    jd2.Initialize(body0, body2, body2->GetPosition(), axis);

    jd2.motorSpeed = 30.0f;

    jd2.maxMotorTorque = 20.0f;

    jd2.enableMotor = true;

    jd2.frequencyHz = 4.0f;

    //jd2.dampingRatio = 1.0f;


    m_spring1 = (b2WheelJoint*)_world->CreateJoint(&jd1);

    m_spring2 = (b2WheelJoint*)_world->CreateJoint(&jd2);

}


     생략 : Box2dEx04의 코드와 같음 


void HelloWorld::tick(float dt)

{

    int velocityIterations = 8;

    int positionIterations = 3;


    // Step : 물리 세계를 시뮬레이션한다.

    _world->Step(dt, velocityIterations, positionIterations);


    // 만들어진 객체 만큼 루프를 돌리면서 바디에 붙인 스프라이트를 여기서 제어한다.

    for (b2Body* b = _world->GetBodyList(); b; b = b->GetNext())

    {

        if (b->GetUserData() != nullptr) {

            Sprite* spriteData = (Sprite *)b->GetUserData();


            spriteData->setPosition(Vec2(b->GetPosition().x * PTM_RATIO,

                                                            b->GetPosition().y * PTM_RATIO));

            spriteData->setRotation(-1 * CC_RADIANS_TO_DEGREES(b->GetAngle()));

        }

    }


    // 월드 안에서 좌우로 움직임을 제어한다. -- 추가 부분


    b2Vec2 p = body0->GetPosition();

    //log("%f..%f", p.x, p.y);

    if (p.x < 1.6)

    {

        m_spring1->SetMotorSpeed(-30.0f);

        m_spring2->SetMotorSpeed(-30.0f);

    }

    else if (p.x > 13.4) {

        m_spring1->SetMotorSpeed(30.0f);

        m_spring2->SetMotorSpeed(30.0f);

    }

}

     생략 : Box2dEx04의 코드와 같음 




휠 조인트는 모터 기능을 활성화하고 여러 가지 속성을 지정하면 자동차 바퀴처럼 동작합니다.

    jd1.Initialize(body0, body1, body1->GetPosition(), axis);

    jd1.motorSpeed = 30.0f;

    jd1.maxMotorTorque = 20.0f;

    jd1.enableMotor = true;

    jd1.frequencyHz = 4.0f;



리볼류트 조인트와는 거의 차이가 없지만 바퀴의 역할을 하는 것이므로 서서히 가속이 되고 서서히 속도가 줄어드는 제동력(dampingRatio) 등이 속성으로 추가되어 있습니다. 실제로 바닥과의 마찰에 의해 움직임이 일어납니다.





tick 메서드에 추가된 다음 코드에 의해서 휠 조인트에 의해 움직이는 바디가 방향을 바꾸면서 좌우로 움직이게 됩니다.

    // 월드 안에서 좌우로 움직임을 제어한다. -- 추가 부분


    b2Vec2 p = body0->GetPosition();

    //log("%f..%f", p.x, p.y);

    if (p.x < 1.6)

    {

        m_spring1->SetMotorSpeed(-30.0f);

        m_spring2->SetMotorSpeed(-30.0f);

    }

    else if (p.x > 13.4) {

        m_spring1->SetMotorSpeed(30.0f);

        m_spring2->SetMotorSpeed(30.0f);

    }





휴... 이제 조인트 강좌가 모두 끝났습니다. ^^




Lv28 내폰젤무거워

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징