19
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-02-02

前編で、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を使ってるだけやないか!( ‘д‘⊂彡☆))Д´) パーン
という声が聞こえてきそうですが、ご勘弁を…。

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?