cocos2d-x で Box2D を使う 〜 スワイプで物体を動かす
はじめに
cocos2d-x と Box2D のテスト引き続き。
物体をスワイプすると、その方向に移動するようにします。
やること
タッチ開始から終了の間の移動量を計算し、物体に力として与えます。
削除フラグが立ってたら物体を削除
GameScene.cpp
private:
CCPoint touchStartPoint;
PhysicsSprite* targetSprite;
GameScene.cpp
bool GameScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { // タッチ開始時の座標を保存 CCDirector* pDirector = CCDirector::sharedDirector(); touchStartPoint = pDirector->convertToGL(pTouch->getLocationInView()); // タッチした物体を検索して保存 targetSprite = NULL; list<PhysicsSprite*>::iterator it = pSpriteList.begin(); while(it != pSpriteList.end()) { PhysicsSprite* pSprite = *it; CCRect rect = pSprite->boundingBox(); if (rect.containsPoint(touchStartPoint)) { targetSprite = pSprite; break; } it++; } return true; } void GameScene::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent) { // タッチ終了時の座標を取得 CCDirector* pDirector = CCDirector::sharedDirector(); CCPoint touchEndPoint = pDirector->convertToGL(pTouch->getLocationInView()); // 物体をタッチしていなければ新規作成 if (targetSprite == NULL) { createSprite(); } // 物体をタッチしていれば、タッチ開始から終了の座標を計算して、物体に力を与える else { b2Body* body = targetSprite->getPhysicsBody(); float x = touchEndPoint.x - touchStartPoint.x; float y = touchEndPoint.y - touchStartPoint.y; CCLOG("[ccTouchENded] s(%f, %f) e(%f, %f) d(%f, %f)", touchStartPoint.x, touchStartPoint.y, touchEndPoint.x, touchEndPoint.y, x, y); body->ApplyForce(b2Vec2(x, y), body->GetWorldCenter()); } }