15
15

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で物理エンジンをオンにするまで

Last updated at Posted at 2015-04-03

cocos2d-xで物理エンジンをオンにする設定

手順は次の通り
1.Sceneの物理設定をオンにする
2.イベントリスナーを追加する
3.オブジェクトにPhysicsBodyを設定する

1.Sceneの物理設定をオンにする

GameScene.h

class GameScene : public Layer
{
// クラスメソッド
public:
	static Scene* createPhysicsScene();
	static Scene* createScene();
	
	CREATE_FUNC(GameScene)
// インスタンスメソッド
public:
	GameScene(){};
	~GameScene(){};
	bool init();
	
}

とりあえず、createPhysicsScene()メソッドを追加しました。
そして、そのメソッドでは次のようなことをやっております

GameScene.cpp

Scene* createPhysicsScene()
{
	// 重力設定をオンにしてcreate
	Scene* scene = Scene::createWithPhysics();

	// 物理空間を取得して重力を設定	
	PhysicsWorld* world = scene->getPhysicsWorld();
	world->setGravity(Vec2(0,-980));

	GameScene* layer = GameScene::create();
	scene->addChild(layer);
	return scene;
}

2.イベントリスナーを追加する

加えて、衝突判定を行うためにはイベントリスナーを追加する必要があります

GameScene.cpp

bool GameScene::init()
{
	////略/////
	
	// 物理衝突リスナー
    auto phlistener = EventListenerPhysicsContact::create();
    phlistener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);
    getEventDispatcher()->addEventListenerWithSceneGraphPriority(phlistener, this);
}

てなわけで衝突イベントメソッドを追加

GameScene.h

class GameScene : public Layer
{
// クラスメソッド
public:
	static Scene* createPhysicsScene();
	static Scene* createScene();
	
	CREATE_FUNC(GameScene)
// インスタンスメソッド
public:
	GameScene(){};
	~GameScene(){};
	bool init();
	
	bool onContactBegin(PhysicsContact& constact); // !!new!!

}

GameScene.cpp
bool onContactBegin(PhysicsContact& constact)
{
	log("当たっております。");
	
	return true;
}

3.オブジェクトにPhysicsBodyを設定する

つづいて、このLayerにつけるオブジェクトにはPhysicsBodyや
衝突判定を行うための設定を行ってやらねばなりません

GameScene.cpp

const Size& winSize = this->getContentSize();

Sprite* ball = Sprite::create("ball.png");

// 剛体
PhysicsBody* body = PhysicsBody::createCircle(ball->getContentSize().width/2);
body->setContactTestBitmask(1);
body->setCategoryBitmask(1);
    
ball->setPhysicsBody(body);
ball->setOpacity(128);
ball->setPosition(Vec2(rand()%winSize.width,rand()%winSize.height));
this->addChild(ball);

ここでContactTestBitmaskとCategoryBitmaskを説明します。
ContactTestBitmaskは誰とぶつかるか、のbitmask情報です
CategoryBitmaskは自分のbitmask情報です

GameScene.cpp
body->setContactTestBitmask(3);	// 3 == 0011
body->setCategoryBitmask(1);		// 0001
// なので自分と同じbodyを持っているものは
// 0010や0001,0011と衝突するということ。

このような設定をすると物理設定をオンにし、衝突イベントを取得できるようになりましたとさ。

15
15
1

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
15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?