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