1

スプライトを動かしているマウスジョイントが解放されたときのスプライトの正確な位置をCCLogを使用して表示するコードを作成しました。以下は、Sprite.mmクラスとccTouchesEndedメソッド(HelloWorldLayer.mmクラスにあります)です。スプライトの位置は更新されておらず、出力は常にx:0.00およびy:0.00です。

Sprite.mm:

-(id)addSprite:(CCLayer *)parentLayer
                 inWorld:(b2World *)world
{
PhysicsSprite *aSprite = [PhysicsSprite spriteWithFile:@"spriteIm.png"];

aSprite.tag = 1;
[parentLayer addChild:aSprite];

b2BodyDef spriteBodyDef;
spriteBodyDef.userData = aSprite;
spriteBodyDef.type = b2_dynamicBody;
CGSize s = [CCDirector sharedDirector].winSize;
spriteBodyDef.position = [Convert toMeters:ccp(s.width * 0.25,s.height-400)];
b2FixtureDef fixtureDef;
fixtureDef.density = 0.01;
b2CircleShape circleShape;
circleShape.m_radius = aSprite.contentSize.width/2 / PTM_RATIO;
fixtureDef.shape = &circleShape;

spriteBody = world->CreateBody( &spriteBodyDef );
spriteFixture = spriteBody->CreateFixture( &fixtureDef );

[aSprite setPhysicsBody:spriteBody];

return aSprite;
}

ccTouchesEnded:

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

if (mouseJoint)
{
  for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
    if (b->GetUserData() != NULL) {
        CCSprite *mySprite = (CCSprite *)b->GetUserData();
        if (mySprite.tag == 1) {
            CGPoint spritePosition = mySprite.position;
            CCLOG(@"the sprite position is x:%0.2f, y:%0.2f", spritePosition.x, spritePosition.y);
        }
    }
}        

world->DestroyJoint(mouseJoint);
mouseJoint = NULL;
}
}

助けてください。私は数日間そこにいました。

4

1 に答える 1

0

私はついにそれを機能させることができました。x:0.00とy:0.00は、ボディではなくスプライトの位置をとっていたためだと思います。スプライトはボディの親になっているため、親の内側の位置(0,0)を指定していました。これが私がそれを理解する方法です。ccTouchesEndedコードに加えた変更は次のとおりです。

ccTouchesEnded:

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

if (mouseJoint)
{
    for(b2Body *b = mouseJoint->GetBodyB(); b; b=b->GetNext())    {
        if (b->GetUserData() != NULL)
        {
            CCSprite *mySprite = (CCSprite*)b->GetUserData();

            if (mySprite.tag == 1) {
                mySprite.position = CGPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
                CCLOG(@"the sprite postion is x:%0.2f , y:%0.2f", mySprite.position.x, mySprite.position.y);

            }
        }
    }

    world->DestroyJoint(mouseJoint);
    mouseJoint = NULL;
}
}
于 2012-08-13T14:03:52.080 に答える