Ios 雪碧套件-制作SKPhysicsBody,仅侧面恢复

Ios 雪碧套件-制作SKPhysicsBody,仅侧面恢复,ios,sprite-kit,skspritenode,skphysicsbody,Ios,Sprite Kit,Skspritenode,Skphysicsbody,我试图创建一个复杂的SKPhysicsBody,它不在顶部反弹,但允许在侧面和底部反弹。目前我正在创建两个节点。上面有精灵的形象和一个不可恢复的身体 我的第二个节点与第一个节点匹配,但与第一个节点的大小相同,它只是在前面和底部有一个PhysicsBody,并且有一个恢复。让我的主要角色从底部和前部反弹 以下是我当前设置的代码: //This is the top part. - (void)nodePhysicsBodySetup:(SKSpriteNode *)node { C

我试图创建一个复杂的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下:

当前,绿色PhysicsBody附着到节点,红色PhysicsBody附着到与第一个节点位置相同的透明第二个节点


这真的不管用。我的主要角色(mainHeroCategory)有时会卡在节点角上,其中物理体与未恢复的物理体相交。更好的方法是什么?

我将尝试仅使用一个物理实体来完成此操作,并查看contact委托方法,以确定接触发生的位置以及法向量(该信息在委托方法中传递的SKPhysicContact对象中)


一旦我得到了这些信息,我会对mainHeroCategory对象应用一个脉冲,或者不应用,这取决于接触发生的位置

我建议你用或连接物理体,用或约束物理体。SpriteKit仅在将两个或多个实体与
BodyWithBodys
合并时使用该形状。从文件中

子对象上的特性(例如质量或摩擦力)将被忽略。 仅使用子实体的形状


恢复属性将被忽略。

底部节点不会作为子节点添加到顶部。它的大小和位置都相同,因此适合顶部节点。从您问题中的注释代码来看,您似乎考虑使用
bodywithbody
连接顶部和底部。在这种情况下,孩子们是物理身体。你是怎么把顶部和底部连接起来的?哦,我看到了混乱。我目前没有连接他们,我只是设置他们,让他们见面。一个physicsbody覆盖节点顶部,第二个节点physicsbody与第一个节点physicsbody对齐。我希望我能贴一张照片,但这是保密协议。我会在一个新项目中再次尝试创建它。你能发布一个你想要完成的任务的草图吗?或者在你的问题中提供更多的细节。我很难检测到它在物理体上的位置被击中。你推荐什么方法?这似乎是一个很好的方法。如果您实现了SKPhysicContactDelegate,那么方法didBeginContact将为您提供一个SKPhysicContact对象。该对象为您提供有关联系人发生位置的信息。