Swift
在游戏开发中,比如跑酷游戏。我们需要实现背景的无限循环滚动,来营造运动的效果。除了单层的背景滚动,还有视差滚动。
视差滚动是指让多层背景以不同的速度移动,形成立体的效果,从而带来非常出色的视觉体验。
样例说明:
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)
}
} |
源码下载:DynamicBg.zip