如何在Spritekit中关闭物理实体

时间:2014-09-02 08:35:07

标签: sprite-kit skphysicsbody

如果使用physicsBody声明2个对象(例如Rectangle和Triangle),可以拖放它们,我们如何设置,当我们拖动一个接近另一个时,2个对象将在任何合适的点连接?

2 个答案:

答案 0 :(得分:0)

在你的touchesEnded(放置事件)中,检查两个对象的位置,如果它们足够接近,则添加一个关节。

答案 1 :(得分:0)

你可以创建一个比你的精灵更大的physicsBody,并测试它是否与didBeginContact中的另一个身体接触。使用SKPhysicsContact对象,您可以使用SKPhysicsJointFixed或SKPhysicsJointLimit在接触点处连接两个物理实体。

编辑:以下是如何加入两个精灵的示例:

为所选节点声明一个实例变量。

{
    SKSpriteNode *selectedNode;
}

如果检测到联系人,请加入两个物理机构。节点与SKPhysicsJoint连接。

- (void) didBeginContact:(SKPhysicsContact *)contact
{
    if ((contact.bodyA.categoryBitMask == category1
                    && contact.bodyB.categoryBitMask == category2)
                    || (contact.bodyB.categoryBitMask == category1
                    && contact.bodyA.categoryBitMask == category2)) {
        CGPoint point = contact.contactPoint;
        SKPhysicsJoint *joint = [SKPhysicsJointFixed jointWithBodyA:contact.bodyA bodyB:contact.bodyB anchor:point];
        [self.physicsWorld addJoint:joint];
    }
}

根据触摸选择并移动精灵。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];

        SKNode *node = [self nodeAtPoint:location];
        selectedNode = (SKSpriteNode *)node;
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch moves */

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];

        selectedNode.position = location;
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch ends */

    selectedNode = nil;
}