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 <= - {
- 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 =
- 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:/,green:/,blue:/,alpha:)
- self.backgroundColor = skyColor
- //背景
- self.addChild(bg)
- bg.zPosition =
- self.physicsWorld.contactDelegate = self
- self.physicsWorld.gravity = CGVectorMake(, -)
- self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
- self.physicsBody.categoryBitMask = BitMaskType.scene
- self.physicsBody.dynamic = false
- panda.position = CGPointMake(, )
- panda.zPosition =
- self.addChild(panda)
- self.addChild(platformFactory)
- platformFactory.sceneWidth = self.frame.size.width
- platformFactory.delegate = self
- platformFactory.zPosition =
- platformFactory.createPlatform(, x: , y: )
- }
- override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
- panda.jump()
- }
- override func update(currentTime: CFTimeInterval) {
- bg.move(moveSpeed/)
- lastDis -= moveSpeed
- if lastDis <= {
- 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=,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= ; 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= ; 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= ; 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 =
- 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(, )
- 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 二段跳的实现
Swift游戏实战-跑酷熊猫 14 熊猫打滚的更多相关文章
- Swift游戏实战-跑酷熊猫 13 二段跳的实现
这节内容我们来实现熊猫的二段跳. 要点: 二段跳的逻辑: 逻辑一,第一次点击屏幕,status就会变成jump. 逻辑二,第二次点击屏幕,status就会变成jump2. 逻辑三,当status变成j ...
- Swift游戏实战-跑酷熊猫 12 与平台的碰撞
这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑 要点 对平台进行物理属性设置 //设置物理体以及中心点 self.physicsBody = SKPhysicsBody(rectangleOfSi ...
- Swift游戏实战-跑酷熊猫 11 欢迎进入物理世界
物理模拟是一个奇妙的事情,以此著名的游戏有愤怒的小鸟.我们在这节将会一起来了解如何设置重力,设置物理包围体,碰撞的检测. 要点: 设置物理检测的代理: 让主场景遵循SKPhysicsContactDe ...
- Swift游戏实战-跑酷熊猫 10 视差滚动背景
原理 实现 勘误 “实现”的视频中有个错误,如下 背景移动时有个错误,看红色部分,近景归位时,第二张图片的下标是1 if arrBG[0].position.x + arrBG[0].frame.wi ...
- Swift游戏实战-跑酷熊猫 09 移除场景之外的平台
上一节,我们写出了一个疯狂产生平台的东西.所谓上帝欲使其灭亡,必先使其疯狂.所以太疯狂都不是什么好事,所以我们要采取一些措施,例如移除场景之外的平台.btw如果哪天你觉得自己的老板行为乖张,难以理喻. ...
- Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台
原理 代码实现 这节内容我们一起学习下平台的生产算法. 要点: 何时生成新的平台: 当上一个平台的右边完全进入场景的时候,就可以生成新的平台类. 如何知道上一个平台完全进入场景: 主场景中有个变量la ...
- Swift游戏实战-跑酷熊猫 07 平台的移动
这节内容我们来实现平台是怎么产生移动动画的. 要点 1 利用数组存放平台 var platforms=[Platform]() 2 有新的平台产生存放进数组 platforms.append(plat ...
- Swift游戏实战-跑酷熊猫 06 创建平台类以及平台工厂类
这节内容我们一起学习下随机长度的踩踏平台的原理是怎么样的. 要点: 平台类 我们的平台类继承于SKNode,这样就能被添加进其它节点进而显示在场景中. 它有一个方法来创建平台,这个方法接收一个包含SK ...
- Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
这节内容我们一起学习下随机长度的踩踏平台的原理是怎么样的. 要点: 平台的组成 我们的平台由3部分组成 左: 中: 右: 其中中间部分是可以无缝衔接的,下面就是两个中间部分衔接在一起 要任何长度的平台 ...
随机推荐
- Nginx部署ThinkPHP项目的办法
thinkphp config配置: ', //URL模式 nginx rewrite配置: location / { if (!-e $request_filename) { rewrite ^(. ...
- InnoDB , MyISAM :MySQL 5.7 Supported Storage Engines
http://dev.mysql.com/doc/refman/5.7/en/storage-engines.html https://en.wikipedia.org/wiki/ACID https ...
- [qemu] 挂载qcow2文件,qcow2里边还有个lvm
环境:archlinux 背景:在虚拟机里玩dpdk,把挂载HugePage(hugetlbfs)的命令写入fstab的时候,写错了,无法启动,需要把qcow2挂起来改一下. 方法:使用qemu-nb ...
- ServletContextDemo
1.servlet 之间共享数据 package xw.servlet; import javax.servlet.ServletContext; import javax.servlet.http. ...
- C# 操作Cookie类
1.Cookie操作类 using System; using System.Data; using System.Configuration;using System.Web;using Syste ...
- nRF51822之WDT浅析
看门狗定时器 NRF51822 的看门狗定时器是倒计数器, 当计数值减少到 0 时产生 TIMEOUT 事件. 通过 START task 来启动看门狗定时器. 看门狗定时器启动时,如没有其他 32. ...
- Redis-统计活跃用户
Bitmap(即Bitset)Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作. package test ...
- NSURL基本操作示例说明
http://blog.csdn.net/zhibudefeng/article/details/7920686
- ligerui多选动态下拉框
今天下午要求做一个支持多选的,并且插件用ligerui的,当时有点小懵了,因为没用过ligerui啊!而且按照API的介绍,我做得也很好啊,可是为什么就是显示不出来?据说有位小神比较厉害,请教来之,两 ...
- Java多线程 - 线程状态
转自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的 ...