物理体不遵守节点的定位点

我的场景有一堆与矩形大小相同的物理体的矩形。 我喜欢把所有的物体都固定在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)]; 

任何想法或build议来解决这个问题将不胜感激。 例如,如果我能形象化物理实体,那可能会有帮助,但我不知道如何去做。

更新:所以我解决了问题,只需不设置锚点和重新定位我的矩形。 所以这个问题依然存在,但是我有一个解决方法,解决方法是很好的。

我写这个来解决苹果公司缺乏的问题:

使用pathForRectangleOfSize:withAnchorPoint:将您的调用replace为bodyWithRectangleOfSize:其简要文档告诉我们问题: “创build一个以所属节点的原点为中心的矩形物理体。

 @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 

您可以使用

  [SKPhysicsBody bodyWithRectangleOfSize:size center: center]; CGPoint center = CGPointMake(size.width*(anchorPoint.x-0.5f), size.height*(0.5f-anchorPoint.y)) 

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

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

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

我使用的是Swift,但是SKPhysicsBody的宽度和高度都是错的。 我正在使用锚点(0,0)。 然后我用了rectangleOfSize方法, center

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

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

使用SpriteKit时,我已经跑到这里了。 不幸的是,似乎有一些问题是基于创build一个物理实体的时间,实际上是将节点添加到场景中。 如果你从你的代码交换顺序,并确保你不做任何物理变化,直到节点实际上在渲染树中,这应该解决“怪异”,一切都将是所有肉汁。