Swift游戏无限生成不起作用

时间:2015-07-13 01:16:05

标签: swift sprite-kit

我的快速游戏存在问题。我想每2秒产生两个精灵,然后将它们移动成飞扬的鸟管。我尝试过这种方式但是在延迟之后我的游戏崩溃了。这是DidMoveToView :(我跳到有趣的部分)

let distanceToMove = CGFloat(self.frame.size.width + 140)
    let movePipes = SKAction.repeatActionForever(SKAction.moveByX(-distanceToMove, y: 0, duration: NSTimeInterval(0.01 * distanceToMove)))
    let removePipes = SKAction.removeFromParent()
    moveAndRemove = SKAction.sequence([movePipes,removePipes])


    let delay = SKAction.waitForDuration(NSTimeInterval(2.0))
    let spawn = SKAction.runBlock({() in self.initPipes()})
    let spawnAndDelay = SKAction.sequence([spawn,delay])
    let spawnAndDelayForever = SKAction.repeatActionForever(spawnAndDelay)
    runAction(spawnAndDelayForever)

以下是管道的功能:

func initPipes() {
    let pY = arc4random_uniform(UInt32(self.size.height - 250) + 250)
    let pipePair = SKNode()
    pipePair.position = CGPoint(x: self.frame.size.width + 70, y: 0)
    //PIPE 1
    pipe1.anchorPoint = CGPointMake(0, 0)
    pipe1.position = CGPoint(x: 0, y: Int(pY))
    pipe1.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(70, 700), center: CGPointMake(70/2, 700/2))
    pipe1.physicsBody?.dynamic = false
    pipe1.physicsBody?.affectedByGravity = false
    pipePair.addChild(pipe1)

    //PIPE 2
    pipe2.anchorPoint = CGPointMake(0,1)
    pipe2.position = CGPoint(x: 0, y: pipe1.position.y - 150)
    pipe2.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(70, 700), center: CGPointMake(35, -700/2))
    pipe2.physicsBody?.dynamic = false
    pipe2.physicsBody?.affectedByGravity = false
    pipePair.addChild(pipe2)

    pipePair.runAction(moveAndRemove)
    addChild(pipePair)
}

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:3)

我认为你的问题在这里

pipePair.addChild(pipe1)

您不是在创建新管道,而是使用您在其他地方创建的旧管道。第一次通过你不会遇到问题,但是如果在尝试将pipe1添加到新父级之前没有从其父级删除pipe1,它将崩溃。我会在那个方法中创建你的pipe1和pipe2,而不是在它之外有一个变量。

func initPipes() {
    let pY = arc4random_uniform(UInt32(self.size.height - 250) + 250)
    let pipePair = SKNode()
    pipePair.position = CGPoint(x: self.frame.size.width + 70, y: 0)
    //PIPE 1
    let pipe1 = //whatever pipe1 is
    pipe1.anchorPoint = CGPointMake(0, 0)
    pipe1.position = CGPoint(x: 0, y: Int(pY))
    pipe1.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(70, 700), center: CGPointMake(70/2, 700/2))
    pipe1.physicsBody?.dynamic = false
    pipe1.physicsBody?.affectedByGravity = false
    pipePair.addChild(pipe1)

    //PIPE 2
    let pipe2 = //whatever pipe1 is
    pipe2.anchorPoint = CGPointMake(0,1)
    pipe2.position = CGPoint(x: 0, y: pipe1.position.y - 150)
    pipe2.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(70, 700), center: CGPointMake(35, -700/2))
    pipe2.physicsBody?.dynamic = false
    pipe2.physicsBody?.affectedByGravity = false
    pipePair.addChild(pipe2)

    pipePair.runAction(moveAndRemove)
    addChild(pipePair)
}

或者如果打算一次只有一组管道

pipe1.removeFromParent()
pipe2.removeFromParent()

pipePair.addChild(pipe1)
pipePair.addChild(pipe2)

希望这是有道理的,也是有帮助的。