博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift游戏实战-跑酷熊猫 14 熊猫打滚
阅读量:4533 次
发布时间:2019-06-08

本文共 5547 字,大约阅读时间需要 18 分钟。

原文:

 

这节内容我们来实现熊猫打滚。思路是这样的,当熊猫起跳时记录他的Y坐标,落到平台上的时候再记录它的Y坐标。两个坐标之间的差要是大于一定数值就判断它从高处落下要进行打滚缓冲。至此跑酷熊猫已经像一个游戏的样子了

要点:

起跳y坐标:

var jumpStart = 0.0

落地y坐标:

var jumpEnd = 0.0

在didBeginContact方法中进行判断

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

 

整体代码:本节关键部分已加红加粗

GameScene

import SpriteKitclass 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 SpriteKitenum 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()})    }    }

项目文件地址

 

Swift游戏实战-跑酷熊猫系列

posted on
2015-02-05 15:06 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/4274883.html

你可能感兴趣的文章
Spring配置文件总结
查看>>
4.三角形面积
查看>>
基础-事务
查看>>
MAC下安装与配置MySQL [转]
查看>>
ERROR: ld.so: object '/usr/lib64/libtcmalloc.so.4' from LD_PRELOAD cannot be preloaded: ignored
查看>>
爬虫入门【10】Pyspider框架简介及安装说明
查看>>
android面试(4)---文件存储
查看>>
(转载) 标准C中的字符串操作函数
查看>>
如何提高android串口kernel log等级
查看>>
Docker快速配置指南
查看>>
Python基础---OS模块 (二)
查看>>
【JS点滴】substring和substr以及slice和splice的用法和区别。
查看>>
awk多模式匹配
查看>>
线段树
查看>>
a span等行内元素加margin属性后无效果解决方案
查看>>
傻瓜式硬盘重装win7系统图文加视频教程
查看>>
BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
查看>>
如果一个人请优雅的活着。
查看>>
验证码
查看>>
Django缓存配置
查看>>