我正在使用SpriteKit为项目创建有趣的热点UI。它应该很简单!只是背景图像上有一点点。当你点击一个点时它会向上扩展。当您再次点击时,它将返回其正常大小和位置。但是,更重要的是,每个点都有物理,所以当它扩大时,其他点暂时移开。当圆点恢复到正常尺度时,它们会弹回原位。
为实现这一目标,我在页面上放置了一堆SKShapeNodes。我还创建了一个附加到场景physicsBody和SKShapeNode的SKPhysicsJointSpring。
这里是场景的代码:
override func didMoveToView(view: SKView) {
name = "Hotspot test"
physicsWorld.gravity = CGVectorMake(0, 0)
let physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody = physicsBody
for i in 1...10 {
let j:__uint32_t = 0x1 << UInt32(i) // <- IGNORE THIS. IRRELEVANT
let shape = DotNode(circleOfRadius: 60, name: "Ball"+String(i), id: i, bitmask: j)
// Position objects in a circle around the center
let degrees = (360/10)*i
let radians = degrees.degreesToRadians
let radius = CGFloat(300)
let cosR = cos(radians)
let sinR = sin(radians)
let xPos = radius*cosR+frame.size.width/2
let yPos = radius*sinR+frame.size.height/2
let pos = CGPoint(x: xPos, y: yPos)
shape.position = pos
addChild(shape)
let spring = SKPhysicsJointSpring.jointWithBodyA(self.physicsBody!, bodyB: shape.physicsBody!, anchorA: pos, anchorB: pos)
spring.damping = 0.01
physicsWorld.addJoint(spring)
}
DotNode是SKShapeNode的子类。这就是它在屏幕上的样子:
这就是它们放大时的样子:
看到问题吧?他们现在互不干涉。当我拖动其中一个时,我可以看到Spring关节被附着:
对象之间是否有任何原因不再相互影响?
如果您只是删除关节会发生这种情况:
物体互相推挤。这必须是可以实现的。我做错了什么?
答案 0 :(得分:1)
可悲的是,SpriteKit似乎无法做到这一点。这篇文章:SKPhysicsJoint: Contacts and collisions not working证实了这一点。
我不得不说,这看起来很疯狂。为什么你不想创建关节和弹簧然后让你连接的节点碰撞并在物理世界中做出反应?
似乎我将不得不失去弹簧并只是编码节点以不断漂移回原来的位置。这样,当其中一个人伸缩并推开其他人时,他们总会试图回家。