原理

实现

勘误

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

背景移动时有个错误,看红色部分,近景归位时,第二张图片的下标是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. 不遗留问题-menu数据拼装-2

    $res = array(); foreach($idlist_1 as $id1) { $tmp = array(); $tmp1 = array(); $tmp1[] = $id1; foreac ...

  2. BLE 4.0 与 4.1的区别

    蓝牙技术让我们在连接各种设备的时候不再被繁多的数据线所束缚,比如音响.电脑,甚至是汽车.目前最新的蓝牙版本是4.0,相比3.0它进一步降低了功耗,并且也提高了传输效率.近日,蓝牙技术联盟(Blueto ...

  3. Redis学习笔记(9)-管道/分布式

    package cn.com; import java.util.Arrays; import java.util.List; import redis.clients.jedis.Jedis; im ...

  4. membership db注册工具

    C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe

  5. VS2015 多项目源码共享链接

    Eclipse有这个功能,在一个项目中加入另一个项目文件夹的引用,源码包含过来,这样不必copy一份代码,只需要维护一份源代码.一直想在VS中找到这个功能,目前项目需要,终于google到了. htt ...

  6. 去除undefined和末尾逗号及把字符串数字转成数字数组的方法

    function removeundefined(str){   var v=new Array(),b="";   var tmp=fil(str); for(var i=0;i ...

  7. JavaScript学习之DIV层与图像

    DIV层与图像 一.设计一个可定位的层 1.设置位置(position)和大小 (1)绝对定位(absolute):以页面边框为参照,只要设置好绝对位置,那么元素的位置会始终固定在距离边框某个位置的距 ...

  8. documentElement和ownerDocument和ownerElement

    1.document.documentElement是指文档根节点----HTML元素 2.element.ownerDocument是指当前元素所在的文档对象----document 3.attrO ...

  9. curl get post 数据

    1.get方式传值 function testGet(){ $ch = curl_init (); //初始化一个cURL会话 $url = "127.0.0.1/testPage?test ...

  10. http://blog.csdn.net/rongyongfeikai2/article/details/41659353

    http://blog.csdn.net/rongyongfeikai2/article/details/41659353