SKSpriteNode 卡在 init(edgeLoopFrom:) - SKPhysicsBody
SKSpriteNode Stuck with init(edgeLoopFrom:) - SKPhysicsBody
我有一个名为 "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,它从屏幕顶部开始并到达底部,它触及 "Floor" 并自行移除,然后再次从顶部重新启动。我遇到的问题是我所有的 SKSpriteNode 一直卡在顶部,而不是从屏幕框架周围的边框掉落。我如何告诉我的应用程序忽略那些特定节点并让它们进入?感谢任何帮助!
这是在屏幕上左右移动的对象,但它只是在没有边缘循环的情况下从屏幕的一侧掉落
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)
}
}
}
发生的情况是您的对象碰到边缘循环的顶部边界并且无法进入场景。
有几种方法可以做到这一点,如果您绝对需要两侧的边缘循环,我建议将循环拉长到高于场景并在循环内但在可见区域上方创建对象。但是,由于您没有给出任何迹象表明您实际上需要侧面的循环,所以我要做的就是摆脱边缘循环检测。
创建一个场景宽度的盒子,高度为 100px,然后在其上放置一个 floorCategory
类型的物理体。然后将此框放在屏幕底部下方 50 像素处。假设您的地板精灵框的锚点为 0.5,0.5 这会将框隐藏在屏幕下方,框的顶部将与屏幕底部齐平。
现在您将能够检测到您的对象何时到达屏幕底部,您将不再需要担心它们会穿过顶部的边缘循环。
或
延长循环的一个例子是...
您创建了一个比屏幕高的矩形(图像中的绿色边框)来应用边缘循环,而不是屏幕尺寸本身
我有一个名为 "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,它从屏幕顶部开始并到达底部,它触及 "Floor" 并自行移除,然后再次从顶部重新启动。我遇到的问题是我所有的 SKSpriteNode 一直卡在顶部,而不是从屏幕框架周围的边框掉落。我如何告诉我的应用程序忽略那些特定节点并让它们进入?感谢任何帮助!
这是在屏幕上左右移动的对象,但它只是在没有边缘循环的情况下从屏幕的一侧掉落
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)
}
}
}
发生的情况是您的对象碰到边缘循环的顶部边界并且无法进入场景。
有几种方法可以做到这一点,如果您绝对需要两侧的边缘循环,我建议将循环拉长到高于场景并在循环内但在可见区域上方创建对象。但是,由于您没有给出任何迹象表明您实际上需要侧面的循环,所以我要做的就是摆脱边缘循环检测。
创建一个场景宽度的盒子,高度为 100px,然后在其上放置一个 floorCategory
类型的物理体。然后将此框放在屏幕底部下方 50 像素处。假设您的地板精灵框的锚点为 0.5,0.5 这会将框隐藏在屏幕下方,框的顶部将与屏幕底部齐平。
现在您将能够检测到您的对象何时到达屏幕底部,您将不再需要担心它们会穿过顶部的边缘循环。
或
延长循环的一个例子是...
您创建了一个比屏幕高的矩形(图像中的绿色边框)来应用边缘循环,而不是屏幕尺寸本身