在游戏开发中,比如跑酷游戏。我们需要实现背景的无限循环滚动,来营造运动的效果。除了单层的背景滚动,还有视差滚动。
视差滚动是指让多层背景以不同的速度移动,形成立体的效果,从而带来非常出色的视觉体验。
样例说明:
1,本样例背景分为两层。第一层更靠近游戏窗口的色彩更鲜艳,移动速度也更快一些。第二层由于要模拟远处的场景,所以颜色也更淡一些,对比度更弱一些,移动速度也更慢一些。
2,要实现循环滚动。我们准备的背景图首尾是要可以无缝衔接的。
3,判断需要多少张无缝衔接图来组成背景?判断标准是:当第一张图移出屏幕外,剩下的图在x轴方向上还能够填满游戏屏幕就够了。(本例远景需要拼三种同样的无缝图,近景由两张同样的无缝图衔接成)
运行效果:
样例代码:
背景类 BackGround.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | import SpriteKit class BackGround : SKNode { //近处背景数组 var arrBG = [ SKSpriteNode ]() //远处背景数组 var arrFar = [ SKSpriteNode ]() override init () { super . init () //获取远处背景的纹理 var farTexture = SKTexture (imageNamed: "background_f1" ) //远处背景由3章无缝图衔接而成 var farBg0 = SKSpriteNode (texture: farTexture) farBg0.anchorPoint = CGPointMake (0, 0) farBg0.zPosition = 9 farBg0.position.y = 150 var farBg1 = SKSpriteNode (texture: farTexture) farBg1.anchorPoint = CGPointMake (0, 0) farBg1.zPosition = 9 farBg1.position.x = farBg0.frame.width farBg1.position.y = farBg0.position.y var farBg2 = SKSpriteNode (texture: farTexture) farBg2.anchorPoint = CGPointMake (0, 0) farBg2.zPosition = 9 farBg2.position.x = farBg0.frame.width * 2 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 (0, 0) var bg1 = SKSpriteNode (texture: texture) bg1.anchorPoint = CGPointMake (0, 0) bg1.position.x = bg0.frame.width bg0.zPosition = 10 bg1.zPosition = 10 bg0.position.y = 70 bg1.position.y = bg0.position.y self .addChild(bg0) self .addChild(bg1) arrBG.append(bg0) arrBG.append(bg1) } required init (coder aDecoder: NSCoder ) { fatalError( "init(coder:) has not been implemented" ) } //移动方法 func move(speed: CGFloat ){ //通过遍历获取背景,然后做x方向的改变 for bg in arrBG { bg.position.x -= speed } //循环滚动算法 if arrBG[0].position.x + arrBG[0].frame.width < speed { arrBG[0].position.x = 0 arrBG[1].position.x = arrBG[0].frame.width } //远景同上 for far in arrFar { far.position.x -= speed/4 } if arrFar[0].position.x + arrFar[0].frame.width < speed/4 { arrFar[0].position.x = 0 arrFar[1].position.x = arrFar[0].frame.width arrFar[2].position.x = arrFar[0].frame.width * 2 } } } |
主场景类 GameScene.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import SpriteKit class GameScene : SKScene { lazy var bg = BackGround () //背景移动速度 var bgMoveSpeed: CGFloat = 3 override func didMoveToView(view: SKView ) { //场景的背景颜色 let skyColor = SKColor (red:113/255,green:197/255,blue:207/255,alpha:1) self .backgroundColor = skyColor //设置背景 self .addChild(bg) } override func touchesBegan(touches: NSSet , withEvent event: UIEvent ) { } override func update(currentTime: CFTimeInterval ) { bg.move(bgMoveSpeed/5) } } |
源码下载: