35

我的场景有一堆矩形,其物理实体与矩形大小相同。我喜欢将我的所有对象都锚定到 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)];

任何解决此问题的想法或建议将不胜感激。例如,如果我可以可视化物理物体,那可能会有所帮助,但我不确定如何去做。

更新:所以我通过简单地不设置锚点并重新定位我的矩形来解决了这个问题。所以问题仍然存在,但我有一个解决方法,并且解决方法运行良好。

4

7 回答 7

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
于 2014-01-31T19:51:45.963 回答
8

您可以使用

      [SKPhysicsBody bodyWithRectangleOfSize:size center: center];


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

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

于 2014-09-04T22:45:13.367 回答
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))

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

于 2014-11-22T02:20:23.067 回答
5

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

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

于 2013-11-18T11:04:35.173 回答
2

我自己在使用 SpriteKit 时遇到了这个问题。不幸的是,基于创建物理体和实际将节点添加到场景的时间似乎存在问题。如果您从代码中交换顺序并确保在节点实际位于渲染树中之前不进行任何物理更改,那应该解决“怪异”并且一切都将是肉汁。

于 2014-04-07T14:42:19.547 回答
1

斯威夫特 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)

于 2018-06-18T02:27:26.270 回答
0

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

于 2019-02-15T13:18:09.487 回答