在 swift 中检测到碰撞时更改图像?

Change image when collision Detected in swift?

我正在制作一个简单的游戏作为一个项目,当我的 'bird image' 与另一个 'image'

发生冲突时需要更改它

现在我已经设置了所有碰撞检测我只需要将我的 'bird image' 的纹理更改为我的新图像

关于如何执行此操作的任何提示?我是编程新手,认为这很容易,但显然不是...

我试过改变

var birdTexture = SKTexture(imageNamed: "bird_img_1.png") // global variable

birdTexture = SKTexture(imageNamed: "bird_img_dead.png") // this is inside collision detection

游戏场景Class:-

import SpriteKit
  class GameScene: SKScene, SKPhysicsContactDelegate {

    var bg = SKSpriteNode()             // Create Background
    var bird = SKSpriteNode()           // Create User Bird
    var scoreLabel = SKLabelNode()      // Create Score Label
    var score: Int = 0                  // Create Score Integer
    var enemyBird = SKSpriteNode()      // Create Enemy Bird

    var birdGroup:UInt32 = 1            // Bird Collision Group
    var objectGroup:UInt32 = 2          // Enemy Collision Group
    var scoreGroup:UInt32 = 3           // Score Collision Group
    var gameOver = 0                    // Game Over function
    var movingObjects = SKNode()        // ??
    var scoreTimer = NSTimer()          // Create Score Timer
    var gameOverLabel = SKLabelNode()   // Game over label
    var labelHolder = SKSpriteNode()    // Holds Label - Game Over
    var enemySpawnTimer = NSTimer()     // Starts Enemy Spawner
    var Menu = 0


    /* Put Bird in and animate */
    var birdTexture = SKTexture(imageNamed: "bird_img_1.png")
    var birdTexture2 = SKTexture(imageNamed: "bird_img_2.png")
    var birdTexture3 = SKTexture(imageNamed: "bird_img_3.png")
    var birdTexture4 = SKTexture(imageNamed: "bird_img_4.png")

    var birdDeadTexture = SKTexture(imageNamed: "bird_img_dead.png")



    /* ------------------------------------ Main Setup ------------------------------------------ */


    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        println("Moved to Game Scene")


        movingObjects.speed = 0




        /* Background Image setup */
        backgroundImage()




        /* Set up deletates and physics and timer */
        self.physicsWorld.contactDelegate = self
        self.physicsWorld.gravity = CGVectorMake(0, -5)
        self.addChild(movingObjects)
        self.addChild(labelHolder)


        /*  Load Score Text */

        scoreLabel.fontName = "Helvetica"
        scoreLabel.fontSize = 60
        scoreLabel.text = "0"
        scoreLabel.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)+self.frame.size.height*0.3)
        self.addChild(scoreLabel)

        bird = SKSpriteNode(texture: birdTexture)
        bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        // Make bird smaller
        bird.size.height = bird.size.width/12
        bird.size.width = bird.size.width/12
        // Animate Bird
        var animation = SKAction.animateWithTextures([birdTexture, birdTexture2, birdTexture3, birdTexture4], timePerFrame: 0.08)
        var makeBirdFlap = SKAction.repeatActionForever(animation)
        bird.runAction(makeBirdFlap)
        // Load Physics
        // birdPhysics()
        // Run bird animation
        bird.zPosition = 10
        self.addChild(bird)

        /* Introduce ground and top into the scene */
        // Create Ground
        var ground = SKSpriteNode()
        ground.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height/100 * 16)
        ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1))
        ground.physicsBody?.dynamic = false
        ground.physicsBody?.categoryBitMask = objectGroup
        // Add Ground to scene
        self.addChild(ground)

        // Create Top
        var top = SKSpriteNode()
        top.position = CGPointMake(0, self.frame.size.height)
        top.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1))
        top.physicsBody?.dynamic = false
        top.physicsBody?.categoryBitMask = objectGroup
        // Add Top to scene
        self.addChild(top)
    }

    /* ------------------------------------ Spawning Enemy Birds ------------------------------------------ */
    /* Create and Spawn enemy birds */
    func enemySpawn() {

        let height = self.frame.size.height                             // screen height as variable
        let width = self.frame.size.width                               // screen width as variable

        var bottomBarHeight = self.frame.size.height*0.16               // bottom bar height
        var spawningPoint = height - bottomBarHeight                    // screen height - 16%

        var randSpawn = arc4random_uniform(UInt32(spawningPoint))       // random number between 0 and 645
        var finalSpawn = CGFloat(randSpawn) + bottomBarHeight           // add 16% (bottombarheight to the random number

        /*
        CHECK VALUES OF SPAWN
        println("\(height) is the total screen height")
        println("\(bottomBarHeight) is the pixels below the ground")
        println("\(spawningPoint) is the random range")
        println("\(randSpawn) is a random number")
        println("\(finalSpawn)  - Spawn Location")
        println(enemyBird.position)
        */





        if (enemyBird.position.y > 730) {
            enemyBird.position.y = 720
        }

        if (enemyBird.position.y < 130) {
            enemyBird.position.y = 135
        }



        // println(Int(enemyBird.position.y))


        // Create enemy bird
        var enemyBirdTexture = SKTexture(imageNamed: "enemy_img_2.png")

        enemyBird = SKSpriteNode(texture: enemyBirdTexture)
        enemyBird.position = CGPoint(x: CGRectGetMidX(self.frame)*2.5, y: finalSpawn)
        enemyBird.size.height = enemyBird.size.height/12
        enemyBird.size.width = enemyBird.size.width/12
        enemyBird.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(enemyBird.size.width, enemyBird.size.height))
        enemyBird.physicsBody?.dynamic = false
        enemyBird.physicsBody?.categoryBitMask = objectGroup


        // Move enemy birds
        var moveEnemyBird = SKAction.moveByX(-self.frame.size.width * 2, y: 0, duration: NSTimeInterval(self.frame.size.width / 100))     //4.14 seconds on screen
        var removeEnemyBird = SKAction.removeFromParent()
        var moveAndRemoveEnemyBird = SKAction.sequence([moveEnemyBird, removeEnemyBird])


        // Add enemy to scene and move enemy
        enemyBird.runAction(moveEnemyBird)
        movingObjects.addChild(enemyBird)
    }
    /* ------------------------------------ Other Parts ------------------------------------------ */
    func backgroundImage() {

        /* Put Background Image In */

        // Create Background Texture
        var bgTexture = SKTexture(imageNamed: "bg.png")
        // Link bg variable to texture
        bg = SKSpriteNode(texture: bgTexture)
        // Position thr bg image
        bg.position = CGPoint(x: CGRectGetMidX(self.frame), y: self.frame.height/2)
        bg.size.height = self.frame.height

        // Move background image left
        var moveBg = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: 9)
        var replaceBg = SKAction.moveByX(bgTexture.size().width, y: 0, duration: 0)
        var moveBgForever = SKAction.repeatActionForever(SKAction.sequence([moveBg, replaceBg]))

        // Keep world never ending
        for var i:CGFloat = 0; i < 3; i++ {

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

            // Stretch background full height of screen
            bg.size.height = self.frame.height

            // Run the action to move BG
            bg.runAction(moveBgForever)

            self.addChild(bg)
        }
    }
    func startTimers() {

        /* Create Score Timer */
        //scoreTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:Selector("scoreCount"), userInfo: nil, repeats: true)

        enemySpawnTimer = NSTimer.scheduledTimerWithTimeInterval(0.75, target: self, selector: Selector("enemySpawn"), userInfo: nil, repeats: true)


    }

    func birdPhysics() {
        /* Give bird physics */
        // Give bird physics
        bird.physicsBody = SKPhysicsBody(circleOfRadius: bird.size.height/3)
        bird.physicsBody?.mass = 0.2
        bird.physicsBody?.dynamic = true
        bird.physicsBody?.allowsRotation = false
        bird.physicsBody?.categoryBitMask = birdGroup
        bird.physicsBody?.collisionBitMask = objectGroup
        bird.physicsBody?.contactTestBitMask = objectGroup

    }
    func didBeginContact(contact: SKPhysicsContact) {
        if contact.bodyA.categoryBitMask == objectGroup || contact.bodyB.categoryBitMask == objectGroup {
            scoreTimer.invalidate()
            enemySpawnTimer.invalidate()
            bird = SKSpriteNode(texture: birdDeadTexture)

            if gameOver == 0 {
                movingObjects.speed = 0
                gameOver = 1
                movingObjects.removeAllChildren()// Remove all enemies
                gameOverLabel.fontName = "Helvetica"
                gameOverLabel.fontSize = 25
                gameOverLabel.text = "Tap to retry!"
                gameOverLabel.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)*1.5)
                labelHolder.addChild(gameOverLabel)
                gameOverLabel.zPosition = 9



            }
        }
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */



        if (Menu == 0) {
            movingObjects.speed = 1
            birdPhysics()
            startTimers()
        }

        if (gameOver == 0) {                                                                            // Runs if game is not over
            bird.physicsBody?.velocity = CGVectorMake(0, 0)
            bird.physicsBody?.applyImpulse(CGVectorMake(0, 80))
            Menu = 1    // Number on right is jump height

        } else {                                                                                        // Runs if game is over
            score = 0                                                                                   // Score int is 0
            scoreLabel.text = "0"                                                                       // Score Label is 0
            bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))         // Position Bird in center
            bird.physicsBody?.velocity = CGVectorMake(0,0)                                              // Cannot make bird jump
            labelHolder.removeAllChildren()                                                             // Removes all labels
            gameOver = 0                                                                                // Sets game over to 0 so game will run
            movingObjects.speed = 1
            startTimers()

        }
    }

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

}

你可以改变 SKSpriteNode 的纹理,比如,

sprite.texture = newTexture

在游戏开始前加载纹理。

var birdAliveTexture = SKTexture(imageNamed: "bird_img_1.png")
var birdDeadTexture = SKTexture(imageNamed: "bird_img_dead.png")
var bird : SKSpriteNode!

加载精灵时,为小鸟精灵命名。

bird = SKSpriteNode(texture: birdAliveTexture)
bird.name = "bird" 

didBeginContact函数中

 func didBeginContact(contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask == objectGroup || contact.bodyB.categoryBitMask == objectGroup {
        scoreTimer.invalidate()
        enemySpawnTimer.invalidate()

        bird.removeAllActions() //changed
        bird.texture = birdDeadTexture // changed

        if gameOver == 0 {
            movingObjects.speed = 0
            gameOver = 1
            movingObjects.removeAllChildren()// Remove all enemies
            gameOverLabel.fontName = "Helvetica"
            gameOverLabel.fontSize = 25
            gameOverLabel.text = "Tap to retry!"
            gameOverLabel.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)*1.5)
            labelHolder.addChild(gameOverLabel)
            gameOverLabel.zPosition = 9
         }
    }
}