Spritekit didBegin函数不够快

时间:2019-01-29 19:30:14

标签: performance sprite-kit

我正在用Spritekit开发2D游戏。如果节点的旋转速度高于0.25秒,但低于此数字,我的gameOver函数就会调用,我的代码就可以正常工作。

除非spinSpeed最低为0.25或更高,否则此游戏永远不会调用gameOver函数。

我想知道如何对didBeginContact函数进行精确的计算。

我编码有误吗?

任何帮助将不胜感激。

以下是代码:

class EasyScene: SKScene, UIGestureRecognizerDelegate, SKPhysicsContactDelegate {


    var leftSection = SKSpriteNode()
    var rightSection = SKSpriteNode()
    var bottomSection = SKSpriteNode()
    var colorStick = SKSpriteNode()

    let leftSectionCat:UInt32 = 0x1 << 0
    let rightSectionCat:UInt32 = 0x1 << 1
    let bottomSectionCat:UInt32 = 0x1 << 2
    let stickSectionCat:UInt32 = 0x1 << 3


    let borderCat : UInt32 = 0x1 << 8


    var isOverOnLeft : Bool = false
    var isOverOnRight : Bool = false
    var isOverOnBottom : Bool = false

    var starterTouch : Int = 0

    var enteredOnLeft : Bool = false
    var enteredOnRight : Bool = false
    var enteredOnBottom : Bool = false
    var zRotationValuesOfStick : [CGFloat] = []

    var spinSpeed : CGFloat = 0.45

    var stickLeftEquals : [String : String ] = ["stickBlue" : "leftBlue","stickOrange" : "leftOrange","stickRed" : "leftRed", "stickGreen" : "leftGreen", "stickYellow" : "leftYellow","stickGray" : "leftGray"]

    var stickRightEquals : [String : String ] = ["stickBlue" : "rightBlue","stickOrange" : "rightOrange","stickRed" : "rightRed", "stickGreen" : "rightGreen", "stickYellow" : "rightYellow","stickGray" : "rightGray"]

    var stickBottomEquals : [String : String ] = ["stickBlue" : "bottomBlue","stickOrange" : "bottomOrange","stickRed" : "bottomRed", "stickGreen" : "bottomGreen", "stickYellow" : "bottomYellow","stickGray" : "bottomGray"]


    var leftSectionTextureDatabase : [String] = ["leftBlue", "leftOrange", "leftRed", "leftGreen", "leftYellow", "leftGray"]
    var selectedLeftSectionTexture : String = ""


    var rightSectionTextureDatabase : [String] = ["rightBlue", "rightOrange", "rightRed", "rightGreen", "rightYellow", "rightGray"]
    var selectedRightSectionTexture : String = ""


    var bottomSectionTextureDatabase : [String] = ["bottomBlue", "bottomOrange", "bottomRed", "bottomGreen", "bottomYellow", "bottomGray"]
    var selectedBottomSectionTexture : String = ""



    var stickTextureDatabase : [String] = ["stickBlue", "stickOrange", "stickRed", "stickGreen", "stickYellow", "stickGray"]
    var selectedStickTexture : [String] = []

    var currentStickColor : String = ""

    var pickedColors : [Int] = []
    var colorStickColors : [Int] = []


    var isGameOver : Bool = false

    override func didMove(to view: SKView) {
        self.physicsWorld.contactDelegate = self


        pick3Colors()
        assignColorToColorStick()
        createStickInBetween()
        makeBordersAvaliable()
        assignSectionColors()
        pickStartingStickColor()
        someFunction()



    }



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


        if starterTouch == 0 {
            let randomStarter = Int(arc4random_uniform(2))
            var move = SKAction()
            if randomStarter == 0 {
                move = SKAction.rotate(byAngle: 1, duration: TimeInterval(spinSpeed))

            }else{
                move = SKAction.rotate(byAngle: -1, duration: TimeInterval(spinSpeed))
            }

            let repeatIt = SKAction.repeatForever(move)
            colorStick.run(repeatIt)
            starterTouch = starterTouch + 1

        }else{
            checkIfItIsRightMove()
            changeColorOfStick()
            turnOpposite()

        }


    }

    override func update(_ currentTime: TimeInterval) {


        if zRotationValuesOfStick.count > 2{
            zRotationValuesOfStick.removeFirst()
        }
        let radians:CGFloat = colorStick.zRotation
        let degrees = radians * 180 / CGFloat(Double.pi)
        zRotationValuesOfStick.append(degrees)



    }



    func gameOver(){

        isGameOver = true
        colorStick.removeAllActions()


        leftSection.physicsBody?.collisionBitMask = borderCat | rightSectionCat | bottomSectionCat | stickSectionCat
        rightSection.physicsBody?.collisionBitMask = borderCat | leftSectionCat | bottomSectionCat | stickSectionCat
        bottomSection.physicsBody?.collisionBitMask = borderCat | leftSectionCat | rightSectionCat | stickSectionCat
        colorStick.physicsBody?.collisionBitMask = borderCat | leftSectionCat | rightSectionCat | bottomSectionCat

        colorStick.physicsBody?.pinned = false
        leftSection.physicsBody?.pinned = false
        rightSection.physicsBody?.pinned = false
        bottomSection.physicsBody?.pinned = false

        colorStick.physicsBody?.affectedByGravity = true
        leftSection.physicsBody?.affectedByGravity = true
        rightSection.physicsBody?.affectedByGravity = true
        bottomSection.physicsBody?.affectedByGravity = true

        leftSection.physicsBody?.allowsRotation = true
        rightSection.physicsBody?.allowsRotation = true
        bottomSection.physicsBody?.allowsRotation = true

        leftSection.physicsBody?.isDynamic = true
        rightSection.physicsBody?.isDynamic = true
        bottomSection.physicsBody?.isDynamic = true




    }

    func increaseSpeed (incomingSpeed : CGFloat){
        if incomingSpeed <= 0.15{
//            spinSpeed = spinSpeed - 0.005
            print("MAX!")
        }else{
            spinSpeed = spinSpeed - 0.010
        }

    }

    func checkIfItIsRightMove (){
        if isOverOnLeft == true && isOverOnRight == false && isOverOnBottom == false && isGameOver == false{
            if stickLeftEquals["\(currentStickColor)"] == selectedLeftSectionTexture{
                enteredOnLeft = false
                if enteredOnLeft == false{
                   increaseSpeed(incomingSpeed: spinSpeed)
                }
                acceptedMove()
            }else if stickLeftEquals["\(currentStickColor)"] != selectedLeftSectionTexture{

                gameOver()

            }
        }
        if isOverOnLeft == false && isOverOnRight == true && isOverOnBottom == false && isGameOver == false{
            if stickRightEquals["\(currentStickColor)"] == selectedRightSectionTexture{
                enteredOnRight = false
                if enteredOnRight == false{
                    increaseSpeed(incomingSpeed: spinSpeed)
                }

                acceptedMove()
            }else if stickRightEquals["\(currentStickColor)"] != selectedRightSectionTexture{
                gameOver()

            }

        }
        if isOverOnLeft == false && isOverOnRight == false && isOverOnBottom == true && isGameOver == false{
            if stickBottomEquals["\(currentStickColor)"] == selectedBottomSectionTexture{
                enteredOnBottom = false
                if enteredOnBottom == false{
                     increaseSpeed(incomingSpeed: spinSpeed)
                }

                acceptedMove()
            }else if stickBottomEquals["\(currentStickColor)"] != selectedBottomSectionTexture{
                gameOver()

            }
        }
    }


    func didBegin(_ contact: SKPhysicsContact) {
        let collusion:UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

        if collusion == leftSectionCat | stickSectionCat  && collusion != rightSectionCat | stickSectionCat  && collusion != bottomSectionCat | stickSectionCat {
            if stickLeftEquals["\(currentStickColor)"] == selectedLeftSectionTexture{
                enteredOnLeft = true
            }
            isOverOnLeft = true
            isOverOnRight = false
            isOverOnBottom = false

        }else if collusion != leftSectionCat | stickSectionCat && enteredOnLeft == true && collusion == rightSectionCat | stickSectionCat {
            if stickLeftEquals["\(currentStickColor)"] == selectedLeftSectionTexture{

                if isGameOver == false{
                    gameOver()

                }

            }

        }
        else if collusion != leftSectionCat | stickSectionCat && enteredOnLeft == true && collusion == bottomSectionCat | stickSectionCat {
            if stickLeftEquals["\(currentStickColor)"] == selectedLeftSectionTexture{
                if isGameOver == false{
                    gameOver()

                }
            }

        }

         if collusion == rightSectionCat | stickSectionCat  && collusion != leftSectionCat | stickSectionCat  && collusion != bottomSectionCat | stickSectionCat {
            if stickRightEquals["\(currentStickColor)"] == selectedRightSectionTexture{
                enteredOnRight = true
            }
            isOverOnLeft = false
            isOverOnRight = true
            isOverOnBottom = false

        }else if collusion != rightSectionCat | stickSectionCat && enteredOnRight == true && collusion == leftSectionCat | stickSectionCat {
            if stickRightEquals["\(currentStickColor)"] == selectedRightSectionTexture{
                if isGameOver == false{
                    gameOver()

                }
            }

        }
        else if collusion != rightSectionCat | stickSectionCat && enteredOnRight == true && collusion == bottomSectionCat | stickSectionCat {
            if stickRightEquals["\(currentStickColor)"] == selectedRightSectionTexture{
                if isGameOver == false{
                    gameOver()

                }
            }

        }

        if collusion == bottomSectionCat | stickSectionCat  && collusion != leftSectionCat | stickSectionCat  && collusion != rightSectionCat | stickSectionCat {
            if stickBottomEquals["\(currentStickColor)"] == selectedBottomSectionTexture{
                enteredOnBottom = true
            }
            isOverOnLeft = false
            isOverOnRight = false
            isOverOnBottom = true

        }else if collusion != bottomSectionCat | stickSectionCat && enteredOnBottom == true && collusion == leftSectionCat | stickSectionCat {
            if stickBottomEquals["\(currentStickColor)"] == selectedBottomSectionTexture{
                if isGameOver == false{
                    gameOver()

                }
            }

        }
        else if collusion != bottomSectionCat | stickSectionCat && enteredOnBottom == true && collusion == rightSectionCat | stickSectionCat {
            if stickBottomEquals["\(currentStickColor)"] == selectedBottomSectionTexture{
                if isGameOver == false{
                    gameOver()


                }
            }

        }

    }

    func acceptedMove(){
        sessionScore = sessionScore + 1
        sessionScoreNumber.text = "\(sessionScore)"
        let movement = SKAction.scale(to: 1.2, duration: 0.5)
        let loop = SKAction.repeat(movement, count: 1)
        let movement2 = SKAction.scale(to: 1, duration: 0.5)
        let loop2 = SKAction.repeat(movement2, count: 1)
        let seq = SKAction.sequence([loop, loop2])

        sessionScoreNumber.run(seq)

    }

    func createStickInBetween(){
        let colorStickTexture = SKTexture(imageNamed: selectedStickTexture[0])
        colorStick = SKSpriteNode(texture: colorStickTexture)
        colorStick.position.x = 211.671
        colorStick.position.y = -400.74
        colorStick.size.width = 31.524
        colorStick.size.height = 124.74
        colorStick.anchorPoint.x = 0.5
        colorStick.anchorPoint.y = 0
        colorStick.zPosition = 2

        let centerPoint = CGPoint(x:colorStick.size.width / 2 - (colorStick.size.width * colorStick.anchorPoint.x), y:colorStick.size.height / 2 - (colorStick.size.height * colorStick.anchorPoint.y))

        colorStick.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 15, height: colorStick.size.height), center: centerPoint)

        colorStick.name = "denemeColor"
        colorStick.physicsBody?.isDynamic = true
        colorStick.physicsBody?.pinned = true
        colorStick.physicsBody?.allowsRotation = true
        colorStick.physicsBody?.affectedByGravity = false
        colorStick.physicsBody?.usesPreciseCollisionDetection = true


        self.addChild(colorStick)


        colorStick.physicsBody?.categoryBitMask = stickSectionCat
    }

    func makeBordersAvaliable (){

        let borderSideTexture = SKTexture(imageNamed: "sideBorders")
        borderSide = SKSpriteNode(texture: borderSideTexture)
        borderSide.physicsBody = SKPhysicsBody(texture: borderSideTexture, size: CGSize(width: borderSide.size.width, height: borderSide.size.height))
        borderSide.position.x = 207
        borderSide.position.y = -368
        borderSide.size.width = 414
        borderSide.size.height = 736
        borderSide.anchorPoint.x = 0.5
        borderSide.anchorPoint.y = 0.5
        borderSide.zPosition = 5
        borderSide.name = "bs"
        borderSide.physicsBody?.isDynamic = false
        borderSide.physicsBody?.allowsRotation = false
        borderSide.physicsBody?.affectedByGravity = false
        borderSide.alpha = 0
        self.addChild(borderSide)

        borderSide.physicsBody?.categoryBitMask = borderCat


    }

    func someFunction(){
        leftSection.physicsBody?.contactTestBitMask = stickSectionCat
        bottomSection.physicsBody?.contactTestBitMask = stickSectionCat
        rightSection.physicsBody?.contactTestBitMask = stickSectionCat

                     colorStick.physicsBody?.collisionBitMask = 0x1 << 15


    }

    func turnOpposite(){

        if isGameOver != true{
            colorStick.removeAllActions()

            let lastValue = zRotationValuesOfStick.last!
            let getTheLocation = zRotationValuesOfStick.count - 2
            let theOneBeforeTheLast = zRotationValuesOfStick[getTheLocation]

            let whatIsTheDifference = lastValue - theOneBeforeTheLast

            if whatIsTheDifference > 0 {
                let turnCounterClockWise = SKAction.rotate(byAngle: -1, duration: TimeInterval(spinSpeed))
                let turnCounterClockWiseLoop = SKAction.repeatForever(turnCounterClockWise)
                colorStick.run(turnCounterClockWiseLoop)
            }else if whatIsTheDifference != 0 && isGameOver == false{
                let turnClockWise = SKAction.rotate(byAngle: 1, duration: TimeInterval(spinSpeed))
                let turnClockWiseLoop = SKAction.repeatForever(turnClockWise)
                colorStick.run(turnClockWiseLoop)

            }
        }
    }


    func changeColorOfStick(){

        if isGameOver != true {
            let randomNumber = Int(arc4random_uniform(3))
            var colorViaRandomNumber = selectedStickTexture[randomNumber]

            while colorViaRandomNumber == currentStickColor {
                let rn = Int(arc4random_uniform(3))
                colorViaRandomNumber = selectedStickTexture[rn]
            }
            currentStickColor = colorViaRandomNumber
            colorStick.texture = SKTexture(imageNamed: currentStickColor)
        }
    }

    func pickStartingStickColor(){
        let randomNumber = Int(arc4random_uniform(3))
        currentStickColor = selectedStickTexture[randomNumber]
        colorStick.texture = SKTexture(imageNamed: currentStickColor)
    }

    func assignSectionColors(){
        selectedLeftSectionTexture = leftSectionTextureDatabase[pickedColors[0]]
        selectedRightSectionTexture = rightSectionTextureDatabase[pickedColors[1]]
        selectedBottomSectionTexture = bottomSectionTextureDatabase[pickedColors[2]]

        let leftSectionTexture = SKTexture(imageNamed: selectedLeftSectionTexture)
        leftSection = SKSpriteNode(texture: leftSectionTexture)
        leftSection.physicsBody = SKPhysicsBody(texture: leftSectionTexture, size: CGSize(width: leftSection.size.width, height: leftSection.size.height))
        leftSection.position.x = 141.352
        leftSection.position.y = -372.722
        leftSection.size.width = 172.16
        leftSection.size.height = 257.85
        leftSection.anchorPoint.x = 0.5
        leftSection.anchorPoint.y = 0.5
        leftSection.zPosition = 1
        leftSection.name = "leftDeneme"
        leftSection.physicsBody?.isDynamic = false
        leftSection.physicsBody?.allowsRotation = false
        leftSection.physicsBody?.affectedByGravity = false
        leftSection.physicsBody?.usesPreciseCollisionDetection = true

        self.addChild(leftSection)

        let rightSectionTexture = SKTexture(imageNamed: selectedRightSectionTexture)
        rightSection = SKSpriteNode(texture: rightSectionTexture)
        rightSection.physicsBody = SKPhysicsBody(texture: rightSectionTexture, size: CGSize(width: rightSection.size.width, height: rightSection.size.height))
        rightSection.position.x = 298.386
        rightSection.position.y = -373.071
        rightSection.size.width = 141.908
        rightSection.size.height = 257.152
        rightSection.anchorPoint.x = 0.5
        rightSection.anchorPoint.y = 0.5
        rightSection.zPosition = 1
        rightSection.physicsBody?.isDynamic = false

        rightSection.physicsBody?.allowsRotation = false
        rightSection.physicsBody?.affectedByGravity = false
        rightSection.physicsBody?.usesPreciseCollisionDetection = true

        self.addChild(rightSection)

        let bottomSectionTexture = SKTexture(imageNamed: selectedBottomSectionTexture)
        bottomSection = SKSpriteNode(texture: bottomSectionTexture)
        bottomSection.physicsBody = SKPhysicsBody(texture: bottomSectionTexture, size: CGSize(width: bottomSection.size.width, height: bottomSection.size.height))
        bottomSection.position.x = 212.141
        bottomSection.position.y = -515.223
        bottomSection.size.width = 242.19
        bottomSection.size.height = 93.846
        bottomSection.anchorPoint.x = 0.5
        bottomSection.anchorPoint.y = 0.5
        bottomSection.zPosition = 1
        bottomSection.physicsBody?.isDynamic = false
        bottomSection.physicsBody?.allowsRotation = false
        bottomSection.physicsBody?.affectedByGravity = false
        bottomSection.physicsBody?.usesPreciseCollisionDetection = true


        self.addChild(bottomSection)

        leftSection.physicsBody?.categoryBitMask = leftSectionCat
        rightSection.physicsBody?.categoryBitMask = rightSectionCat
        bottomSection.physicsBody?.categoryBitMask = bottomSectionCat

    }

    func assignColorToColorStick(){
        selectedStickTexture.append(stickTextureDatabase[pickedColors[0]])
        selectedStickTexture.append(stickTextureDatabase[pickedColors[1]])
        selectedStickTexture.append(stickTextureDatabase[pickedColors[2]])
    }

    func pick3Colors(){
        while pickedColors.count < 3 {
            let randomNumber = Int(arc4random_uniform(6))
            let howManyElements = pickedColors.count

            if howManyElements == 0 {
                pickedColors.append(randomNumber)
            }else if howManyElements == 1 {
                if randomNumber != pickedColors[0]{
                    pickedColors.append(randomNumber)
                }
            }else if howManyElements == 2 {
                if randomNumber != pickedColors[0] && randomNumber != pickedColors[1] {
                    pickedColors.append(randomNumber)
                }
            }

        }

    }


}

0 个答案:

没有答案