본문 바로가기

Cocos2d-x v3.17/고급 기능

[Cocos2d-x 고급기능]Point cast ,ray cast,queryRect,Debug

반응형

Cast

당신은 한자리에 서서 동서남북을 바라본 경험이 있나요?

당신은 가까운것도,멀리있는것도 볼수있고 그것들이 당신에게서 얼마나 떨어져있는것도 판단할수 있습니다.

물리엔진도 비슷한 공간검색기능을 제공합니다.

Cocos2d-x PhysicsWorld 객체가 Point cast,ray cast,queryRect 지원합니다.


Point cast

당신이 어떤 물체에 충돌했고 그것이 탁자라면 이런상황을 point cast 예로 들수 있습니다.

Point cast 어떤   중심으로 일정한 거리내에 물체가 있는지 검사해줍니다.

point cast 통해 어떤 물체가 어떤점에서 가장 가까운지 혹은 어떤 점에서 가장 가까운 물체를 찾는다던지를 알수있습니다.

이것은 마우스 피킹하는데 가장 적합하고 다른 무언가를 감지할때도 유용할겁니다.


Ray cast

당신이 어떤 공간을 둘러볼때 당신의 시선안에 있는 어떤것이 당신의 주의를 끌겁니다.

이런 상황을 ray cast 예로 생각하세요.

ray cast 어떤 점에서 출발한 레이저가 어떤 물체와 충돌되는지 감지하고 충돌되면 충돌점을 알수있습니다.

 방법은 총알이 명중됬는지 판단하기에 적합합니다(총알의 비행시간은 생략한다고 가정).


예시

C++

void tick(float dt)

{

    Vec2 d(300 * cosf(_angle), 300 * sinf(_angle));

    Vec2 point2 = s_centre + d;

    if (_drawNode)

    {

        removeChild(_drawNode);

    }

    _drawNode = DrawNode::create();

Vec2 points[5];

    int num = 0;

    auto func = [&points, &num](PhysicsWorld& world,

        const PhysicsRayCastInfo& info, void* data)->bool

    {

        if (num < 5)

        {

            points[num++] = info.contact;

        }

        return true;

    };

s_currScene->getPhysicsWorld()->rayCast(func, s_centre, point2, nullptr);

_drawNode->drawSegment(s_centre, point2, 1, Color4F::RED);

    for (int i = 0; i < num; ++i)

    {

        _drawNode->drawDot(points[i], 3, Color4F(1.0f, 1.0f, 1.0f, 1.0f));

    }

    addChild(_drawNode);

_angle += 1.5f * (float)M_PI / 180.0f;

}



queryRect

queryRect 일정구역에 어떤 물건이 있는지 검색해줍니다.

쉽게 사용할수 있구요.


C++

auto func = [](PhysicsWorld& world, PhysicsShape& shape, void* userData)->bool

{

    //Return true from the callback to continue rect queries

    return true;

}

scene->getPhysicsWorld()->queryRect(func, Rect(0,0,200,200), nullptr);


이것은 Logo 부서지는 모습을 제작할때 queryRect  사용한  입니다.

e debug 
Logo Smash 
CHIPMUN+ 
MainMenu

 

Toggle debug 
Logo Smash 
CHIPMUN# 
MainMenu

 

출처: <http://cocos2d-x.org/docs/cocos2d-x/zh/physics/queries.html>

 

Debug

만약 당신이 강체주위에 빨강색선으로 렌더링하여 디버깅하기를 원할경우에 간단하게 아래 두줄을 물리씬의 초기화 코드안에 넣어주면 됩니다.

또한 당신이  공부하고 싶다면 홈페이지에 이있는 디버그 프로젝트를 다운받고 메뉴를 하나 추가해서 메뉴의 콜백함수내에서 디버깅모드를 키고끄는것을 테스트 해보세요.

C++

Director::getInstance()->getRunningScene()->getPhysics3DWorld()->setDebugDrawEnable(true);

Director::getInstance()->getRunningScene()->setPhysics3DDebugCamera(cameraObjecct);


물리엔진 비활성화


내장된 물리엔진을 사용하는것은 굿초이스이지만 당신이 다른 물리엔진을 사용하고 싶을수도 있습니다.

그럴때에는 base/ccConfig.h 파일을 열고 CC_USE_PHYSICS 의 값을 0으로 해서 물리엔진을 비활성화 시키면 됩니다.

 

출처: <http://cocos2d-x.org/docs/cocos2d-x/zh/physics/debugging.html>

 


 

 


반응형