Sprite Kit - 让SKPhysicsBody只在侧面恢复原状

时间:2014-12-09 17:45:13

标签: ios sprite-kit skspritenode skphysicsbody

我正在尝试创建一个复杂的SKPhysicsBody,它不会在顶部弹跳,但允许在侧面和底部弹跳。目前我正在创建两个节点。一个有精灵形象的人,顶部没有恢复原状的物理身体。

我的第二个节点与第一个节点匹配,但是与第一个节点的大小相同它在前面和底部只有一个PhysicsBody并具有恢复原状。允许我的主角从底部和前面反弹。

以下是我当前设置的代码:

    //This is the top part.
- (void)nodePhysicsBodySetup:(SKSpriteNode *)node
{
    CGPoint topStart = CGPointMake(0, node.size.height);
    CGPoint topEnd = CGPointMake(node.size.width, node.size.height);
    SKPhysicsBody *topEdge = [SKPhysicsBody bodyWithEdgeFromPoint:topStart toPoint:topEnd];
    node.physicsBody = topEdge;
    //[SKPhysicsBody bodyWithBodies:@[topEdge, frontEdge, bottomEdge]]
    //node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node.frame.size];
    node.physicsBody.dynamic = NO;
    node.physicsBody.restitution = 0.0;
    node.physicsBody.affectedByGravity = NO;
    node.physicsBody.categoryBitMask = groundCategory;
    node.physicsBody.collisionBitMask = mainHeroCategory;
    node.physicsBody.contactTestBitMask = mainHeroCategory;
}
//This is the bottom physicsbody that matches up with the image of the main node.
- (void)bottomNodePhysicsBodySetup:(SKSpriteNode *)node
{
    CGPoint topStart = CGPointMake(0, node.size.height);
    CGPoint frontEnd = CGPointMake(0,0);
    CGPoint bottomEnd = CGPointMake(node.size.width,0);
    SKPhysicsBody *frontEdge = [SKPhysicsBody bodyWithEdgeFromPoint:topStart toPoint:frontEnd];
    SKPhysicsBody *bottomEdge = [SKPhysicsBody bodyWithEdgeFromPoint:frontEnd toPoint:bottomEnd];
    bottomNode.physicsBody = [SKPhysicsBody bodyWithBodies:@[frontEdge, bottomEdge]];
    bottomNode.physicsBody.dynamic = NO;
    bottomNode.physicsBody.affectedByGravity = NO;
    bottomNode.physicsBody.restitution = 0.5;
    bottomNode.physicsBody.categoryBitMask = otherCategory;
    bottomNode.physicsBody.collisionBitMask = mainHeroCategory;
    bottomNode.physicsBody.contactTestBitMask = mainHeroCategory;
}

图片截图是在NDA下: enter image description here

目前,Green PhysicsBody附加到节点,红色PhysicsBody附加到透明的第二个节点,其位置与第一个节点相同。

这不起作用。我的主要角色(mainHeroCategory)有时会卡在具有恢复原状的PhysicsBody和没有相遇的物理角上。有什么更好的方法呢?

2 个答案:

答案 0 :(得分:0)

我会尝试仅使用一个物理主体来执行此操作,并查看联系委托方法以确定联系发生的位置以及法线向量(该信息位于委托方法中传递的SKPhysicsContact对象中)。

获得该信息后,我会对mainHeroCategory对象施加冲动,具体取决于联系发生的位置。

答案 1 :(得分:0)

我建议您使用SKPhysicsJointFixed加入物理机构,或者使用SKConstraint或两个约束身体。 SpriteKit仅在使用bodyWithBodies合并两个或多个实体时才使用该形状。来自文档...

  

忽略子项上的属性,例如质量或摩擦力。   只使用子体的形状。

忽略restitution属性。