前編で、Box2Dを利用して物理演算エンジンの恩恵を受ける方法を紹介しました。
今度はそれを使わずに物理演算エンジンの恩恵を受ける方法を紹介したいと思います。
#実装
#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);
};
#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);
}
これだけ!
実行してみます。
(違いを出すため、実行時には画像を三つ生成しました。)
しっかり落ちています!たったこれだけのコードで物理演算の世界を作ることが出来ました。
補足
ポイントは
auto scene = Scene::createWithPhysics();
ここです。普段ならcreate()で済ませる所をcreateWithPhysics()にしています。
これに切り替えると生成したScene全体が物理演算の影響を受けることが出来るようになります。
そして生成したSpriteにPhysicsBodyをセットすると
sprite->setPhysicsBody(PhysicsBody::createCircle(32));
その画像は剛体を持つ事になり、物理演算の影響を受ける!という事になります。
ここでは円形を利用しましたが、もちろん形状はひと通り用意されていますので、ご安心を。
しかし、このままでは重力値などの設定が出来ません。
その場合はこのようなコードで対処出来ます。
PhysicsWorld* world = this->getScene()->getPhysicsWorld();
Vect gravity;
gravity.setPoint(0, -50);
world->setGravity(gravity);
sceneがPhysicsWorldを持っているのでこのようにお借りしましょう。
Box2Dよくわからんよー、簡単に使いたいよーって方、是非お試しあれ〜。
ごにょ
内部的にはchipmunkを利用しています。
Box2Dを使わずに〜って結局chipmunkを使ってるだけやないか!( ‘д‘⊂彡☆))Д´) パーン
という声が聞こえてきそうですが、ご勘弁を…。