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部分组成 左: 中: 右: 其中中间部分是可以无缝衔接的,下面就是两个中间部分衔接在一起 要任何长度的平台 ...
随机推荐
- dynamic-link library shared library of functions and resources
https://msdn.microsoft.com/en-us/library/1ez7dh12.aspx A dynamic-link library (DLL) is an executable ...
- 8添加一些样式:开始学习CSS
CSS中简单的表达式,成为规则.一个典型的规则包括一个选择符.若干属性和属性值. 1.在XHTML中直接添加CSS样式,必须在<head>元素里添加样式开始和结束标记.(但这未必是最好的方 ...
- Matplotlib for Python Developers
这个教程也很不错,http://reverland.org/python/2012/09/07/matplotlib-tutorial/ 也可以参考官网的Gallery,http://matplotl ...
- php session 跨页失效问题
原因是session.savepath 目录不存在或者没有读写权限
- 删除下标为n的数组值
Array.prototype.del=function(n) { //n表示第几项,从0开始算起.//prototype为对象原型,注意这里为对象增加自定义方法的方法. if(n<0) //如 ...
- 图算法(一)——基本图算法(BFS,DFS及其应用)(2)
2)DFS 深度优先搜索总是对最近发现的节点v的出发边进行搜索,直到该节点的所有出发边都被发现 一旦节点v的所有出发边都被发现,搜索回溯到v的前驱结点进行 实现细节:时间戳 每一个结点有一个发现时间和 ...
- ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案
原文:ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案 根据实际JPG图片进行配准后,发布的地图,利用ArcGIS API for Silverlight在网页 ...
- iOS7上TableViewCell的button和UIImageView个别未显示的bug
要做这个cell,用xib将cell做成之后,在iPhone6.6Plus.5s上运行良好,但是在iOS7的5s和iPad上,黄色的小星星和下载按钮均没有显示. 甚为惊奇. 在网上百度之,发现了解决办 ...
- zero3- JPA http://www.cnblogs.com/holbrook/archive/2012/12/30/2839842.html
1.很好的博客:http://www.cnblogs.com/holbrook/archive/2012/12/30/2839842.html 2. 最新的搬到github : http://holb ...
- Ioc-Autofac实现自动的注入
在开发过程中,最郁闷的莫过于当你新增一个Service时,你需要对该Service进行注册,有的是使用代码注入,有的是XML配置注入,不管是哪种类型的注入,经常会出现开发人员忘记注入的情况. 于是我试 ...