Swift - 多层无缝循环滚动背景(SpriteKit游戏开发)
在游戏开发中,比如跑酷游戏。我们需要实现背景的无限循环滚动,来营造运动的效果。除了单层的背景滚动,还有视差滚动。
|
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 SpriteKitclass 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 SpriteKitclass 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
Swift - 多层无缝循环滚动背景(SpriteKit游戏开发)的更多相关文章
- Expression Blend4经验分享:文字公告无缝循环滚动效果
这次分享一个类似新闻公告板的无缝循环滚动效果,相信很多项目都会应用到这个效果.之前我也百度了一下,网上的一些Silverlight的文字或图片滚动效果,都是一次性滚动的,如果要做到无缝循环滚动,多数要 ...
- JavaScript学习笔记——简单无缝循环滚动展示图片的实现
今天做了一个简单的无缝循环滚动的实例,这种实例在网页中其实还挺常见的,下面分享一下我的学习收获. 首先,无缝滚动的第一个重点就是——动.关于怎么让页面的元素节点动起来,这就得学明白关于JavaScri ...
- Swift - 创建并设置背景(SpriteKit游戏开发)
1,先把背景图片bg.jpg,bg@2x.jpg直接拖进Images.xcassets中 2,设置如下代码(背景图直接铺满整个屏幕) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Swift - 跑酷游戏开发(SpriteKit游戏开发)
一,下面演示了如何开发一个跑酷游戏,实现的功能如下: 1,平台工厂会不断地生成平台,并且向左移动.当平台移出游戏场景时就可将其移除. 2,生成的平台宽度随机,高度随机.同时短平台踩踏的时候会下落. 3 ...
- Swift - 给游戏添加背景音乐和音效(SpriteKit游戏开发)
游戏少不了背景音乐和音效.下面我们通过创建一个管理音效的类,来实现背景音乐的播放,同时点击屏幕可以播放相应的音效. 声音管理类 SoundManager.swift 1 2 3 4 5 6 7 8 9 ...
- Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)
下面通过一个样例演示如何实现飞行道具的生成,以及道具碰撞拾取. 样例说明: 1,屏幕从右到左不断地生成苹果飞过来(苹果高度随机) 2,点击屏幕可以让熊猫跳跃 3,熊猫碰到苹果,苹果消失 运行效果: 样 ...
- Swift - 使用atlas图集实现动画效果(SpriteKit游戏开发)
我们通常继承SKSpriteNode来实现游戏中的元素,除了可以使用图片作为纹理皮肤外.我们还可以使用动画纹理集来实现动画播放. 动画纹理集的制作也很简单,首先要有一套动画序列图,然后把它们放到一个文 ...
- Swift - 在界面上生成81个随机红,灰色圆点(SpriteKit游戏开发)
下面是生成一个“围住神经猫”游戏的初始场景: 1,界面下方会生成9*9共81个圆点,同时圆点内部添加文本标签显示索引 2,默认圆点为灰色,每行随机取两个点变为红色 3,奇数行和偶数行有一定的错位,错位 ...
- js实现无缝循环滚动
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- JS,Jquery - 三元运算符
在javascript中使用三元运算符. 要使用 " [] " ,对运算式进行包裹.
- C#_会员管理系统:开发二(会员资料管理界面的‘增删改查’)
会员资料管理界面: 新建一个窗体,窗体界面和控件如下: 窗体中的控件dgvManager更改FullRowSelect属性(点击选中效果)为:FullRowSelect 会员资料管理界面窗体的详细代码 ...
- 写一个方法完成如下功能,判断从文本框textbox1输入的一个字符,如果是数字则求该数字的阶乘,如果是小写字条,则转换为大写,大写字符不变,结果在文本框textbox2中显示
窗体设计: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...
- ubuntu卸载vmware
下面方法摘抄网上方法,经过证实好使 lsmod——显示已载入系统的模块 ps aux : 显示其他用户启动的进程(a) 查看系统中属于自己的进程(x) 启动这个进程的用户和它启动的 ...
- [Swust OJ 715]--字典序问题(组合数预处理/数位dp)
题目链接:http://acm.swust.edu.cn/problem/715/ Time limit(ms): 1000 Memory limit(kb): 65535 在数据加密和数据压缩中 ...
- No persister for 编译器每行执行两次的解决方法
是前台的 js 的 datagrid 部件加了 oncheck 事件引起
- Week7(10月21日)
Part I:提问 =========================== 1.请为下图编写视图代码,视图中表单提交后,交给当前控制器和动作处理. 2.如何实现点击列标题排序功能? 3.分页时采用了 ...
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...
- Http的操作(不传递参数)
ttpResponse httpResponse = null; HttpEntity httpEntity = null; HttpGet httpGet = new HttpGet ...
- SymmetricDS文档翻译--【Chapter 3. 具体配置(Configuration)[section C]】
3.6. Routers 眼下的实现中提供的Route实现包括: 1. Default Router:这个Router发送全部的数据到Router中定义的目标节点所属的组中的全部的节点. 2 ...