我有一个角色的游戏,当他跳过平台时会受到正常重力的影响。他收集硬币和电源。我正在加强使硬币吸引到characterSpriteNode。
如果magneticPowerUp = true
我希望它出现引力场已激活关于仅使 <+ em>的角色吸引到角色,就像磁场一样。
我一直在跟Epic Bytes SO回答here,但我没有太多运气,因为我对矢量没有太多经验而且没有太深入physicsBody
。
所以当我确定硬币足够接近以移动到焦炭时,我就无法解决使硬币移动的部分。
我的想法是这样的:
override func update(currentTime: NSTimeInterval) {
if magneticPowerUp {
for coin in scoreNode.children {
let disp = CGVector(dx: coin.position.x-character.position.x, dy: coin.position.y-character.position.y)
let radius = sqrt(disp.dx*disp.dx+disp.dy*disp.dy) // Distance between character and coin
if radius < character.frame.height * 3 {
// Use physics methods here to push the coin to the character
let dt: CGFloat = 1.0/60.0
let strength: CGFloat = 10000
let m1 = character.physicsBody!.mass*strength
let m2 = coin.physicsBody!.mass*strength
let force = (m1*m2)/(radius*radius);
let normal = CGVector(dx: disp.dx/radius, dy: disp.dy/radius)
let impulse = CGVector(dx: normal.dx*force*dt, dy: normal.dy*force*dt)
// Something wrong with this?
coin.physicsBody!.velocity = CGVector(dx: coin.physicsBody!.velocity.dx + impulse.dx, dy: coin.physicsBody!.velocity.dy + impulse.dy)
}
}
}
}
答案 0 :(得分:1)
SpriteKit具有 SKFieldNode ,用于创建适用于身体的重力和磁铁。通常它偏转带电体,而不是像现实世界中的铁磁性那样吸引它们。
如果你想要一个吸引东西的领域,那么你的英雄需要IID_IDropTarget
方法。要吸引像硬币这样的特定事物,你可以在英雄字段上使用radialGravityField()
,在你想要吸引的硬币精灵上使用categoryBitMask
。
使用fieldBitMask
方法,你也可以让你的英雄用更强或更弱的力量吸引不同的身体。甚至可以同时吸引和击退不同的身体。您可以使用物理实体的electricField()
属性。
代码示例:
charge
SKFieldNode 的Apple文档非常棒。 https://developer.apple.com/reference/spritekit/skfieldnode
这是两个很酷的YT视频,显示效果。