【cocos2d-x】물리 엔진의 중력을 변경하면 몬스트도 만들 수 있어!

3607 단어 C++cocos2d-x

배경



Cocos2dx는 v3.x에서 Chipmunk2D로 통합되어 쉽게 구현할 수 있습니다.

중력을 변경하고 싶었지만 조금은 빠져 버렸으므로 메모를 해 둡니다.

중력을 0으로 함으로써 「몬스터 스트라이크」과 같은 움직임을 하는 앱을 간단하게 만들 수 있습니다!

물리 엔진을 켜고 중력을 변경



우선 물리 엔진을 켜십시오.
Scene의 create()createWithPhysics()로 바꾸면 켜집니다.

그런 다음 중력을 변경합니다. 다음과 같이 하면 중력이 0이 되어 우주 공간과 같이 됩니다.

PhysicsWorld* world = scene->getPhysicsWorld();
world->setGravity(Vec2(0, 0));
Vec2(0, -980) 로 하는 것으로 일반적인 현실 세계의 중력이 된다.

GameScene.cpp
Scene* GameScene::createScene() {
    //auto scene = Scene::create();           //通常シーンの作成
    auto scene = Scene::createWithPhysics();  //物理エンジンのシーンの作成
    auto layer = GameScene::create();
    scene->addChild(layer);

    //gravityを変更(現実の場合0,-980)
    PhysicsWorld* world = scene->getPhysicsWorld();
    world->setGravity(Vec2(0, 0));

    return scene;
}

물체(PhysicsBody) 생성



여기에서는 원형과 사각형의 물체를 생성하는 샘플을 보여줍니다.
이 샘플은 로드할 이미지와 같은 크기의 객체를 생성합니다.
필요에 따라 변경하여 사용하면 좋다고 생각합니다.

원형 물체 생성

GameScene.cpp
// 丸(物理エンジン)を作成
Sprite* GameScene::addNewCircleAtPosition(Node *parent, Point p, bool dynamic, const char *fileName) {
    Sprite* sprite = Sprite::create(fileName);
    auto material = PHYSICSBODY_MATERIAL_DEFAULT;
    material.density     = 1.0f; // 密度
    material.restitution = 0.7f; // 反発係数
    material.friction    = 0.0f; // 摩擦係数
    sprite->setPhysicsBody(PhysicsBody::createCircle((sprite->getContentSize().width/2 - 1), material));
    sprite->getPhysicsBody()->setDynamic(dynamic);
    sprite->setPosition(p);
    parent->addChild(sprite, 10);
    return sprite;
}

사각형 모양의 물체 생성

GameScene.cpp
// 四角(物理エンジン)を作成
Sprite* GameScene::addNewBoxAtPosition(Node *parent, Point p, bool dynamic, const char *fileName) {
    Sprite* sprite = Sprite::create(fileName);
    auto material = PHYSICSBODY_MATERIAL_DEFAULT;
    material.density     = 1.0f; // 密度
    material.restitution = 0.7f; // 反発係数
    material.friction    = 0.0f; // 摩擦係数
    sprite->setPhysicsBody(PhysicsBody::createBox(sprite->getContentSize(), material));
    sprite->getPhysicsBody()->setDynamic(dynamic);
    sprite->setPosition(p);
    parent->addChild(sprite, 10);
    return sprite;
}

이런 느낌으로 사용합니다.

GameScene.cpp
// 固定された物体(壁などに利用)
auto map = this->addNewBoxAtPosition(this, Point(0, 100), false, "map.png");
// 物理計算されてダイナミックに動く物体(プレイヤーなどに利用)
auto player = this->addNewBoxAtPosition(this, Point(100, 100), true, "player.png");


실제로 움직이기



실제로 움직이면 중력을 무시한 상태가 되어, 튀어나와도 똑바로 이동하게 됩니다.
파라미터를 조정함으로써, 의사 몬스트와 같은 동작을 실현할 수 있습니다.
반발 계수를 1.0로 설정하면 영원히 되돌아갈 수 있습니다.
계수를 여러가지 변경해 시험해 놀아 보세요.

후기



이 메커니즘을 사용하여 최근 앱을 만들었습니다.
원한다면 봐주세요.
참고: 【쿠마노 굿코】 재키의 호시 아츠메



이번은 「물리 엔진의 중력을 변경해 놀기」였습니다.

그럼 또.

좋은 웹페이지 즐겨찾기