【问题标题】:Adding B2Bodies to sprite Node causes sprite location to change将 B2Bodies 添加到精灵节点会导致精灵位置发生变化
【发布时间】:2013-02-03 13:45:10
【问题描述】:

我有一批精灵正在添加到场景中。这些精灵的位置偏离了批处理的位置,因此我可以围绕批处理节点的点旋转它们。

当我将 B2Body 附加到这些精灵中的任何一个时,就会出现问题,它们在屏幕上的位置会发生变化。

    balloon1 = [CCSprite spriteWithSpriteFrameName:@"1.png"];
    balloon1.position = ccp(30,30);
    balloon1.tag = 10;
    //balloon1.anchorPoint = ccp(1.1,0.7);
    [spriteNode addChild:balloon1];

    b2BodyDef balloonBodyDef;
balloonBodyDef.type = b2_dynamicBody;
balloonBodyDef.position.Set((160 + balloon1.position.y)/PTM_RATIO, (240 -          balloon1.position.x)/PTM_RATIO);
balloonBodyDef.userData = balloon1;
b2Body *balloonBody = world->CreateBody(&balloonBodyDef);

b2PolygonShape balloon;
    balloon.SetAsBox((balloon1.contentSize.width/PTM_RATIO/2),
               (balloon1.contentSize.height/PTM_RATIO/2));


// Create shape definition and add to body
b2FixtureDef laserGunShapeDef;
laserGunShapeDef.shape = &laser;
//laserGunShapeDef.density = 0.0f;
//laserGunShapeDef.friction = 10.0f;
//laserGunShapeDef.restitution = 0.0f;

b2Fixture *balloonFixture = balloonBody->CreateFixture(&laserGunShapeDef);

如果我将气球添加为文件中的精灵,这可以正常工作,但是当它按照上述方式完成时,气球会移出屏幕。

任何想法都将不胜感激。

【问题讨论】:

    标签: iphone cocos2d-iphone box2d


    【解决方案1】:

    改变

    balloonBodyDef.position.Set((160 + balloon1.position.y)/PTM_RATIO, (240 -          balloon1.position.x)/PTM_RATIO);
    

    到

    balloonBodyDef.position.Set(balloon1.position.x/PTM_RATIO, balloon1.position.y/PTM_RATIO);
    

    也在tick方法中处理位置更新。

    balloon1.position = ccp(balloonBody->GetPosition().x * PTM_RATIO,
                                (balloonBody->GetPosition().y) * PTM_RATIO);
    

    【讨论】:

    • 您好,感谢您的回复,但我仍然遇到同样的问题。如果将精灵添加到场景中,则代码有效,但如果我从批处理节点添加精灵,则精灵似乎是偏移的。
    • 试试 spriteNode.position=ccp(0.0f,0.0f);
    【解决方案2】:

    我只是猜测,但可能是因为 spriteNode 的位置。由于精灵是附在精灵节点上的,(30, 30) 是相对于精灵节点的位置,而不是实际世界的坐标。

    所以,尝试使用

    CGPoint worldCoordinate = [spriteNode convertToWorldSpace: balloon1.position];
    balloonBodyDef.position.Set(worldCoordinate.x/PTM_RATIO, worldCoordinate.y/PTM_RATIO);
    

    就像 Guru 所说的,不要忘记在 tick 方法上更新精灵的位置。如果这不起作用,这是一个疯狂的猜测,应该没关系......但尝试先设置身体的位置,然后设置气球的位置从那个身体。

    无论如何希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多