cocos2d-x で Box2D を使う 〜 物体の移動と力を与える
はじめに
前回の続きで、物体の移動と、物体への力を与える処理を試してみます。
タッチの有効化
- GameScene::init に追記してタッチの有効化をする
GameScene.cpp
// タッチ有効化 setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne);
タッチ時に物体を移動させる
- 物体をタッチしたら力を加え、物体以外の場所をタッチしたらその場所に物体を移動させる。
GameScene.h
// 物体をインスタンス変数に保持 PhysicsSprite* pSprite; // タッチ開始時の処理 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent * pEvent); // タッチ終了時の処理 virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
GameScene.cpp
- GameScene::createSprite で pSprite 作成時にインスタンス変数に入れる
pSprite = new PhysicsSprite();
- タッチ実行時に物体の移動か力を与える
// タッチ開始時の処理。trueを返さないとタッチ終了処理が実行されない。 bool GameScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { return true; } // タッチ終了時の処理 void GameScene::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent) { // タッチしたポイント取得 CCDirector* pDirector = CCDirector::sharedDirector(); CCPoint touchPoint = pDirector->convertToGL(pTouch->getLocationInView()); // 物体上の座標をタッチしていたら、上向きの力を与える。 CCRect rect = pSprite->boundingBox(); if (rect.containsPoint(touchPoint)) { b2Body* b = pSprite->getPhysicsBody(); // 物体に力を与える b->ApplyForce( b2Vec2(0,50), // (0,0)から(0,50)へ上向きに垂直の力を作成 b->GetWorldCenter() // 起点を物体の中央にとる ); } // 物体以外の座標をタッチしたら、その場所に物体を移動させる。 else { b2Body* b = pSprite->getPhysicsBody(); // 物体の場所を変更(ワープ)させる b->SetTransform( b2Vec2(touchPoint.x / PTM_RATIO, touchPoint.y / PTM_RATIO), // 移動先の座標 0 // 移動時の回転値 ); // 移動後に下向きの力を与えないとなんか空中で止まる b->SetLinearVelocity(b2Vec2(0, -10)); } }