Swift - 一步步教你使用SpriteKit创建开发游戏项目


1
2
3
4
5
6
7
8
9
10
11
12
13
|
extension SKNode { class func unarchiveFromFile(file : NSString ) -> SKNode ? { ..... let scene = archiver.decodeObjectForKey( NSKeyedArchiveRootObjectKey ) as FirstScene class GameViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() if let scene = FirstScene .unarchiveFromFile( "GameScene" ) as ? FirstScene { ......... |
4,修改场景背景色,添加文本标签,点击屏幕给标签添加动画效果

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
|
import SpriteKit class FirstScene : SKScene { //当切换到这个场景视图后后 override func didMoveToView(view: SKView ) { createScene() } func createScene(){ //改变背景颜色 self .backgroundColor = SKColor .blueColor() //创建一个显示文本的节点 let myLabel = SKLabelNode (fontNamed: "Chalkduster" ) //添加name属性 myLabel.name = "label" //设置文本内容 myLabel.text = "Hello, hangge.com" ; //设置字体大小 myLabel.fontSize = 46; //设置文本节点的位置 myLabel.position = CGPoint (x: CGRectGetMidX ( self .frame), y: CGRectGetMidY ( self .frame)); //将文本节点加入场景中 self .addChild(myLabel) } //响应屏幕点击时间的方法 override func touchesBegan(touches: NSSet , withEvent event: UIEvent ) { //获取文本节点 let labelNode = self .childNodeWithName( "label" ) //向上移动的动作 let moveUp = SKAction .moveByX(0, y: 100, duration: 0.5) //放大动作 let zoom = SKAction .scaleTo(2.0, duration: 0.25) //暂停的动作 let pause = SKAction .waitForDuration(0.5) //淡出的动作 let fadeAway = SKAction .fadeOutWithDuration(0.25) //从父对象移除的动作 let remove = SKAction .removeFromParent() //动作序列 let moveSequence = SKAction .sequence([moveUp,zoom,pause,fadeAway,remove]) //文本节点执行动作序列 labelNode?.runAction(moveSequence) } } |
5,跳转到新场景
1
2
3
4
5
6
7
8
9
|
//执行完动作序列之后调用闭包函数 labelNode?.runAction(moveSequence, completion: { //声明下一个场景的实例 let secondScene = SecondScene (size: self .size) //场景过渡动画 let doors = SKTransition .doorsOpenVerticalWithDuration(0.5) //带动画的场景跳转 self .view?.presentScene(secondScene,transition:doors) }) |
6,使用SKSpriteNode创建一个飞船

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
|
import SpriteKit class SecondScene : SKScene { //当切换到这个场景视图后后 override func didMoveToView(view: SKView ) { createScene() } func createScene(){ let spaceship = newSpaceship() //设置飞船的位置 spaceship.position = CGPointMake ( CGRectGetMidX ( self .frame), CGRectGetMidY ( self .frame)-150) //加入到场景中 self .addChild(spaceship) } //创建飞创的类 func newSpaceship()-> SKShapeNode { //创建一个椭圆,充当飞船 let ship = SKShapeNode () ship.path = CGPathCreateWithRoundedRect ( CGRectMake (-15, -15, 30, 30), 15, 15, nil ) ship.strokeColor = SKColor .whiteColor() ship.fillColor = SKColor .grayColor() //创建一组动作,暂停1秒,位移,暂停1秒,位移 let hover = SKAction .sequence([ SKAction .waitForDuration(1.0), SKAction .moveByX(100, y: 50, duration: 1), SKAction .waitForDuration(1.0), SKAction .moveByX(-100, y: -50, duration: 1.0) ]) //以重复的方式执行序列动作 ship.runAction( SKAction .repeatActionForever(hover)) //创建灯光 let light1 = newLight() //设置灯光位置 light1.position = CGPointMake (-28, 6.0) //加载灯光 ship.addChild(light1) //创建灯光2,步骤同上 let light2 = newLight() light2.position = CGPointMake (28, 6.0) ship.addChild(light2) //物理系统 ship.physicsBody = SKPhysicsBody (circleOfRadius: 15) ship.physicsBody?. dynamic = false //返回飞船 return ship } //创建灯光方法 func newLight()-> SKShapeNode { //创建一个黄色椭圆充当灯光 let light = SKShapeNode () light.path = CGPathCreateWithRoundedRect ( CGRectMake (-4, -4, 8, 8), 4, 4, nil ) light.strokeColor = SKColor .whiteColor() light.fillColor = SKColor .yellowColor() //创建忽明忽暗的动作 let blink = SKAction .sequence([ SKAction .fadeOutWithDuration(0.25), SKAction .fadeInWithDuration(0.25) ]) //创建一直重复的动作 let blinkForever = SKAction .repeatActionForever(blink) //执行动作 light.runAction(blinkForever) //返回灯光 return light } } |
7,定时生成陨石(并设置物理碰撞)

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
|
import SpriteKit class SecondScene : SKScene { //当切换到这个场景视图后后 override func didMoveToView(view: SKView ) { createScene() } func createScene(){ //..... //生成陨石(每隔 0.1秒生成1个) NSTimer .scheduledTimerWithTimeInterval(0.1, target: self , selector: "addRock" , userInfo: nil , repeats: true ) } //创建陨石的方法 func addRock(){ //小椭圆充当陨石 let rock = SKShapeNode () rock.path = CGPathCreateWithRoundedRect ( CGRectMake (-4, -4, 8, 8), 4, 4, nil ) rock.strokeColor = SKColor .whiteColor() rock.fillColor = SKColor .brownColor() //获取场景宽,高 let w = self .size.width let h = self .size.height //随机出现在场景的xy位置 let x = CGFloat (arc4random())%w let y = CGFloat (arc4random())%h //设置陨石的位置 rock.position = CGPointMake (x,y) //设置陨石的name属性 rock.name = "rock" //给陨石设置物理体 rock.physicsBody = SKPhysicsBody (circleOfRadius: 4) //物理体允许检测碰撞 rock.physicsBody?.usesPreciseCollisionDetection = true //场景加入陨石 self .addChild(rock) } } |
四,最终完整的代码
--- FirstScene.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
|
import SpriteKit class FirstScene : SKScene { //当切换到这个场景视图后后 override func didMoveToView(view: SKView ) { createScene() } func createScene(){ //改变背景颜色 self .backgroundColor = SKColor .blueColor() //创建一个显示文本的节点 let myLabel = SKLabelNode (fontNamed: "Chalkduster" ) //添加name属性 myLabel.name = "label" //设置文本内容 myLabel.text = "Hello, hangge.com" ; //设置字体大小 myLabel.fontSize = 46; //设置文本节点的位置 myLabel.position = CGPoint (x: CGRectGetMidX ( self .frame), y: CGRectGetMidY ( self .frame)); //将文本节点加入场景中 self .addChild(myLabel) } //响应屏幕点击时间的方法 override func touchesBegan(touches: NSSet , withEvent event: UIEvent ) { //获取文本节点 let labelNode = self .childNodeWithName( "label" ) //向上移动的动作 let moveUp = SKAction .moveByX(0, y: 100, duration: 0.5) //放大动作 let zoom = SKAction .scaleTo(2.0, duration: 0.25) //暂停的动作 let pause = SKAction .waitForDuration(0.5) //淡出的动作 let fadeAway = SKAction .fadeOutWithDuration(0.25) //从父对象移除的动作 let remove = SKAction .removeFromParent() //动作序列 let moveSequence = SKAction .sequence([moveUp,zoom,pause,fadeAway,remove]) //执行完动作序列之后调用闭包函数 labelNode?.runAction(moveSequence, completion: { //声明下一个场景的实例 let secondScene = SecondScene (size: self .size) //场景过渡动画 let doors = SKTransition .doorsOpenVerticalWithDuration(0.5) //带动画的场景跳转 self .view?.presentScene(secondScene,transition:doors) }) } } |
--- SecondScene.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
import SpriteKit class SecondScene : SKScene { //当切换到这个场景视图后后 override func didMoveToView(view: SKView ) { createScene() } func createScene(){ let spaceship = newSpaceship() //设置飞船的位置 spaceship.position = CGPointMake ( CGRectGetMidX ( self .frame), CGRectGetMidY ( self .frame)-150) //加入到场景中 self .addChild(spaceship) //生成陨石(每隔 0.1秒生成1个) NSTimer .scheduledTimerWithTimeInterval(0.1, target: self , selector: "addRock" , userInfo: nil , repeats: true ) } //创建飞创的类 func newSpaceship()-> SKShapeNode { //创建一个椭圆,充当飞船 let ship = SKShapeNode () ship.path = CGPathCreateWithRoundedRect ( CGRectMake (-15, -15, 30, 30), 15, 15, nil ) ship.strokeColor = SKColor .whiteColor() ship.fillColor = SKColor .grayColor() //创建一组动作,暂停1秒,位移,暂停1秒,位移 let hover = SKAction .sequence([ SKAction .waitForDuration(1.0), SKAction .moveByX(100, y: 50, duration: 1), SKAction .waitForDuration(1.0), SKAction .moveByX(-100, y: -50, duration: 1.0) ]) //以重复的方式执行序列动作 ship.runAction( SKAction .repeatActionForever(hover)) //创建灯光 let light1 = newLight() //设置灯光位置 light1.position = CGPointMake (-28, 6.0) //加载灯光 ship.addChild(light1) //创建灯光2,步骤同上 let light2 = newLight() light2.position = CGPointMake (28, 6.0) ship.addChild(light2) //物理系统 ship.physicsBody = SKPhysicsBody (circleOfRadius: 15) ship.physicsBody?. dynamic = false //返回飞船 return ship } //创建灯光方法 func newLight()-> SKShapeNode { //创建一个黄色椭圆充当灯光 let light = SKShapeNode () light.path = CGPathCreateWithRoundedRect ( CGRectMake (-4, -4, 8, 8), 4, 4, nil ) light.strokeColor = SKColor .whiteColor() light.fillColor = SKColor .yellowColor() //创建忽明忽暗的动作 let blink = SKAction .sequence([ SKAction .fadeOutWithDuration(0.25), SKAction .fadeInWithDuration(0.25) ]) //创建一直重复的动作 let blinkForever = SKAction .repeatActionForever(blink) //执行动作 light.runAction(blinkForever) //返回灯光 return light } //创建陨石的方法 func addRock(){ //小椭圆充当陨石 let rock = SKShapeNode () rock.path = CGPathCreateWithRoundedRect ( CGRectMake (-4, -4, 8, 8), 4, 4, nil ) rock.strokeColor = SKColor .whiteColor() rock.fillColor = SKColor .brownColor() //获取场景宽,高 let w = self .size.width let h = self .size.height //随机出现在场景的xy位置 let x = CGFloat (arc4random())%w let y = CGFloat (arc4random())%h //设置陨石的位置 rock.position = CGPointMake (x,y) //设置陨石的name属性 rock.name = "rock" //给陨石设置物理体 rock.physicsBody = SKPhysicsBody (circleOfRadius: 4) //物理体允许检测碰撞 rock.physicsBody?.usesPreciseCollisionDetection = true //场景加入陨石 self .addChild(rock) } } |
Swift - 一步步教你使用SpriteKit创建开发游戏项目的更多相关文章
- 一步步教你轻松学支持向量机SVM算法之案例篇2
一步步教你轻松学支持向量机SVM算法之案例篇2 (白宁超 2018年10月22日10:09:07) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- 一步步教你轻松学关联规则Apriori算法
一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法(白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...
- 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3
一步步教你轻松学朴素贝叶斯深度篇3(白宁超 2018年9月4日14:18:14) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...
- 一步步教你轻松学KNN模型算法
一步步教你轻松学KNN模型算法( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解. ...
- Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)
一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那 ...
- 一步步教你搭建VS环境下用C#写WebDriver脚本
一步步教你搭建VS环境下用C#写WebDriver脚本http://www.automationqa.com/forum.php?mod=viewthread&tid=3529&fro ...
- 我写了个教程《一步步教你把ubuntu安装到U盘》
一步步教你把ubuntu安装到U盘 作者 Val 2452013147@qq.com 原因: 由于某些原因(学生党),需要把ubuntu安装到U盘到处走,百度了一下,教程都不是很好,要么很复杂,要么不 ...
- 一步步教你读懂NET中IL(附带图)
一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...
随机推荐
- 【linux】 linux gpio操作
欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- 史上最详细的Android Studio系列教程一--下载和安装
链接地址:http://segmentfault.com/a/1190000002401964#articleHeader4 原文链接:http://stormzhang.com/devtools/2 ...
- 安装 unixbench 报错解决方法
一.准备工作 1.首先使用root用户登陆. 2.运行Unixbeanch需要GCC的支持,在安装Unixbeanch之前,需要先安装GCC,在Debian中,直接执行如下命令: 复制代码 代码如下: ...
- django中上传图片的写法
view参数 @csrf_exemptdef before_upload_avatar(request): before = True return render_to_response( ...
- 基于visual Studio2013解决算法导论之018栈实现(基于链表)
题目 用链表实现栈 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...
- 西安力邦智能医疗&可穿戴设备沙龙--第1期---苹果HealthKit、谷歌GoogleFit来袭,智能医疗要爆发吗?
背 景: "可穿戴设备"成为2014的行业热点,从Google Glass到苹果iWatch, 越来越多的企业推出了包含眼镜.腕带.鞋等各种可穿戴设备,"可穿戴&q ...
- 开源框架ViewPagerIndicator的使用——TabPageIndicator
1.导入Android-ViewPagerIndicator库文件 下载地址:https://github.com/JakeWharton/ViewPagerIndicator 2.布局文件 ...
- 解析stm32的时钟
STM32 时钟系统 http://blog.chinaunix.net/uid-24219701-id-4081961.html STM32的时钟系统 *** http://www.cnblo ...
- Windows VS下搭建cocos2d-x环境搭建
VS2010以上版本(eg:VS2012/VS2013,这里本人用VS2013) 1.环境.安装包准备 2.python安装 3.cocos2d-x安装包解压安装 4.环境变量配置 5.执行setup ...
- [转]PostgreSQL 中文资料汇总
原文链接:http://francs3.blog.163.com/blog/static/405767272014017341219/ --1 中文社区网站 PostgreSQL 中文社区官网: h ...