Physicsbody不遵守节点的锚点

时间:2013-11-18 10:14:20

标签: ios sprite-kit skphysicsbody

我的场景有一堆矩形,物理体与矩形大小相同。我喜欢将我的所有物体锚定到CGPointZero,但是我注意到当我这样做时,物理体仍然固定在中间。换句话说,我的物理体的位置就像是视觉表示的左下方100像素。

以下是一段简单的代码:

SKSpriteNode* square = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(width, height)];
square.anchorPoint = CGPointZero; //position based on bottom-left corner
square.position = CGPointMake(x, y);

square.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(width, height)];

任何有关解决此问题的想法或建议都将受到赞赏。例如,如果我可以想象物理实体,这可能有所帮助,但我不知道如何。

更新:所以我通过简单地设置锚点并重新定位我的矩形来解决问题。所以这个问题仍然存在,但我已经做好了解决方案并且工作得很好。

7 个答案:

答案 0 :(得分:13)

我写这篇文章是为了解决Apple缺乏的问题:

使用pathForRectangleOfSize:withAnchorPoint:替换您对bodyWithRectangleOfSize:的调用,其简短文档告诉我们问题:“创建一个以拥有节点的原点为中心的矩形物理主体。”

@implementation SKPhysicsBody (CWAdditions)

+ (CGPathRef)pathForRectangleOfSize:(CGSize)size withAnchorPoint:(CGPoint)anchor {
  CGPathRef path = CGPathCreateWithRect( CGRectMake(-size.width * anchor.x, -size.height * anchor.y,
                                                    size.width,   size.height), nil);
  return path;
}

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)size withAnchorPoint:(CGPoint)anchor {
  CGPathRef path = [self pathForRectangleOfSize:size withAnchorPoint:anchor];
  return [self bodyWithPolygonFromPath:path];
}

@end

修改:7.1中有一个新API可用于此疏忽。

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)s center:(CGPoint)center

答案 1 :(得分:7)

您可以使用

      [SKPhysicsBody bodyWithRectangleOfSize:size center: center];


       CGPoint center = CGPointMake(size.width*(anchorPoint.x-0.5f), size.height*(0.5f-anchorPoint.y))

应根据父节点的anchorPoint

转换边界框

答案 2 :(得分:4)

只有在设置spriteNode的位置时才需要anchorPoint。我不太明白为什么你需要将physicsBody(我假设的节点大小相同)移动到一个角落...... 但是你可能会发现这个类方法很有用[SKPhysicsBody bodyWithPolygonFromPath:path]。

这是一个很好的生成器:http://dazchong.com/spritekit/

答案 3 :(得分:4)

我正在使用Swift,但SKPhysicsBody有一半的宽度和高度错误。我正在使用锚点(0,0)。然后我将该方法与rectangleOfSizecenter

一起使用
var cc = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake(32, 64))
cc.physicsBody = SKPhysicsBody(rectangleOfSize: cc.size, center: CGPointMake(32/2, 64/2))

我希望它也适合你们......谢谢!

答案 4 :(得分:2)

我在使用SpriteKit时遇到过这种情况。不幸的是,基于创建物理主体的时间并实际将节点添加到场景中似乎存在问题。如果您从代码中交换订单并确保在节点实际位于渲染树之前不进行任何物理更改,那么应该解决“怪异”并且所有内容都将变得非常重要。

答案 5 :(得分:0)

Swift 4.1

让centerPoint = CGPoint(x:house1.size.width / 2 - (house1.size.width * house1.anchorPoint.x),y:house1.size.height / 2 - (house1.size.height * house1 .anchorPoint.y))

house1.physicsBody = SKPhysicsBody(rectangleOf:house1.size,center:centerPoint)

答案 6 :(得分:0)

使用默认锚点,它应该可以解决您的问题。我遇到了同样的问题,我不得不以编程方式将场景中每个物理物体的锚点设置为x:0.5和y:0.5。这解决了我的问题。