精灵套件游戏场景不应该改变

时间:2015-08-17 16:21:03

标签: ios swift sprite-kit

在我正在建造的游戏中,一个人应该抓住从天而降的球。如果球从屏幕上掉下来意味着他没有接球,那么场景应该改变为场景中的游戏。问题是,即使球不在屏幕下方,屏幕也会改变。但屏幕将变为空白屏幕,而不是GameOverScene()

以下是GameScene() ...

的代码
//
//  GameScene.swift
//  catch balls
//
//  Created by Ankith Udupa on 8/10/15.
//  Copyright (c) 2015 UdupaLabs. All rights reserved.
//

import SpriteKit

var score = 0
var lossFlag = false

class GameScene: SKScene, SKPhysicsContactDelegate {
    var person = SKSpriteNode(imageNamed: "guyLeft_1.png")
    var left = true
    let kScoreHudName = "scoreHud"

    struct PhysicsCategory {
        static let None  : UInt32 = 0
        static let All   : UInt32 = UInt32.max
        static let Ball  : UInt32 = 0b1
        static let Person: UInt32 = 0b10
    }

    override func didMoveToView(view: SKView) {
        var content = false
        //set up screen
        setUpScreen()

        //set up the physics 
        physicsWorld.gravity = CGVectorMake(0, 0)
        physicsWorld.contactDelegate = self

        //add ball
        runAction(SKAction.repeatActionForever(
            SKAction.sequence([
                SKAction.runBlock(addBall),
                SKAction.waitForDuration(1.0)
                ])
            ))

    }

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

    }


    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
       if ((person.position.x > person.size.width/2) && (person.position.x < size.width-(person.size.width/2))){

        if left {
            var leftMove = SKAction.moveByX(5, y: 0, duration: 0.1)
            person.runAction(leftMove)
        }

        if !left { // or use an if-else construct
            var rightMove = SKAction.moveByX(-5, y: 0, duration: 0.1)
            person.runAction(rightMove)
        }


    }

    }

    //random number gen functions
    func random() -> CGFloat {
        return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
    }

    func random(#min: CGFloat, max: CGFloat) -> CGFloat {
        return random() * (max - min) + min
    }

    //add ball function
    func addBall(){

        //create ball sprite
        var ball = SKSpriteNode(imageNamed: "ball.png")

        //create physics for ball
        ball.physicsBody = SKPhysicsBody(rectangleOfSize: ball.size) // 1
        ball.physicsBody?.dynamic = true // 2
        ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball // 3
        ball.physicsBody?.contactTestBitMask = PhysicsCategory.Person // 4
        ball.physicsBody?.collisionBitMask = PhysicsCategory.None // 5
        //generate random postion along x axis for ball to spawn
        let actualX = random(min:ball.size.width/2+1, max: size.width - ball.size.width/2-1)

        //set balls positon
        ball.position = CGPoint(x: actualX, y: size.height - ball.size.width/2)

        //add ball to scene
        addChild(ball)

        //determine speed of ball
        let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))

        //create movement actions and run them
        let actionMove = SKAction.moveTo(CGPoint(x:actualX, y:  -ball.size.width/2), duration: NSTimeInterval(actualDuration))

        let actionMoveDone = SKAction.removeFromParent()

        let Loss = SKAction.runBlock() {
            let reveal = SKTransition.crossFadeWithDuration(0.1)
            let gameOverScene = GameOverScene()
            self.view?.presentScene(GameOverScene(), transition: reveal)
        }
        ball.runAction(SKAction.sequence([actionMove, Loss, actionMoveDone]))

    }

    //setUpScreen
    func setUpScreen(){
        self.backgroundColor = SKColor.whiteColor()

        var ground = SKShapeNode(rectOfSize: CGSizeMake(self.frame.size.width, self.frame.size.height * 0.2))
        ground.position = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height * 0.1)
        ground.fillColor = SKColor.blueColor()
        self.addChild(ground)

        person.position = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height * 0.2)
        setUpPersonPhysics()
        self.addChild(person)

    }

    //set up person physics
    func setUpPersonPhysics(){
        person.physicsBody = SKPhysicsBody(rectangleOfSize: person.size)
        person.physicsBody?.dynamic = true
        person.physicsBody?.categoryBitMask = PhysicsCategory.Person
        person.physicsBody?.contactTestBitMask = PhysicsCategory.Ball
        person.physicsBody?.collisionBitMask = PhysicsCategory.None
        person.physicsBody?.usesPreciseCollisionDetection = true
    }

    func didBeginContact(contact: SKPhysicsContact) {

        // 1
        var firstBody: SKPhysicsBody
        var secondBody: SKPhysicsBody
        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
            firstBody = contact.bodyA
            secondBody = contact.bodyB
        }
        else {
            firstBody = contact.bodyB
            secondBody = contact.bodyA
        }

        // 2
        if ((firstBody.categoryBitMask & PhysicsCategory.Ball != 0) &&
            (secondBody.categoryBitMask & PhysicsCategory.Person != 0)) {
               personDidCollideWithBall(secondBody.node as! SKSpriteNode, ball: firstBody.node as! SKSpriteNode)
        }

    }

    //called when person collides with ball
    func personDidCollideWithBall(person:SKSpriteNode, ball:SKSpriteNode) {
        println("hit")
        ball.removeFromParent()
        score++
    }

}

以下是gameOverScene() ...

的代码
//
//  gameOverScene.swift
//  catch babies
//
//  Created by Ankith Udupa on 8/12/15.
//  Copyright (c) 2015 UdupaLabs. All rights reserved.
//

import Foundation
import SpriteKit

class GameOverScene: SKScene {

    var message = "Game Over"

    override func didMoveToView(view: SKView) {

        self.backgroundColor = SKColor.whiteColor()
        setUpTextOutPut()

    }
    func setUpTextOutPut(){
        let gameOverLabel = SKLabelNode(fontNamed: "Superclarendon-Black")
        gameOverLabel.text = message
        gameOverLabel.fontSize = 40
        gameOverLabel.fontColor = SKColor.orangeColor()
        gameOverLabel.position = CGPoint(x: size.width/2, y: size.height/2)
        addChild(gameOverLabel)

        let scoreLabel = SKLabelNode(fontNamed: "Superclarendon-Black")
        scoreLabel.text = "\(score)"
        scoreLabel.fontSize = 40
        scoreLabel.fontColor = SKColor.orangeColor()
        scoreLabel.position = CGPoint(x: size.width/2, y: size.height/2-50)
        addChild(scoreLabel)

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

    }
}

1 个答案:

答案 0 :(得分:0)

错误在于你的addBall方法,

 //add ball function
    func addBall(){

        //create ball sprite
        var ball = SKSpriteNode(imageNamed: "ball.png")

        //create physics for ball
        ball.physicsBody = SKPhysicsBody(rectangleOfSize: ball.size) // 1
        ball.physicsBody?.dynamic = true // 2
        ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball // 3
        ball.physicsBody?.contactTestBitMask = PhysicsCategory.Person // 4
        ball.physicsBody?.collisionBitMask = PhysicsCategory.None // 5
        //generate random postion along x axis for ball to spawn
        let actualX = random(min:ball.size.width/2+1, max: size.width - ball.size.width/2-1)

        //set balls positon
        ball.position = CGPoint(x: actualX, y: size.height - ball.size.width/2)

        //add ball to scene
        addChild(ball)

        //determine speed of ball
        let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))

        //create movement actions and run them
        let actionMove = SKAction.moveTo(CGPoint(x:actualX, y:  -ball.size.width/2), duration: NSTimeInterval(actualDuration))

        let actionMoveDone = SKAction.removeFromParent()

        let Loss = SKAction.runBlock() {
            let reveal = SKTransition.crossFadeWithDuration(0.1)
            let gameOverScene = GameOverScene()
            self.view?.presentScene(GameOverScene(), transition: reveal)
        }
        ball.runAction(SKAction.sequence([actionMove, Loss, actionMoveDone]))


    }

如果正确查看方法,则要求将序列运行到sprite并在runBlock内部移动到另一个场景。你需要检查球是否在这个区域内的界外,然后才能在场景中展示你的游戏吗?

应该是这样的,

let Loss = SKAction.runBlock() {
                if ball.position.x > self.size.width + ball.frame.size.width * 0.5  || ball.position.y < ball.frame.size.height * 0.5 {
                    let reveal = SKTransition.crossFadeWithDuration(0.1)
                    let gameOverScene = GameOverScene()
                    self.view?.presentScene(GameOverScene(), transition: reveal)
            }
}