使物理体在物体上具有一定的大小和位置.(精灵套件)



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

让你的线 2 精灵,线和钩子,让钩子成为线的子项。 为每个精灵赋予自己的物理身体,并具有自己的类别。 通过这样做,如果你使用SKPhysicsJoint,你可以创建一些整洁的效果,让它看起来像一个悬挂在线上的钩子。 如果您仍想将其保留为 1 精灵,那么当您创建物理主体时,某些构造函数具有您可以操作的中心。 你的另一个选择是使用SKNode,将物理主体添加到其中,将这个新节点添加到你的精灵中,然后将节点移动到钩子上

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

关于你的钩子,我准备制作两个不同的对象:

  • 钩子(具有精确CGPathSKShapeNode
  • 钓鱼线

但这不是你的情况。

因此,您的精灵框架具有原点、大小和位置的属性。假设你的钩子在精灵的底部,靠近原点。当你知道发生了接触时,你只需计算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)))
}

最新更新