Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift SpriteKit游戏多次切换场景后冻结_Swift_Sprite Kit - Fatal编程技术网

Swift SpriteKit游戏多次切换场景后冻结

Swift SpriteKit游戏多次切换场景后冻结,swift,sprite-kit,Swift,Sprite Kit,我的一个精灵在多次在游戏场景和游戏场景之间切换后冻结。一旦我死掉并重新启动6-7次,我的“敌人精灵”就不再对我的设备的倾斜做出响应(如果有,则需要很长时间)。当使用屏幕上的操纵杆时,我的播放器仍然可以移动自如。我的FPS一直读到60 class GameScene: SKScene, SKPhysicsContactDelegate { let joyStickSprite = SKSpriteNode(imageNamed: "flatLight09") let player

我的一个精灵在多次在游戏场景和游戏场景之间切换后冻结。一旦我死掉并重新启动6-7次,我的“敌人精灵”就不再对我的设备的倾斜做出响应(如果有,则需要很长时间)。当使用屏幕上的操纵杆时,我的播放器仍然可以移动自如。我的FPS一直读到60

class GameScene: SKScene, SKPhysicsContactDelegate {

    let joyStickSprite = SKSpriteNode(imageNamed: "flatLight09")
    let playerSprite = SKSpriteNode(imageNamed: "p3_front")
    let enemySprite = SKSpriteNode(imageNamed: "elementExplosive001")
    let coinSprite = SKSpriteNode(imageNamed: "gold_1")
    var left = false
    var right = false


    var enemyCount = 0
    var randomNextCoin = Int(arc4random_uniform(5)+1)

    var motionManager = CMMotionManager()
    var destY:CGFloat  = 0.0

    struct CollisionCategoryBitmask {
        static let Player: UInt32 = 0x00
        static let Enemy: UInt32 = 0x01
        static let Floor: UInt32 = 0x02
        static let Coin: UInt32 = 0x03
    }

    var background = SKSpriteNode(imageNamed: "blue_land")

    override func didMoveToView(view: SKView) {

        self.physicsWorld.contactDelegate = self


        createBackground()
        createPlayer()
        createJoyStick()
        createScreenBorder()
        createEnemy()


        motionManager.accelerometerUpdateInterval = 0.1
        motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler: {
            (accelerometerData: CMAccelerometerData!, error: NSError!) in


                var currentY = self.enemySprite.position.y

                let acceleration = accelerometerData.acceleration
                self.destY = (CGFloat(acceleration.y) * 0.75) + (self.destY * 0.25)

            })
        }



    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */



        for touch in (touches as! Set<UITouch>) {
            let location = touch.locationInNode(self)

            let touchedNode = self.nodeAtPoint(location)

            if let name = touchedNode.name
            {
                if name == "joyStick"
                {

                    if location.x < joyStickSprite.position.x {
                        left = true
                        right = false
                    }

                    else {
                        right = true
                        left = false
                    }
                }
            }
        }

    }

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

        left = false
        right = false
    }

    func presentGameOver () {

        removeAllChildren()

        let newScene = GameScene(size: size)
        newScene.scaleMode = scaleMode
        let reveal = SKTransition.flipHorizontalWithDuration(0.5)
        view?.presentScene(newScene, transition: reveal)
        enemySprite.physicsBody?.dynamic = false
    }

    func createBackground () {

        background.position = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
        background.size.height = self.size.height

        addChild(background)

    }


    func createPlayer () {

        playerSprite.position = CGPoint(x: self.size.width / 2, y: playerSprite.size.height/2)
        playerSprite.physicsBody = SKPhysicsBody(circleOfRadius: playerSprite.size.width / 2)
        playerSprite.physicsBody?.dynamic = false
        playerSprite.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Player
        playerSprite.physicsBody?.collisionBitMask = 0
        playerSprite.physicsBody?.contactTestBitMask = CollisionCategoryBitmask.Enemy | CollisionCategoryBitmask.Coin


        addChild(playerSprite)

    }

    func movePlayerLeft () {
        let moveLeft = SKAction.moveByX(-10, y: 0, duration: 1)
        playerSprite.runAction(moveLeft)
    }

    func movePlayerRight () {
        let moveRight = SKAction.moveByX(10, y: 0, duration: 1)
        playerSprite.runAction(moveRight)
    }

    func createEnemy () {

        var randomX = Int(arc4random_uniform(600))
        var randomXCG = CGFloat(randomX)


        enemyCount += 1

        enemySprite.position = CGPoint(x: randomXCG, y: self.size.height)
        enemySprite.physicsBody = SKPhysicsBody(circleOfRadius: enemySprite.size.width / 2)
        enemySprite.physicsBody?.dynamic = true
        enemySprite.physicsBody?.allowsRotation = true
        enemySprite.physicsBody?.restitution = 0.0
        enemySprite.physicsBody?.friction = 0.0
        enemySprite.physicsBody?.angularDamping = 0.0
        enemySprite.physicsBody?.linearDamping = 0.0
        enemySprite.physicsBody?.affectedByGravity = true

        enemySprite.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Enemy
        enemySprite.physicsBody?.collisionBitMask = CollisionCategoryBitmask.Floor


        println("enemey count \(enemyCount)")
        println("next coin \(randomNextCoin)")

        addChild(enemySprite)
    }

    func createCoins () {

        var randomX = Int(arc4random_uniform(600))
        var randomXCG = CGFloat(randomX)

        randomNextCoin = Int(arc4random_uniform(10))
        enemyCount = 0

        coinSprite.size.height = playerSprite.size.height/2
        coinSprite.size.width = coinSprite.size.height
        coinSprite.position = CGPoint(x: randomXCG, y: self.size.height)
        coinSprite.physicsBody = SKPhysicsBody(circleOfRadius: enemySprite.size.width/2)
        coinSprite.physicsBody?.dynamic = true
        coinSprite.physicsBody?.affectedByGravity = true
        coinSprite.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Coin

        addChild(coinSprite)
    }


    func createJoyStick () {

        joyStickSprite.setScale(0.4)
        joyStickSprite.position = CGPoint(x: self.size.width/1.1, y: joyStickSprite.size.height)
        joyStickSprite.name = "joyStick"
        joyStickSprite.userInteractionEnabled = false

        addChild(joyStickSprite)
    }

    func updateEnemyPosition () {

        if enemySprite.size.height > enemySprite.position.y {

            enemySprite.position.x =  enemySprite.position.x + destY*20
        }


    }

    func didBeginContact(contact: SKPhysicsContact) {

        let firstNode = contact.bodyA.node as! SKSpriteNode
        let secondNode = contact.bodyB.node as! SKSpriteNode

        if (contact.bodyA.categoryBitMask == CollisionCategoryBitmask.Player) &&
            (contact.bodyB.categoryBitMask == CollisionCategoryBitmask.Enemy) {

                let transition = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)

                let scene = SecondScene(size: self.scene!.size)
                scene.scaleMode = SKSceneScaleMode.AspectFill

                self.scene!.view!.presentScene(scene, transition: transition)
                }

        if (contact.bodyA.categoryBitMask == CollisionCategoryBitmask.Player) &&
            (contact.bodyB.categoryBitMask == CollisionCategoryBitmask.Coin) {

                coinSprite.removeFromParent()
        }
    }

    func createScreenBorder () {


        // 1. Create a physics body that borders the screen
        let borderBody = SKPhysicsBody(edgeFromPoint: CGPointMake(0.0, 0.0), toPoint: CGPointMake(self.size.width, 0.0))
        // 2. Set the friction of that physicsBody to 0
        borderBody.friction = 0

        borderBody.categoryBitMask = CollisionCategoryBitmask.Floor

        // 3. Set physicsBody of scene to borderBody
        self.physicsBody = borderBody
    }



    override func update(currentTime: CFTimeInterval) {

        //detect where on joystick player is touching
        if left == true {
            movePlayerLeft()
        }

        if right == true {
            movePlayerRight()
        }

        //move player to other side when going off screen
        if playerSprite.position.x < -20.0 {
            playerSprite.position = CGPoint(x: self.size.width + 20.0, y: playerSprite.position.y)
        } else if (playerSprite.position.x > self.size.width + 20.0) {
            playerSprite.position = CGPoint(x: -20.0, y: playerSprite.position.y)
        }


        //remove enemeny if off screen
        if enemySprite.position.x < -20.0 || enemySprite.position.x > self.size.width + 20.0 {
            self.enemySprite.removeFromParent()
            createEnemy()
        }

        if randomNextCoin == enemyCount {
            println("coin dropped")
            coinSprite.removeFromParent()
            createCoins()
        }

        updateEnemyPosition()


    }
}
类游戏场景:SKScene,skphysiccontactdelegate{
让joyStickSprite=SKSpriteNode(图像名为:“flatLight09”)
let playerSprite=SKSpriteNode(图像名为“p3_front”)
让enemySprite=SKSpriteNode(图像名为:“elementExplosive001”)
让coinSprite=SKSpriteNode(图像名为:“gold_1”)
var left=false
var right=false
var enemyCount=0
var randomNextCoin=Int(arc4random_均匀(5)+1)
var motionManager=CMMotionManager()
var destY:CGFloat=0.0
结构碰撞类别比特掩码{
静态let播放器:UInt32=0x00
静态let敌人:UInt32=0x01
静态出租楼层:UInt32=0x02
静态let Coin:UInt32=0x03
}
var background=SKSpriteNode(图像名为:“蓝色土地”)
覆盖func didMoveToView(视图:SKView){
self.physicsWorld.contactDelegate=self
createBackground()
createPlayer()
创建操纵杆()
createScreenBorder()
创建敌人()
motionManager.AccelerometrUpdateInterval=0.1
motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(),withHandler:{
(加速度计数据:CMAccelerometerData!,错误:n错误!)位于
var currentY=self.enemyprite.position.y
让加速度=加速度计数据加速度
self.destY=(CGFloat(加速度*0.75)+(self.destY*0.25)
})
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
/*当触摸开始时调用*/
用于触摸输入(触摸设置为){
let location=touch.locationInNode(自)
让touchedNode=self.nodeAtPoint(位置)
如果let name=touchedNode.name
{
如果名称==“操纵杆”
{
如果位置.x{ [ /* weak or unowned + object, ...*/ ]
     /* parameters */ in

}
    motionManager.accelerometerUpdateInterval = 0.1
    motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()) {
        [unowned self] accelerometerData, error in

            var currentY = self.enemySprite.position.y
            let acceleration = accelerometerData.acceleration
            self.destY = (CGFloat(acceleration.y) * 0.75) + (self.destY * 0.25)
    }
    override func willMoveFromView(view: SKView) {
        motionManager.stopAccelerometerUpdates()
    }