ios - 加速计在第一款游戏中有效,但在第二款游戏中变得疯狂

标签 ios swift sprite-kit swift2 accelerometer

我正在创建一个游戏,玩家将使用加速计 X 轴控制下落的 Sprite ,并在用户点击屏幕时添加脉冲。在我当前的代码中,当我运行游戏时,它工作正常,然后一旦玩家死亡并再次尝试, Sprite 就会变得疯狂并飞出屏幕。有人可以帮忙吗...

class PlayScene: SKScene, SKPhysicsContactDelegate {

    var score = 0

    var scoreLabel = SKLabelNode()
    var gameOverLabel = SKLabelNode()
    var labelHolder = SKSpriteNode()

    var background = SKSpriteNode()

    let playerGroup:UInt32 = 1
    let objectGroup:UInt32 = 2
    let gapGroup:UInt32 = 0 << 3
    let boundary:UInt32 = 4
    var movingObjects = SKNode()

    var motionManager = CMMotionManager()
    var destX:CGFloat = 0.0
    var gameOver = 0

    var currentX: CGFloat?



    let greenPlayer = SKSpriteNode(imageNamed: "Image/Players/greenPlayer.png")

    override func didMoveToView(view: SKView) {

        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.physicsWorld.contactDelegate = self
        self.physicsBody!.friction = 0
        self.physicsWorld.gravity = CGVectorMake(-0.0, -0.8)


        self.addChild(labelHolder)

        scoreLabel.fontName = "Helvetica"
        scoreLabel.fontSize = 60
        scoreLabel.text = "0"
        scoreLabel.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height - 140)
        scoreLabel.zPosition = 10
        self.addChild(scoreLabel)

        //self.physicsWorld.contactDelegate = self

        self.addChild(movingObjects)

        let backgroundTexture = SKTexture(imageNamed: "Image/TempBG.png")

        background=SKSpriteNode(texture: backgroundTexture)
        background.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        background.size.width = self.frame.width
        background.zPosition = 0
        self.addChild(background)

        greenPlayer.physicsBody = SKPhysicsBody(circleOfRadius: greenPlayer.size.height/2)
        greenPlayer.physicsBody?.dynamic = true
        greenPlayer.physicsBody?.allowsRotation = false
        greenPlayer.physicsBody?.categoryBitMask = playerGroup
        greenPlayer.physicsBody?.collisionBitMask = objectGroup
        greenPlayer.physicsBody?.contactTestBitMask = objectGroup
        greenPlayer.physicsBody?.collisionBitMask = gapGroup
        greenPlayer.physicsBody?.collisionBitMask = boundary
        //self.greenPlayer.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)

        self.greenPlayer.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        greenPlayer.zPosition = 5
        self.addChild(greenPlayer)

        currentX = self.greenPlayer.position.x


        //if motionManager.accelerometerAvailable == true {
        motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler:{ data, error in

            if data!.acceleration.x < 0 {
                self.destX = self.currentX! + CGFloat(data!.acceleration.x * 1000)
            }
            else if data!.acceleration.x > 0 {
                self.destX = self.currentX! + CGFloat(data!.acceleration.x * 1000)
            }
        })

        NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("makeDodges"), userInfo: nil, repeats: true)
    }

    func makeDodges() {


        if(gameOver == 0){

            let gapWidth = greenPlayer.size.width * 3
            let movementAmount = arc4random() % UInt32(self.frame.size.width / 2)
            let dodgeOffSet = CGFloat(movementAmount) - (self.frame.size.width / 4)

            let moveDodges = SKAction.moveByX(0, y: self.frame.size.height * 2, duration: NSTimeInterval(self.frame.size.height / 100))
            let removeDodges = SKAction.removeFromParent()
            let moveAndRemoveDodges = SKAction.sequence([moveDodges, removeDodges])

            let dodge1Texture = SKTexture(imageNamed: "Image/Dodge.png")
            let dodge1 = SKSpriteNode(texture: dodge1Texture)
            dodge1.position = CGPoint(x: CGRectGetMidX(self.frame) + dodge1.size.width/2 + gapWidth/2 + dodgeOffSet, y: CGRectGetMidY(self.frame) - self.frame.size.height)
            dodge1.runAction(moveDodges)
            dodge1.physicsBody = SKPhysicsBody(rectangleOfSize: dodge1.size)
            dodge1.physicsBody?.dynamic = false
            dodge1.physicsBody?.categoryBitMask = objectGroup
            dodge1.zPosition = 10
            movingObjects.addChild(dodge1)

            let dodge2Texture = SKTexture(imageNamed: "Image/Dodge.png")
            let dodge2 = SKSpriteNode(texture: dodge2Texture)
            dodge2.position = CGPoint(x: CGRectGetMidX(self.frame) - dodge2.size.width/2 - gapWidth/2 + dodgeOffSet , y: CGRectGetMidY(self.frame) - self.frame.size.height)

            dodge2.runAction(moveDodges)
            dodge2.physicsBody = SKPhysicsBody(rectangleOfSize: dodge2.size)
            dodge2.physicsBody?.dynamic = false
            dodge2.physicsBody?.categoryBitMask = objectGroup
            dodge2.zPosition = 10
            movingObjects.addChild(dodge2)

            let gap = SKNode()
            gap.position = CGPoint(x: CGRectGetMidX(self.frame) + dodgeOffSet , y: CGRectGetMidY(self.frame) - self.frame.size.height)
            gap.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(dodge1.size.height, gapWidth))
            gap.runAction(moveAndRemoveDodges)
            gap.physicsBody?.dynamic = false
            gap.physicsBody?.collisionBitMask = gapGroup
            gap.physicsBody?.categoryBitMask = gapGroup
            gap.physicsBody?.contactTestBitMask = playerGroup
            movingObjects.addChild(gap)

        }
    }

    func didBeginContact(contact: SKPhysicsContact) {

        if contact.bodyA.categoryBitMask == gapGroup || contact.bodyB.categoryBitMask == gapGroup {

            score++

            print(score)

            scoreLabel.text = "\(score)"

        } else {

            if gameOver == 0 {

                gameOver = 1
                movingObjects.speed = 0

                let scene:SKScene = GameScene(size: self.frame.size)
                scene.scaleMode = .AspectFill
                let transition:SKTransition = SKTransition.fadeWithDuration(2)
                self.view?.presentScene(scene, transition: transition)
            }
        }


    }



    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        if(gameOver == 0) {

            greenPlayer.physicsBody?.velocity = CGVectorMake(0, 0)
            greenPlayer.physicsBody?.applyImpulse(CGVectorMake(0, 50))

        } else {

            score = 0
            scoreLabel.text = "0"
            movingObjects.removeAllChildren()
            self.greenPlayer.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
            greenPlayer.physicsBody?.velocity = CGVectorMake(0, 0)
            labelHolder.removeAllChildren()
            gameOver = 0
            movingObjects.speed = 1
            currentX = CGRectGetMidX(self.frame)

        }

    }

    override func update(currentTime: CFTimeInterval) {

        let action = SKAction.moveToX(destX, duration: 1)
        self.greenPlayer.runAction(action)

    }
}

最佳答案

您永远不会停止并删除旧的运动管理器队列,因此您的旧场景永远不会消失,从而导致您的问题。

在您想要销毁旧场景的地方添加 motionManager.stopAccelerometerUpdates();motionManager = nil;,如果您不销毁旧场景,而只是重置数据,则只需添加motionManager.stopAccelerometerUpdates(); 到您要重置场景的位置。

关于ios - 加速计在第一款游戏中有效,但在第二款游戏中变得疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33368176/

相关文章:

ios - 如何从终端配置代码签名身份

ios - 如何在Dropbox iPhone应用程序中集成注销功能?

swift - 将 UILabel 发送到另一个 UILabel 后面 (Swift)

ios - Swift中反引号的实际应用

ios - SpriteKit : SKNode zRotation + Anti-Aliasing

ios - 我的项目是否需要 SpriteKit 场景 (.sks) 文件?

iOS:是否可以扫描多个二维码、检测它们并选取一个?

ios - iOS上的圆形头像和性能问题

macos - 如何使用 indexOf 获取所选 NSCollectionView 的索引?

ios - 将 SKSpriteNode.isHidden 更改为 false 当被光线转换击中时,否则将其设置为 true