SKPhysicsJoint присоединяется к неправильным координатам

В моей простой игре стрельбы из лука я определил узел стрелки и целевой узел со связанными физическими телами.

Когда я пытаюсь соединить их вместе, используя SKPhysicsJointFixed (я также пробовал другие типы), поведение является неточным, так как сустав, казалось бы, создается в случайных точках, прежде чем фактически попасть в целевой узел.

Я играл со значениями трения и восстановления, а также SKShapeNode (с CGPath) и SKSpriteNode (с прямоугольником вокруг спрайта), чтобы определить цель, но проблема возникает с обоими.

При использовании только столкновений стрелки отражаются от правильных местоположений цели, что кажется нормальным. Только когда происходит соединение, результаты становятся случайными на экране, обычно на расстоянии 10-20 точек от целевой поверхности "поверхности".

static const uint32_t arrowCategory = 0x1 << 1;
static const uint32_t targetCategory = 0x1 << 2;

- (SKSpriteNode *)createArrowNode
{
    SKSpriteNode *arrow = [[SKSpriteNode alloc] initWithImageNamed:@"Arrow.png"];

    arrow.position = CGPointMake(165, 110);
    arrow.name = @"arrowNode";

    arrow.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:arrow.frame.size];
    arrow.physicsBody.angularVelocity = -0.25;
    arrow.physicsBody.usesPreciseCollisionDetection = YES;

    arrow.physicsBody.restitution = 0.0;
    arrow.physicsBody.friction = 0.0;

    arrow.physicsBody.categoryBitMask = arrowCategory;
    arrow.physicsBody.collisionBitMask = targetCategory;
    arrow.physicsBody.contactTestBitMask = /*arrowCategory | */targetCategory | bullseyeCategory;

    return arrow;
}


-void(createTargetNode)
{
    SKSpriteNode *sprite = [[SKSpriteNode alloc] initWithImageNamed:@"TargetOutline.png"];
    sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.size];

    sprite.position = CGPointMake(610, 100);
    sprite.name = @"targetNode";

    sprite.physicsBody.usesPreciseCollisionDetection = NO;
//    sprite.physicsBody.affectedByGravity = NO;
//    sprite.physicsBody.mass = 20000;
    sprite.physicsBody.dynamic = NO;
    sprite.physicsBody.friction = 0.0;
    sprite.physicsBody.restitution = 0.0;

    sprite.physicsBody.categoryBitMask = targetCategory;
    sprite.physicsBody.contactTestBitMask = targetCategory | arrowCategory;

    [self addChild:sprite];
}


- (void)didBeginContact:(SKPhysicsContact *)contact
{

    SKPhysicsBody *firstBody, *secondBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }

    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }

    if ((firstBody.categoryBitMask & arrowCategory) != 0 &&
        (secondBody.categoryBitMask & targetCategory) != 0)
    {
        CGPoint contactPoint = contact.contactPoint;

        NSLog(@"contactPoint is %@", NSStringFromCGPoint(contactPoint));

        float contact_x = contactPoint.x;
        float contact_y = contactPoint.y;

        SKPhysicsJoint *joint = [SKPhysicsJointFixed jointWithBodyA:firstBody bodyB:secondBody anchor:(CGPoint)contactPoint ];

        [self.physicsWorld addJoint:joint];

        CGPoint bullseye = CGPointMake(590, 102.5);
        NSLog(@"Center is %@", NSStringFromCGPoint(bullseye));

        CGFloat distance = SDistanceBetweenPoints(contactPoint, bullseye);
        NSLog(@"Distance to bullseye is %f", distance);
}

0 ответов

Другие вопросы по тегам