我有一个向上移动一条线的圆圈,当该圆圈到达某个y点时,我该如何制作它以便从下方生成另一个节点?
以下是我目前用于填充圆圈的代码,但我无法将其与物理主体一起使用,因为它会生成太多节点并减慢我的应用程序:
func createCirclesOnLine(line: CGFloat) {
var currentY : CGFloat = -110
let maxY = self.size.width * 15
let spacing : CGFloat = 120
while currentY < maxY {
let circle = SKSpriteNode(imageNamed: "first@2x")
circle.physicsBody?.dynamic = false
circle.position = CGPointMake(line, currentY)
//circle.physicsBody?.restitution = -900
circle.size = CGSizeMake(75, 75)
// circle.physicsBody = SKPhysicsBody(rectangleOfSize: circle.size)
let up = SKAction.moveByX(0, y: 9000, duration: 90)
circle.runAction(up)
foregroundNode.addChild(circle)
currentY += CGFloat((random() % 400) + 70)
}
如有必要,会发布更多代码。
答案 0 :(得分:1)
有两种方法可以解决这个问题。一种是简单地检查每个圆圈的位置,看它是否在屏幕上方。您需要对圈子的引用......
class GameScene: SKScene {
var circles = Array<SKSpriteNode>()
...
在createCirlcesOnLine
功能中,在创建数组时将每个圆圈添加到数组中。
...
self.addChild(circle)
circles.append(circle)
然后,在您的更新方法中,枚举圆圈以查看它们中是否有任何一个位于屏幕顶部。
override func update(currentTime: NSTimeInterval) {
for circle in circles {
if circle.position.y > self.size.height + circle.size.height/2 {
//Send circle back to the bottom using the circle's position property
}
}
}
此解决方案可行,但会在每个更新周期中导致大量不必要的检查。
第二个更有效(并且稍微复杂一点)的建议是在屏幕顶部上方添加一个不可见的节点,以拉伸屏幕宽度。当圆圈与圆碰撞时,只需将其移动到屏幕底部即可。研究实现SKPhysicsContactDelegate协议以及需要采取哪些措施才能实现。如果您遇到此解决方案的问题,请针对这些问题发布单独的问题。