使物理体在对象上具有一定的大小和位置。(SpriteKit)

Making the physics body a certain size and position on the object.(SpriteKit)

我正在创建一个项目(钓鱼游戏),该项目涉及一条长线,末端有一个钩子,用来捕捉在屏幕上移动的物体(鱼)。当鱼与鱼钩相撞时,我想要一个 运行 的函数。但是,我只希望在联系挂钩时将函数 运行 而不是该行的其余部分。钩子是与线相同的 SKSpriteNode 的一部分。我怎样才能使线的物理主体位于最底部,以便仅在鱼击中鱼钩或线底时调用该函数?我已经知道如何改变物理体的大小而不是位置。

当你使用didBeginContact(contact: SKPhysicsContact)函数时,你可以有contact.bodyA.node e contact.bodyB.node,这两个对象涉及到联系人,但你也有contact.contactPoint,点两个物体接触的地方。

关于你的钩子,我更喜欢做两个不同的对象:

  • 钩子(SKShapeNode 精确CGPath
  • 钓鱼线

但这不是你的情况。

因此,您的 sprite 帧具有原点、大小和位置属性。假设您的钩子位于精灵底部,靠近原点。当你知道发生了接触时,你只需计算 contact.contactPoint 和你的精灵点之间的距离点,就可以知道最短距离是多少,所以你的钓鱼线的哪一部分参与了这次接触。

func getDistance(p1:CGPoint,p2:CGPoint)->CGFloat {
    let xDist = (p2.x - p1.x)
    let yDist = (p2.y - p1.y)
    return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
}

让你的线有 2 个 Sprites,线和钩子,并让钩子成为线的子元素。给每个精灵一个自己的物理体,有自己的类别。通过这种方式,如果您使用 SKPhysicsJoint,您可以创建一些简洁的效果,使其看起来像挂在一条线上的钩子。如果您仍想将其保留为 1 个 Sprite,那么当您创建 Physics Body 时,一些构造函数有一个您可以操纵的中心。你的另一个选择是你使用一个 SKNode,将物理体添加到它,将这个新节点添加到你的精灵,并将节点移动到钩子