6

7つのスプライトを追加し、タグとzorderを付けました。しかし、3番目のオブジェクトに触れることができず、最後に1つのオブジェクトしか残っていないので、それに触れます。しかし、6つのスプライトを追加すると、正しく触れてください。すべてのスプライトの位置は同じですが、zorderが異なります。何が問題なのか理解できません。クエリコールバッククラスを使用して連絡を取りました。ここにコードをいくつか追加します。

スプライトを追加するコード。

 zIndex = 7;

            for(int i = 0; i<zIndex; i++)
            {
                CCSprite *paddle = [CCSprite spriteWithFile:[NSString stringWithFormat:@"%d.png",i+1]];
                paddle.position = ccp(winSize.width/2, winSize.height/2);
                [self addChild:paddle z:zIndex-i tag:i+1];
                [mutArrSprites addObject:paddle];
                NSLog(@"Z = %d tag = %d ",zIndex-i , i+1);
            }

            for(CCSprite *sprite in mutArrSprites)
            {
                [self addUserDataToNode:sprite];
            }       

touchbeganメソッドで

if (_mouseJoint != NULL) return;

UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

// Make a small box.
b2AABB aabb;
b2Vec2 d;
d.Set(0.001f, 0.001f);
aabb.lowerBound = locationWorld - d;
aabb.upperBound = locationWorld + d;

// Query the world for overlapping shapes.
QueryCallback callback(locationWorld);
_world->QueryAABB(&callback, aabb);         

b2Body *body = callback.m_object;
if (body)
{
    //pick the body
    CCSprite *sprite = (CCSprite *)body->GetUserData();  
    [self reorderChild:sprite z:zIndex++];
    b2MouseJointDef md;
    md.bodyA = _groundBody;
    md.bodyB = body;
    md.target = locationWorld;
    md.collideConnected = true;
    md.maxForce = 1000.0f * body->GetMass();

    _mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md);
    body->SetAwake(true);
}
4

1 に答える 1

3

以下のメソッドを使用して、zオーダーに基づいて最もタッチされたオブジェクトを取得します

-(b2Body *) getTopTouchBody:(b2Vec2)location{

    b2Body *touchObject;
    int zOrder = 0;
    for (b2Body* b = _world->GetBodyList(); b; b = b->GetNext())
    {
        b2Fixture *f = b->GetFixtureList();
        BOOL isinsize = f->TestPoint(location);
        CCSprite *sprite = (CCSprite *)b->GetUserData();
        if (isinsize) {
            if (sprite.zOrder > zOrder) {
                zOrder = sprite.zOrder;
                touchObject = b;
            }
        }
    }
    return  touchObject;
}
于 2012-08-24T12:19:27.057 に答える