【cocos2dx v3.0 beta2】【Box2D】Box2Dを使わずにすんげー簡単に物理演算エンジンの恩恵を得る方法 後編
前編で、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);
}
#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を使ってるだけやないか!( ‘д‘⊂彡☆))Д´) パーン
という声が聞こえてきそうですが、ご勘弁を…。
Author And Source
この問題について(【cocos2dx v3.0 beta2】【Box2D】Box2Dを使わずにすんげー簡単に物理演算エンジンの恩恵を得る方法 後編), 我々は、より多くの情報をここで見つけました https://qiita.com/kuuki_yomenaio/items/98260c6aa0d6f8084a96著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .