Swift - 一步步教你使用SpriteKit创建开发游戏项目
![](http://www.hangge.com/blog_uploads/201505/2015051415362023139.png)
![](http://www.hangge.com/blog_uploads/201505/2015051415402797547.png)
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,修改场景背景色,添加文本标签,点击屏幕给标签添加动画效果
![](http://www.hangge.com/blog_uploads/201505/2015051415560815426.png)
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创建一个飞船
![](http://www.hangge.com/blog_uploads/201505/2015051416344331412.png)
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,定时生成陨石(并设置物理碰撞)
![](http://www.hangge.com/blog_uploads/201505/2015051510103123133.png)
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)
}
}
|
转载于:https://www.cnblogs.com/Free-Thinker/p/4841089.html
Swift - 一步步教你使用SpriteKit创建开发游戏项目相关推荐
- pythonweb开发-一步步教你开始使用Python开发Web应用
[IT168 技术]Python是一个通用编程语言,并很快成为每个自重程序员宝库中的一个必需品. Python中有数不清的Web框架,从基本的微小架构到完整的架构,它们自有各自的优点.那么你准备使用它 ...
- 一步步教你前端vue项目开发中如何解决跨域问题
文章目录 开发环境中跨域 名词解释 1.同源策略: 2.同源: 3.跨域: 4.代理服务器: 解决方式 项目背景 跨域配置 1.配置说明: A.参数proxy详解: B.pathRewrite详解: ...
- 20个最佳Flash游戏解析,一步步教你创建Flash游戏
20个最佳Flash游戏解析,一步步教你创建Flash游戏 http://www.javaeye.com/news/12740-flash Flash算得上是一个家喻户晓的名字,涉及面很广,比如多媒体 ...
- 用 Swift 语言和 SpriteKit 创建有人工智能的井字游戏
本文讲的是用 Swift 语言和 SpriteKit 创建有人工智能的井字游戏, 我对(自我)学习有着很强的热情并且非常着迷.最近,我提出了一个利用制作游戏的理论应用到应用程序开发中来提高用户体验的假 ...
- 一步步教你轻松学朴素贝叶斯模型算法理论篇1
一步步教你轻松学朴素贝叶斯模型理论篇1 (白宁超2018年9月3日17:51:32) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...
- 一步步教你在以太坊发行自己的数字货币
一步步教你在以太坊发行自己的数字货币 置顶 2018年03月21日 15:31:04 阅读数:1239 什么是代币 如果不那么追求精确的定义,代币就是数字货币,比特币.以太币就是一个代币. 利用以太坊 ...
- 一步步教你Hadoop多节点集群安装配置
一步步教你Hadoop多节点集群安装配置 1.集群部署介绍 1.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统HDFS(Hado ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法 (白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类 ...
- 一步步教你轻松学关联规则Apriori算法
一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...
最新文章
- ubuntu16.04 cuda9.0 cudnn Tensorflow GPU 1.10.0
- SPI及其工作原理浅析
- java实现注销登录
- 数据结构-----栈
- 数字图像处理:第二十一章 视频压缩标准
- 自定义控件winfrom
- android apk如何入门
- Openfiler + Redhat 5.4 Oracle 11gR2 RAC 安装文档
- ThreadLocal和线程同步机制的对比
- STM32板子电源绘制原理
- linux配置iscsi无账号密码,linux4 如何配置iscsi启动器
- python 对话框开发_python文件选择对话框的操作方法
- HTML(超文本标记语言)-----WEB开发基础之二
- wordpress制作主题之菜单
- LINUX串口驱动安装 一条龙服务
- diabetes影响因子2017_瑞金医院创办Journal of Diabetes成为亚太地区影响因子最高的糖尿病学术期刊...
- verilog语法检查
- sendmail 邮件服务器 套件,SENDMAIL邮件服务器的安装与设置
- 【毕业设计】单片机智能快递柜系统 - stm32 嵌入式 物联网
- 抗渗等级p6是什么意思_抗渗等级P6什么意思?
热门文章
- 吉林大学2013级大一下学期程序设计作业:同学通讯录系统
- 计算机网络---介质访问控制
- laravel安装的几种方法总结
- 国外接活网站报告 - 4大国外自由职业者接活网站
- python 去掉双引号_你要偷偷的学Python,然后惊呆所有人(第一天) - python阿喵
- mac安装oh-my-zsh出现command not found: npm问题解决
- react+Ts+批量上传华为云OBS
- java 双屏显示_Android双屏异显的实现
- sql语句去重distinct、统计(count、sum)
- 贪心算法之圣诞老人的礼物