0

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;
    }        
};
4

2 に答える 2

0

タッチの最小衝突ボックスはどうですか? 直径が 40px 未満のオブジェクトは 40px の直径を使用し、それより大きいオブジェクトはすべて実際の直径を使用します。

于 2012-07-31T21:41:19.797 に答える
0

私がやったこと - iforce2d のおかげで、SimpileQueryCallback の ReportFixture を次のように変更しました。

bool ReportFixture(b2Fixture* fixture) {
    b2Body* body = fixture->GetBody();
    if (body->GetType() == b2_dynamicBody) {

        //if (fixture->TestPoint(pointToTest)) {
        fixtureFound = fixture;

        return true;
        //}
    }        
    return true;
} 

デルタを 10.0/PTM_RATIO に増やします。

于 2012-08-07T17:52:52.823 に答える