Swift - 多层无缝循环滚动背景(SpriteKit游戏开发)

本文介绍了一种在游戏开发中实现视差滚动背景的方法。通过不同速度滚动多层背景图,营造立体视觉效果。示例使用Swift编程语言,展示了如何创建无缝循环滚动的背景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在游戏开发中,比如跑酷游戏。我们需要实现背景的无限循环滚动,来营造运动的效果。除了单层的背景滚动,还有视差滚动。

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

样例说明:
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

转载于:https://www.cnblogs.com/Free-Thinker/p/4841105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值