Help us understand the problem. What is going on with this article?

【cocos2dx v3.0 beta2】【Box2D】Box2Dを使わずにすんげー簡単に物理演算エンジンの恩恵を得る方法 後編

More than 5 years have passed since last update.

前編で、Box2Dを利用して物理演算エンジンの恩恵を受ける方法を紹介しました。
今度はそれを使わずに物理演算エンジンの恩恵を受ける方法を紹介したいと思います。

実装

PhysicsWorldScene.h
#import "cocos2d.h"

USING_NS_CC;

class PhysicsWorldScene : public Layer
{
private:

    PhysicsWorldScene();
    ~PhysicsWorldScene();

    static PhysicsWorldScene* scene();

    void createSprite();
public:
    static Scene* createScene();
    virtual bool init();
    CREATE_FUNC(PhysicsWorldScene);

};
PhysicsWorldScene.cpp
#include "PhysicsWorldScene.h"

#import "GameConfig.h"

PhysicsWorldScene::PhysicsWorldScene(){}
PhysicsWorldScene::~PhysicsWorldScene(){}

Scene* PhysicsWorldScene::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::createWithPhysics();

    // 'layer' is an autorelease object
    auto layer = PhysicsWorldScene::create();

    // add layer as a child to scene
    scene->addChild(layer);

    layer->createSprite();

    // return the scene
    return scene;
}

bool PhysicsWorldScene::init(){
    return true;
}

void PhysicsWorldScene::createSprite(){
    Size winSize = Director::getInstance()->getWinSize();

    Sprite* sprite = Sprite::create("peri1.png");
    sprite->setPosition(Point(winSize.width / 2 , winSize.height / 2));
    sprite->setPhysicsBody(PhysicsBody::createCircle(32));
    this->addChild(sprite);
}

これだけ!

実行してみます。

cocoperi2.png

(違いを出すため、実行時には画像を三つ生成しました。)
しっかり落ちています!たったこれだけのコードで物理演算の世界を作ることが出来ました。

補足

ポイントは

PhysicsWorldScene.cpp
auto scene = Scene::createWithPhysics();

ここです。普段ならcreate()で済ませる所をcreateWithPhysics()にしています。
これに切り替えると生成したScene全体が物理演算の影響を受けることが出来るようになります。
そして生成したSpriteにPhysicsBodyをセットすると

PhysicsWorldScene.cpp
    sprite->setPhysicsBody(PhysicsBody::createCircle(32));

その画像は剛体を持つ事になり、物理演算の影響を受ける!という事になります。
ここでは円形を利用しましたが、もちろん形状はひと通り用意されていますので、ご安心を。

しかし、このままでは重力値などの設定が出来ません。
その場合はこのようなコードで対処出来ます。

PhysicsWorldScene.cpp
    PhysicsWorld* world = this->getScene()->getPhysicsWorld();

    Vect gravity;
    gravity.setPoint(0, -50);

    world->setGravity(gravity);

sceneがPhysicsWorldを持っているのでこのようにお借りしましょう。
Box2Dよくわからんよー、簡単に使いたいよーって方、是非お試しあれ〜。

ごにょ

内部的にはchipmunkを利用しています。
Box2Dを使わずに〜って結局chipmunkを使ってるだけやないか!( ‘д‘⊂彡☆))Д´) パーン
という声が聞こえてきそうですが、ご勘弁を…。

kuuki_yomenaio
元々サーバサイドを得意としていますが、 クライアントもやります。 ゲーム開発のお仕事をしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした