Physicsbody不遵守节点的锚点

Jas*_*ell 32 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)];
Run Code Online (Sandbox Code Playgroud)

任何想法或建议解决这个问题将不胜感激.例如,如果我可以想象物理机构,这可能有所帮助,但我不知道如何.

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

bsh*_*ley 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
Run Code Online (Sandbox Code Playgroud)

编辑:7.1中有一个新的API来提供这种疏忽.

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)s center:(CGPoint)center
Run Code Online (Sandbox Code Playgroud)

  • `center:` 是 7.1 中添加的苹果初始值设定项。中心应该是 [0-1, 0-1] 范围内的锚点。 (2认同)

小智 7

您可以使用

      [SKPhysicsBody bodyWithRectangleOfSize:size center: center];


       CGPoint center = CGPointMake(size.width*(anchorPoint.x-0.5f), size.height*(0.5f-anchorPoint.y))
Run Code Online (Sandbox Code Playgroud)

应该根据父节点的anchorPoint变换边界框


小智 6

我正在使用 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))
Run Code Online (Sandbox Code Playgroud)

我希望它也适用于你们……谢谢!


Max*_*ler 5

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

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

  • 整洁的工具,但它不能解决我的问题。问题是,物理体的锚点似乎是默认的宽度/2,高度/2,即使我已将其节点的锚点设置为 0,0。 (3认同)