Swift游戏实战-跑酷熊猫 10 视差滚动背景

时间:2023-02-01 17:15:02

原理

实现

勘误

“实现”的视频中有个错误,如下

背景移动时有个错误,看红色部分,近景归位时,第二张图片的下标是1

if arrBG[0].position.x + arrBG[0].frame.width < speed{
           
arrBG[0].position.x = 0
            arrBG[1].position.x
= arrBG[0].frame.width

  }

要点:

什么是视差滚动:

视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。

如何实现:

首先是背景,由两种背景组成,近点的是青色山坡,远点的是树木。我们在move方法中给予近景1/5 的平台移动速度。给远景1/20 的平台移动速度。就形成了视差滚动。

具体代码

import SpriteKit
//继承自sknode
class BackGround :SKNode {
//近处的背景数组
var arrBG = [SKSpriteNode]()
//远处树木的背景数组
var arrFar = [SKSpriteNode]()
//构造器
init() {
//执行父类的构造器
super.init()
//远处背景的纹理
var farTexture = SKTexture(imageNamed: "background_f1")
//远处背景由3张无缝衔接的图组成
var farBg0 = SKSpriteNode(texture: farTexture)
farBg0.anchorPoint = CGPointMake(, )
farBg0.position.y = var farBg1 = SKSpriteNode(texture: farTexture)
farBg1.anchorPoint = CGPointMake(, )
farBg1.position.x = farBg0.frame.width
farBg1.position.y = farBg0.position.y var farBg2 = SKSpriteNode(texture: farTexture)
farBg2.anchorPoint = CGPointMake(, )
farBg2.position.x = farBg0.frame.width *
farBg2.position.y = farBg0.position.y self.addChild(farBg0)
self.addChild(farBg1)
self.addChild(farBg2)
arrFar.append(farBg0)
arrFar.append(farBg1)
arrFar.append(farBg2) //近处背景纹理
var texture = SKTexture(imageNamed: "background_f0")
//近处背景由2张无缝衔接的图组成
var bg0 = SKSpriteNode(texture: texture)
bg0.anchorPoint = CGPointMake(, )
var bg1 = SKSpriteNode(texture: texture)
bg1.anchorPoint = CGPointMake(, )
bg1.position.x = bg0.frame.width
bg0.position.y =
bg1.position.y = bg0.position.y
self.addChild(bg0)
self.addChild(bg1)
arrBG.append(bg0)
arrBG.append(bg1)
}
//移动函数
func move(speed:CGFloat){
//循环遍历近处背景,做x坐标位移
for bg in arrBG {
bg.position.x -= speed
}
//判断第一张背景图是否完全移除到场景外,如果移出去了,则整个近处背景图都归位
if arrBG[].position.x + arrBG[].frame.width < speed {
arrBG[].position.x =
arrBG[].position.x = arrBG[].frame.width
}
//循环遍历做远处背景,做x坐标位移
for far in arrFar {
far.position.x -= speed/
}
//判断第一张背景图是否完全移除到场景外,如果移出去了,则整个远处背景图都归位
if arrFar[].position.x + arrFar[].frame.width < speed/ {
arrFar[].position.x =
arrFar[].position.x = arrFar[].frame.width
arrFar[].position.x = arrFar[].frame.width *
}
}
}

项目文件地址

http://yun.baidu.com/share/link?shareid=3824235955&uk=541995622

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

00
游戏预览

01
创建工程导入素材

02
创建熊猫类

03
熊猫跑动动画

04
熊猫的跳和滚的动作

05
踩踏平台是怎么炼成的

06
创建平台类以及平台工厂类

07
平台的移动

08
产生源源不断的移动平台

09
移除场景之外的平台

Swift游戏实战-跑酷熊猫 10 视差滚动背景的更多相关文章

  1. Swift游戏实战-跑酷熊猫 14 熊猫打滚

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

  2. Swift游戏实战-跑酷熊猫 13 二段跳的实现

    这节内容我们来实现熊猫的二段跳. 要点: 二段跳的逻辑: 逻辑一,第一次点击屏幕,status就会变成jump. 逻辑二,第二次点击屏幕,status就会变成jump2. 逻辑三,当status变成j ...

  3. Swift游戏实战-跑酷熊猫 12 与平台的碰撞

    这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑 要点 对平台进行物理属性设置 //设置物理体以及中心点 self.physicsBody = SKPhysicsBody(rectangleOfSi ...

  4. Swift游戏实战-跑酷熊猫 11 欢迎进入物理世界

    物理模拟是一个奇妙的事情,以此著名的游戏有愤怒的小鸟.我们在这节将会一起来了解如何设置重力,设置物理包围体,碰撞的检测. 要点: 设置物理检测的代理: 让主场景遵循SKPhysicsContactDe ...

  5. Swift游戏实战-跑酷熊猫 04 熊猫的跳和滚的动作

    这节内容,我们利用上一节学过的内容,给熊猫添加跳和滚动的动作.同时通过重载touchBegan方法来响应动作.切换跑,跳,滚. 要点: 通过序列帧纹理产生动画: SKAction.animatWith ...

  6. Swift游戏实战-跑酷熊猫 09 移除场景之外的平台

    上一节,我们写出了一个疯狂产生平台的东西.所谓上帝欲使其灭亡,必先使其疯狂.所以太疯狂都不是什么好事,所以我们要采取一些措施,例如移除场景之外的平台.btw如果哪天你觉得自己的老板行为乖张,难以理喻. ...

  7. Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台

    原理 代码实现 这节内容我们一起学习下平台的生产算法. 要点: 何时生成新的平台: 当上一个平台的右边完全进入场景的时候,就可以生成新的平台类. 如何知道上一个平台完全进入场景: 主场景中有个变量la ...

  8. Swift游戏实战-跑酷熊猫 07 平台的移动

    这节内容我们来实现平台是怎么产生移动动画的. 要点 1 利用数组存放平台 var platforms=[Platform]() 2 有新的平台产生存放进数组 platforms.append(plat ...

  9. Swift游戏实战-跑酷熊猫 06 创建平台类以及平台工厂类

    这节内容我们一起学习下随机长度的踩踏平台的原理是怎么样的. 要点: 平台类 我们的平台类继承于SKNode,这样就能被添加进其它节点进而显示在场景中. 它有一个方法来创建平台,这个方法接收一个包含SK ...

随机推荐

  1. Mount挂载命令使用方法

    语法: mount -t 类型 -o 挂接方式 源路径 目标路径     -t 详细选项: 光盘或光盘镜像:iso9660 DOS fat16文件系统:msdos Windows 9x fat32文件 ...

  2. 《zw版&&num;183&semi;Halcon-delphi系列原创教程》 Halcon分类函数002&&num;183&semi;AI人工智能

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数002·AI人工智能 AI人工智能:包括knn.gmm.svm等 为方便阅读,在不影响说明的前提下,笔者对函数进行了 ...

  3. smarty插件开发代替注册插件方法registerPlugin

  4. map与mapPartitions

    区别在于sc.map是将RDD下的所有行数据统计处理.而sc.mapPartitions是按RDD分区进行数据统计处理. 测试一下: val data = sc.parallelize(1 to 6, ...

  5. 简短总结一下C&num;里跨线程更新UI

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  6. Using GUID to generate the unique file name in C&num;

    GUID, the abbreviation of "Global Unique Identifier", is a unique reference number used as ...

  7. UIView &sol; &&num;160&semi;UIView的布局

    //! 一个视图可以有n个子视图,但是一个视图只能有一个父视图 struct CGRect {   CGPoint origin;   CGSize size; }; CGRectMake(CGFlo ...

  8. webpack 相关资料

    github webpack Youtube: Advanced Webpack code splitting list of plugins webpack examples What's new ...

  9. alpha冲刺第七天

    一.合照 二.项目燃尽图 三.项目进展 问答界面问答内容呈现 设置里的帐号设置呈现 能爬取教务处网站的内容保存到本地数据库 四.明日规划 继续完善各个内容的界面呈现 查找关于如何自动更新爬取内容 搜索 ...

  10. MapReduce的工作原理

    MapReduce简介 MapReduce是一种并行可扩展计算模型,并且有较好的容错性,主要解决海量离线数据的批处理.实现下面目标 ★ 易于编程 ★ 良好的扩展性 ★ 高容错性   MapReduce ...