我正在创建一个项目(钓鱼游戏),该项目涉及一条长线,末端有一个钩子,用于捕捉在屏幕上移动的物体(鱼) . 当鱼与钩子碰撞时我想要一个功能运行 . 但是我只希望函数在挂钩被联系而不是线路的其余部分时运行 . 钩子是与线路相同的SKSpriteNode的一部分 . 如何使线的物理体位于最底部,以便仅在鱼撞到线的底部或底部时调用该函数?我已经知道如何改变物理体的大小而不是位置 .
让你的线2 Sprite,Line和hook,并让hook成为line的孩子 . 给每个精灵赋予自己的物理体,并拥有自己的类别 . 通过这种方式,你可以创建一些整洁的效果,如果你使用SKPhysicsJoint,给它一个悬挂在一条线上的钩子的外观 . 如果你仍然希望将它保持为1 Sprite,那么当你创建Physics Body时,一些构造函数有一个你可以操作的中心 . 你的另一个选择是你使用一个SKNode,添加物理主体,将这个新节点添加到你的精灵,并将节点移动到钩子
当您使用 didBeginContact(contact: SKPhysicsContact) 函数时,您可以拥有 contact.bodyA.node e contact.bodyB.node ,这两个对象涉及到联系人,但您还有 contact.contactPoint ,这两个对象已触及的点 .
didBeginContact(contact: SKPhysicsContact)
contact.bodyA.node
contact.bodyB.node
contact.contactPoint
关于你的钩子,我首先要做两个不同的对象:
钩子(带有精确 CGPath 的 SKShapeNode )
CGPath
SKShapeNode
钓鱼线
但这不是你的情况 .
所以,你的精灵框架具有原点,大小和位置的属性 . 假设你的精灵底部有一个钩子,靠近原点 . 当您知道发生了联系时,您只需计算 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 回答
让你的线2 Sprite,Line和hook,并让hook成为line的孩子 . 给每个精灵赋予自己的物理体,并拥有自己的类别 . 通过这种方式,你可以创建一些整洁的效果,如果你使用SKPhysicsJoint,给它一个悬挂在一条线上的钩子的外观 . 如果你仍然希望将它保持为1 Sprite,那么当你创建Physics Body时,一些构造函数有一个你可以操作的中心 . 你的另一个选择是你使用一个SKNode,添加物理主体,将这个新节点添加到你的精灵,并将节点移动到钩子
当您使用
didBeginContact(contact: SKPhysicsContact)
函数时,您可以拥有contact.bodyA.node
econtact.bodyB.node
,这两个对象涉及到联系人,但您还有contact.contactPoint
,这两个对象已触及的点 .关于你的钩子,我首先要做两个不同的对象:
钩子(带有精确
CGPath
的SKShapeNode
)钓鱼线
但这不是你的情况 .
所以,你的精灵框架具有原点,大小和位置的属性 . 假设你的精灵底部有一个钩子,靠近原点 . 当您知道发生了联系时,您只需计算
contact.contactPoint
与您的精灵点之间的距离点,以了解最短距离是什么,因此您的钓鱼线中涉及此接触的部分是什么 .