【问题标题】:Physicsbody doesn't adhere to node's anchor pointPhysicsbody 不遵守节点的锚点
【发布时间】:2013-12-01 10:49:03
【问题描述】:

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

这是一个简单的sn-p代码:

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)];

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

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

【问题讨论】:

  • 这对于找到你的物理实体的实际位置很有用:stackoverflow.com/questions/20084968/…
  • AnchorPoint 围绕节点位置滑动纹理。锚点对物理形状/实体没有影响,因为它只定义了纹理相对于节点位置的偏移量。如果您希望您的形状更靠近角落,请将 anchorPoint 保留为默认值并相应地更改位置。更改 anchorPoint 也会对子节点的旋转和位置产生不利影响。
  • 说改变锚点会对子节点的旋转和位置产生不利影响是幼稚的。也许我想在 0,0 上旋转。考虑到所有低级图形 API 都在左下角工作,而 Web 开发工作在右上角,我绝对想这样定位。在图形开发的宏伟计划中,从中心工作实际上是非常独特的。话虽如此,您的前两句话清晰正确。我想,我希望我能改变物理体锚点:\

标签: ios sprite-kit skphysicsbody


【解决方案1】:

我写这篇文章是为了解决 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

【讨论】:

  • 我使用的是 7.1,但仍然无法正常工作 :(,链接也没有显示任何关于 withAnchorPoint 方法的内容。[我 cmd+f'd 页面为 withAnchorPoint] 我做了find [SKPhysicsBody bodyWithRectangleOfSize:square.size center: CGPointZero];
  • center: 是苹果 7.1 中添加的初始值设定项。中心应该是 [0-1, 0-1] 范围内的锚点。
  • 新的 API 7.1 center: 方法... +1
【解决方案2】:

你可以使用

      [SKPhysicsBody bodyWithRectangleOfSize:size center: center];


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

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

【讨论】:

  • 在此处发布的所有答案中,这是唯一一个解决了我的physicsBody 锚点与节点锚点未对齐的问题。谢谢!
【解决方案3】:

我正在使用 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))

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 整洁的工具,但它不能解决我的问题。问题是,物理体的锚点似乎是默认宽度/2,高度/2,即使我已将其节点的锚点设置为 0,0。
    • 物理体(通过上面的调用)以精灵的 {0, 0} 点为中心创建。如果您的 {0, 0} 点不在精灵的中心,则调用没有用。所以,他想移动物理不是角落,而不是它。您正在调用bodyWithPolygonFromPath: 方法。
    【解决方案5】:

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

    【讨论】:

    • 谢谢兄弟 - 我的头被类似的问题严重破坏了,节点被添加到原点,直到我移动物理分配直到位置分配之后
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 2023-03-13
        相关资源
        最近更新 更多