我有一个名为“Floor”的单独类(class),如下所示。
class Floor: SKNode {
override init() {
super.init()
//let edgeFrame = CGRect(origin: CGPoint(x: 1,y: 1), size: CGSize(width: 1078, height: 1950))
//self.physicsBody = SKPhysicsBody(edgeLoopFrom: edgeFrame)
let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
borderBody.friction = 0
self.physicsBody = borderBody
// Apply a physics body to the node
// self.physicsBody?.isDynamic = false
// Set the bit mask properties
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = nailDropCategory
self.physicsBody?.collisionBitMask = balloonCategory
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}
我基本上有掉落的 SKSpriteNode,它们从屏幕顶部开始,到达底部,接触“地板”并自行移除,然后再次从顶部重新启动。我遇到的问题是我的所有 SKSpriteNode 一直卡在顶部而不是从屏幕框架周围的边框掉下来。我如何告诉我的应用程序忽略这些特定节点并让它们进入?感谢任何帮助!
这是在屏幕上左右移动的对象,但它只是从屏幕一侧掉落而没有 EdgeLoop
if let accelerometerData = motionManager.accelerometerData {
if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft {
balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.x * -500.0, dy: 0)
} else {
balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.x * 500.0, dy: 0)
}
}
}
最佳答案
发生的情况是您的对象碰到了边缘循环的顶部边界,并且无法进入场景。
有几种方法可以做到这一点,如果您绝对需要侧面的边缘循环,我建议将循环拉长到高于场景,并在循环内但在可见区域上方创建对象。然而,由于您没有给出任何迹象表明您实际上需要侧面的循环,所以我要做的就是摆脱边缘循环检测。
创建一个与场景宽度相同的盒子,高度为 100 像素,然后在其上放置一个 floorCategory
类型的物理体。然后将此框放置在屏幕底部下方 50 px 处。假设您的地板 Sprite 框的 anchor 为 0.5,0.5 这会将框隐藏在屏幕下方,并且框的顶部将与屏幕底部齐平。
现在,您将能够检测到您的对象何时到达屏幕底部,并且您将不再需要担心它们会穿过顶部的边缘循环。
或者
延长循环的一个例子是......
您创建一个比屏幕高的矩形(图像中的绿色边框)来应用边缘循环,而不是屏幕尺寸本身
关于swift - SKSpriteNode 卡在 init 中(edgeLoopFrom :) - SKPhysicsBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47779185/