ios - flappy Bird 克隆 Xcode 7 Swift 2 如何重置旋转

标签 ios swift rotation sprite-kit

我学习如何在 iOS 上创建游戏。现在我创建了一个 Flappy 鸟克隆。 Flappy Bird Clone 我对此很感兴趣——当鸟接触某个管道时,它就会开始旋转。游戏当然就结束了。但当我开始新游戏时,鸟仍然旋转。 如果我把这条线 bird.physicalBody?.allowsRotation = false 在 GameScene.swift 中,小鸟完全停止旋转。那不是我想要的。我想允许轮换。但是当开始新游戏时,小鸟应该处于默认位置并且不要旋转。 我应该做什么才能让它发挥作用?感谢您的帮助。

//
//  GameScene.swift
//  Flappy Bird
//
//  Created by Admin on 10.10.15.
//  Copyright (c) 2015 Alex. All rights reserved.
//

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    var score = 0

    var gameOver = false

    var gameOverLabel = SKLabelNode()

    var scoreLabel = SKLabelNode ()

    var bird = SKSpriteNode()

    var bg = SKSpriteNode()

    var movingObjects = SKSpriteNode()

    var labelContainer = SKSpriteNode()

    var pipe1 = SKSpriteNode()
    var pipe2 = SKSpriteNode()

    enum ColliderType: UInt32 {

        case Bird = 1
        case Object = 2
        case Gap = 4
    }

    func makeBg () {

        let bgTexture = SKTexture(imageNamed: "bg.png")
        let movebg = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: 10)
        let replacebg = SKAction.moveByX(bgTexture.size().width, y: 0, duration: 0)
        let movebgForever = SKAction.repeatActionForever(SKAction.sequence([movebg,replacebg]))

        for var i: CGFloat = 0; i<2; i++ {

            bg = SKSpriteNode(texture: bgTexture)

            bg.position = CGPoint(x: bgTexture.size().width / 2 + bgTexture.size().width * i, y: CGRectGetMidY(self.frame))

            bg.zPosition = -5

            bg.size.height = self.frame.height

            bg.runAction(movebgForever)

            movingObjects.addChild(bg)

        }

    }

    override func didMoveToView(view: SKView) {

        self.physicsWorld.contactDelegate = self

        self.addChild(movingObjects)
        self.addChild(labelContainer)

        makeBg()

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

        addChild(scoreLabel)

        let birdTexture = SKTexture(imageNamed: "flappy1.png")
        let birdTexture2 = SKTexture(imageNamed: "flappy2.png")

        let animation = SKAction.animateWithTextures([birdTexture,birdTexture2], timePerFrame: 0.1)
        let makeBirdFlap = SKAction.repeatActionForever(animation)
        bird = SKSpriteNode(texture: birdTexture)
        bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        bird.runAction(makeBirdFlap)
        bird.physicsBody = SKPhysicsBody(circleOfRadius: birdTexture.size().height/2)
        bird.physicsBody!.dynamic = true

        bird.physicsBody!.categoryBitMask = ColliderType.Bird.rawValue
        bird.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue
        bird.physicsBody?.collisionBitMask = ColliderType.Object.rawValue



        self.addChild(bird)

        var ground = SKNode()
        ground.position = CGPointMake(0, 0)
        ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.size.width, 1))
        ground.physicsBody!.dynamic = false

        ground.physicsBody!.categoryBitMask = ColliderType.Object.rawValue
        ground.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue
        ground.physicsBody?.collisionBitMask = ColliderType.Object.rawValue


        self.addChild(ground)


        _ = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("makePipes"), userInfo: nil, repeats: true)

    }

    func makePipes () {

        let gapHeight = bird.size.height * 4

        let movementAmount = arc4random() % UInt32(self.frame.size.height / 2)

        let pipeOffset = CGFloat(movementAmount) - self.frame.size.height / 4

        let movePipes = SKAction.moveByX(-self.frame.size.width * 2, y: 0, duration: NSTimeInterval (self.frame.size.width / 100))
        let removePipes = SKAction.removeFromParent()
        let moveAndRemovePipes = SKAction.sequence([movePipes,removePipes])


        let pipeTexture1 = SKTexture(imageNamed: "pipe1.png")
        let pipe1 = SKSpriteNode(texture: pipeTexture1)
        pipe1.position = CGPoint(x: CGRectGetMidX(self.frame) + self.frame.size.width, y: CGRectGetMidY(self.frame) + pipeTexture1.size().height/2 + gapHeight/2 + pipeOffset)
        pipe1.runAction(moveAndRemovePipes)

        pipe1.physicsBody = SKPhysicsBody(rectangleOfSize: pipeTexture1.size())
        pipe1.physicsBody?.dynamic = false

        pipe1.physicsBody!.categoryBitMask = ColliderType.Object.rawValue
        pipe1.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue
        pipe1.physicsBody?.collisionBitMask = ColliderType.Object.rawValue


        movingObjects.addChild(pipe1)

        let pipeTexture2 = SKTexture(imageNamed: "pipe2.png")
        let pipe2 = SKSpriteNode(texture: pipeTexture2)
        pipe2.position = CGPoint(x: CGRectGetMidX(self.frame) + self.frame.size.width, y: CGRectGetMidY(self.frame) - pipeTexture2.size().height/2 - gapHeight/2 + pipeOffset)

        pipe2.runAction(moveAndRemovePipes)

        pipe2.physicsBody = SKPhysicsBody(rectangleOfSize: pipeTexture2.size())
        pipe2.physicsBody!.dynamic = false

        pipe2.physicsBody!.categoryBitMask = ColliderType.Object.rawValue
        pipe2.physicsBody!.contactTestBitMask = ColliderType.Object.rawValue
        pipe2.physicsBody!.collisionBitMask = ColliderType.Object.rawValue


        movingObjects.addChild(pipe2)

        var gap = SKNode()
        gap.position = CGPoint(x: CGRectGetMidX(self.frame) + self.frame.size.width, y: CGRectGetMidY(self.frame) + pipeOffset)
        gap.runAction(moveAndRemovePipes)
        gap.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(pipe1.size.width, gapHeight))
        gap.physicsBody?.dynamic = false

        gap.physicsBody!.categoryBitMask = ColliderType.Gap.rawValue
        gap.physicsBody!.contactTestBitMask = ColliderType.Bird.rawValue
        gap.physicsBody!.collisionBitMask = ColliderType.Gap.rawValue

        movingObjects.addChild(gap)
    }

    func didBeginContact(contact: SKPhysicsContact) {

        if contact.bodyA.categoryBitMask == ColliderType.Gap.rawValue || contact.bodyB.categoryBitMask == ColliderType.Gap.rawValue {

            score++

            scoreLabel.text = String(score)

        } else {


            if gameOver == false {
            gameOver = true
            self.speed = 0

            gameOverLabel.fontName = "Helvetica"
            gameOverLabel.fontSize = 30
            gameOverLabel.text = "Game is over. Tap to play again."
            gameOverLabel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
            labelContainer.addChild(gameOverLabel)

            }

        }
    }

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

        if gameOver == false {
            bird.physicsBody!.velocity = CGVectorMake(0, 0)
            bird.physicsBody!.applyImpulse(CGVectorMake(0, 50))


        } else {

            score = 0
            scoreLabel.text = "0"
            bird.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
            bird.physicsBody?.velocity = CGVectorMake(0, 0)
            bird.physicsBody!.allowsRotation = false

            movingObjects.removeAllChildren()

            makeBg()

            self.speed = 1

            gameOver = false

            labelContainer.removeAllChildren()


        }
    }


    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

最佳答案

一个简单的解决方案是重置小鸟的角速度和旋转角度。修改touchesBegan中的代码,该代码在游戏结束时调用:

bird.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
bird.physicsBody?.velocity = CGVectorMake(0, 0)
bird.physicsBody?.angularVelocity = 0
bird.zRotation = 0

关于ios - flappy Bird 克隆 Xcode 7 Swift 2 如何重置旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065855/

相关文章:

ios - heightForRowAtIndexPath 设置错误行的高度

ios - 使用Metal绘制矢量集

ios - 如何通过文件夹ios从 Assets 中获取图像

javascript - 创建旋转矩阵

jquery - 我怎样才能让动画跟随我的光标

ios - 仅锁定主 UIViewController 的方向 - iOS

ios - 从概念上讲,子类化 UIView 是否正确?

swift - 从 Firebase 存储中删除包含内容的文件夹

swift - 如何使用 Swift 中的 Codable 转换带有可选小数秒的日期字符串?

ios - UIBezierPath 视觉错误?