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部分组成 左: 中: 右: 其中中间部分是可以无缝衔接的,下面就是两个中间部分衔接在一起 要任何长度的平台 ...
随机推荐
- 不要让mysql犹豫不决
DROP TABLE IF EXISTS `w1`; CREATE TABLE `w1` ( `waid` ) NOT NULL AUTO_INCREMENT, `wa1` ) COLLATE utf ...
- kuaisupaixu
#include<stdio.h> void quiksort(int a[],int low,int high) { int i = low; int j = high; ...
- iOS开发-VFL(Visual format language)和Autolayout
AutoLayout不管是在StoryBorad还是在xib中都相对来说比较简单,VFL(Visual fromat language)可视化语言基本上用到的比较少,在xCode4时候自动布局的概 ...
- 在Vista或更高版本Windows系统中, 获取超大图标的办法
这几天写个小东西, 需要获取系统正在运行的程序图标, 一般来说32*32就足够了, 不过既然Win7能够支持超大图标(256*256), 咱们也需要与时俱进, 说不定什么时候遇到个变态客户就有这要求了 ...
- Cloudera Hadoop什么是CDH及CDH版本介绍
本文引用自:Cloudera Hadoop什么是CDH及CDH版本介绍http://www.aboutyun.com/thread-6788-1-1.html(出处: about云开发) 云技术新兴的 ...
- ADO,OLEDB,ODBC,DAO的区别【转】
转载:http://blog.csdn.net/sunboy_2050/article/details/6624684 ODBC(Open Database Connectivity,开放数据库互连) ...
- Unix网络编程(迭代服务器)
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...
- recordcount
rs.recordcount 有时不能取到数,这时 要更改游标为客户端游标 .
- Flash的坑之ExternalInterface.call只返回null值的解决办法
flash坑太多了,要确保能有效的使用ExternalInterface.call调用js的话,需要两个条件: 1.allowScriptAccess="always" 2.id= ...
- C# 3.0 LINQ的准备工作
局部变量 隐式类型允许你用var修饰类型.用var修饰只是编译器方便我们进行编码,类型本身仍然是强类型的,所以当编译器无法推断出类型时(例如你初始化一个变量却没有为其赋值,或赋予null,此时就无法推 ...