Swift游戲實戰-跑酷熊貓 14 熊貓打滾


 

這節內容我們來實現熊貓打滾。思路是這樣的,當熊貓起跳時記錄他的Y坐標,落到平台上的時候再記錄它的Y坐標。兩個坐標之間的差要是大於一定數值就判斷它從高處落下要進行打滾緩沖。至此跑酷熊貓已經像一個游戲的樣子了

要點:

起跳y坐標:

var jumpStart = 0.0

落地y坐標:

var jumpEnd = 0.0

在didBeginContact方法中進行判斷

panda.jumpEnd = panda.position.y
if panda.jumpEnd-panda.jumpStart <= -70 {
        panda.roll()
}

 

整體代碼:本節關鍵部分已加紅加粗

GameScene

import SpriteKit

class GameScene: SKScene,ProtocolMainScene ,SKPhysicsContactDelegate{
    
    @lazy var panda = Panda()
    @lazy var platformFactory = PlatformFactory()
    @lazy var bg = BackGround()
    
    var moveSpeed:CGFloat = 15
    var lastDis = 0.0
    
    func didBeginContact(contact: SKPhysicsContact!) {
        
        if (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask) == ( BitMaskType.platform | BitMaskType.panda ){
            panda.run()
            
            panda.jumpEnd = panda.position.y if panda.jumpEnd-panda.jumpStart <= -70 { panda.roll() }
        }
        
        if (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask) == ( BitMaskType.scene | BitMaskType.panda ){
            println("游戲結束!")
        }
    }
    func didEndContact(contact: SKPhysicsContact!){
        panda.jumpStart = panda.position.y
        
    }
    override func didMoveToView(view: SKView) {
        let skyColor = SKColor(red:113/255,green:197/255,blue:207/255,alpha:1)
        self.backgroundColor = skyColor
        
        //背景
        self.addChild(bg)
        bg.zPosition = 20
        
        self.physicsWorld.contactDelegate = self
        self.physicsWorld.gravity = CGVectorMake(0, -5)
        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.physicsBody.categoryBitMask = BitMaskType.scene
        self.physicsBody.dynamic = false
        
        panda.position = CGPointMake(200, 400)
        panda.zPosition = 40
        self.addChild(panda)
        
        self.addChild(platformFactory)
        platformFactory.sceneWidth = self.frame.size.width
        platformFactory.delegate = self
        platformFactory.zPosition = 30
        platformFactory.createPlatform(3, x: 0, y: 200)

    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        panda.jump()
    }
   
    override func update(currentTime: CFTimeInterval) {
        bg.move(moveSpeed/5)
        lastDis -= moveSpeed
        if lastDis <= 0 {
            println("生成新的平台")
            //platformFactory.createPlatform(1, x: 1500, y: 200)
            platformFactory.createPlatformRandom()
        }
        platformFactory.move(moveSpeed)
    }
    func onGetData(dist:CGFloat){
        self.lastDis = dist;
    }
}
protocol ProtocolMainScene {
    func onGetData(dist:CGFloat)
}

Panda

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
    //起跳 y坐標
    var jumpStart = 0.0
    //落地 y坐標
    var jumpEnd = 0.0


    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))
            self.physicsBody.velocity = CGVectorMake(0, 450)
            if status == Status.jump{
                status = Status.jump2
                self.jumpStart = self.position.y;
            }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 與平台的碰撞

13 二段跳的實現


免責聲明!

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



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