1

在我的简单射箭游戏中,我定义了一个箭头节点和一个目标节点以及关联的物理实体。

当我尝试使用 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);
}
4

0 回答 0