Cocos2d iPhone と Box2D を使用して、基本的な物理エンジンを作成しています。
場合によっては、小さな box2D オブジェクトをドラッグする必要があります。
小さなオブジェクトでのタッチ ジョイントの作成は、適切なタッチ ジョイントを実際に作成するのと同じくらい頻繁に、ゲーム エンジンが空白スペースのタップと見なすため、多少の当たり外れがあります。実際には、これは、頑固なオブジェクトを動かそうとする無駄な試みで、ユーザーが常に画面に指をぶつけていることを意味します。この「ヒットアンドミス」効果なしに、ゲームで小さなオブジェクトを簡単に選択できるようにしたいと考えています。
周囲に大きなセンサーを備えた小さなオブジェクトを作成することもできますが、これは理想的ではありません。これは、特定のサイズ (直径約 40 ピクセル) を超えるオブジェクトには、この余分な複雑なレイヤーが必要ないためです。小さなオブジェクトは、単純にサイズを縮小した大きなオブジェクトです。
小さなオブジェクトを移動するときのユーザー エクスペリエンスを向上させるために使用できる戦略は何ですか?
ccTouchBegan の AABB コードは次のとおりです。
b2Vec2 locationWorld = b2Vec2(touchLocation.x/PTM_RATIO, touchLocation.y/PTM_RATIO);
b2AABB aabb;
b2Vec2 delta = b2Vec2(1.0/PTM_RATIO, 1.0/PTM_RATIO);
//Changing the 1.0 here to a larger value doesn't make any noticeable difference.
aabb.lowerBound = locationWorld - delta;
aabb.upperBound = locationWorld + delta;
SimpleQueryCallback callback(locationWorld);
world->QueryAABB(&callback, aabb);
if(callback.fixtureFound){
//dragging code, updating sprite location etc.
}
SimpleQueryCallback コード:
class SimpleQueryCallback : public b2QueryCallback
{
public:
b2Vec2 pointToTest;
b2Fixture * fixtureFound;
SimpleQueryCallback(const b2Vec2& point) {
pointToTest = point;
fixtureFound = NULL;
}
bool ReportFixture(b2Fixture* fixture) {
b2Body* body = fixture->GetBody();
if (body->GetType() == b2_dynamicBody) {
if (fixture->TestPoint(pointToTest)) {
fixtureFound = fixture;
return false;
}
}
return true;
}
};