【问题标题】:Sprite Kit - Make SKPhysicsBody with restitution only on sidesSprite Kit - 使 SKPhysicsBody 仅在侧面恢复原状
【发布时间】:2014-12-11 05:29:54
【问题描述】:

我正在尝试创建一个复杂的 SKPhysicsBody,它不会在顶部弹跳,但允许在侧面和底部弹跳。目前我正在创建两个节点。一个有 Sprite 的图像并且顶部有一个无恢复的 PhysicsBody。

我的第二个节点与第一个节点匹配,但与第一个节点大小相同,它只是在正面和底部有一个 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)有时会卡在节点角上,即有恢复的物理体和没有相遇的物理体。有什么更好的方法来做到这一点?

【问题讨论】:

    标签: ios sprite-kit skspritenode skphysicsbody


    【解决方案1】:

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

    一旦我得到这些信息,我就会对 mainHeroCategory 对象施加或不施加冲动,这取决于接触发生的位置。

    【讨论】:

    • 我无法检测到它被击中的物理物体的位置。你推荐什么方法?这似乎是一个不错的选择。
    • 如果你实现了 SKPhysicsContactDelegate 方法 didBeginContact 给你一个 SKPhysicsContact 对象。该对象developer.apple.com/library/ios/documentation/SpriteKit/… 为您提供有关发生联系的位置的信息。
    【解决方案2】:

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

    子项的属性,例如质量或摩擦力,将被忽略。 仅使用子实体的形状。

    restitution 属性被忽略。

    【讨论】:

    • 底部节点不作为子节点添加到顶部。它的大小相同,并放置在适合顶部节点的位置。
    • 从您问题中的注释代码来看,您似乎考虑使用bodyWithBodies 连接顶部和底部。在这种情况下,孩子是物理实体。你是如何连接顶部和底部的?
    • 哦,我明白了。我目前没有连接它们,我只是设置它们以便它们相遇。一个物理体覆盖节点的顶部,第二个节点物理体与第一个节点顶部物理体对齐。我希望我可以张贴一张照片,但它是在保密协议下。我会尝试在新项目中再次创建它。
    • 你能发一张你想要完成的草图吗?
    • 或在您的问题中提供更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多