Swift游戲實戰-跑酷熊貓 13 二段跳的實現


 

這節內容我們來實現熊貓的二段跳。

 

要點:

二段跳的邏輯:

邏輯一,第一次點擊屏幕,status就會變成jump。

邏輯二,第二次點擊屏幕,status就會變成jump2。

邏輯三,當status變成jump2的時候不響應屏幕點擊

邏輯四,當熊貓落地時將status變為run。

 

所以只要當status的不等於jump2的時候,點擊屏幕都會給熊貓施加一個向上的速度。這時候判斷。如果是一段跳就將status設為jump。如果是二段跳就將status設為jump2。落地改變狀態之前已經寫好了。

二段跳的實現:

       

 func jump (){
        self.removeAllActions()
        if status != Status.jump2 {
            self.runAction(SKAction.animateWithTextures(jumpFrames, timePerFrame: 0.05),withKey:"jump")
            self.physicsBody.velocity = CGVectorMake(0, 450)
            if status == Status.jump {
                status = Status.jump2
            }else{
                status = Status.jump
            }
        }
    }

 

 

整體代碼:

import SpriteKit
 
enum Status:Int{
    case run=1,jump,jump2,roll;
}
 
class Panda : SKSpriteNode {
    let runAtlas = SKTextureAtlas(named: "run.atlas")
    let runFrames = [SKTexture]()
   
    let jumpAtlas = SKTextureAtlas(named: "jump.atlas")
    let jumpFrames = [SKTexture]();
   
    let rollAtlas = SKTextureAtlas(named: "roll.atlas")
    let rollFrames = [SKTexture]();
   
    var status = Status.run
 
    init(){
        let texture = runAtlas.textureNamed("panda_run_01")
        let size = texture.size()
        super.init(texture:texture,color:SKColor.whiteColor(),size:size)
       
        var i:Int
        for i=1 ; i<=runAtlas.textureNames.count ; i++ {
            let tempName = String(format: "panda_run_%.2d", i)
            let runTexture = runAtlas.textureNamed(tempName)
            if runTexture {
                runFrames.append(runTexture)
            }
        }
        for i=1 ; i<=jumpAtlas.textureNames.count ; i++ {
            let tempName = String(format: "panda_jump_%.2d", i)
            let jumpTexture = jumpAtlas.textureNamed(tempName)
            if jumpTexture {
                jumpFrames.append(jumpTexture)
            }
        }
        for i=1 ; i<=rollAtlas.textureNames.count ; i++ {
            let tempName = String(format: "panda_roll_%.2d", i)
            let rollTexture = rollAtlas.textureNamed(tempName)
            if rollTexture {
                rollFrames.append(rollTexture)
            }
        }
       
        self.physicsBody = SKPhysicsBody(rectangleOfSize: texture.size())
        self.physicsBody.dynamic = true
        self.physicsBody.allowsRotation = false
        //摩擦力
        self.physicsBody.restitution = 0
        self.physicsBody.categoryBitMask = BitMaskType.panda
        self.physicsBody.contactTestBitMask = BitMaskType.scene | BitMaskType.platform
        self.physicsBody.collisionBitMask = BitMaskType.platform
        run()
    }
    func run(){
        self.removeAllActions()
        self.status = .run
        self.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(runFrames, timePerFrame: 0.05)))
    }
   
    func jump (){
        self.removeAllActions()
        if status != Status.jump2 {
            self.runAction(SKAction.animateWithTextures(jumpFrames, timePerFrame: 0.05),withKey:"jump")
            self.physicsBody.velocity = CGVectorMake(0, 450)
            if status == Status.jump {
                status = Status.jump2
            }else{
                status = Status.jump
            }
        }
    }
   
    func roll(){
        self.removeAllActions()
        status = .roll
        self.runAction(SKAction.animateWithTextures(rollFrames, timePerFrame: 0.05),completion:{() in self.run()})
    }
  
}

 

項目文件地址

http://yun.baidu.com/share/link?shareid=3824235955&uk=541995622

 

Swift游戲實戰-跑酷熊貓系列

00 游戲預覽

01 創建工程導入素材

02 創建熊貓類

03 熊貓跑動動畫

04 熊貓的跳和滾的動作

05 踩踏平台是怎么煉成的

06 創建平台類以及平台工廠類

07 平台的移動

08 產生源源不斷的移動平台

09 移除場景之外的平台

10 視差滾動背景

11 歡迎進入物理世界

12 與平台的碰撞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM