SpriteKit 学习笔记 (一)初探

SpriteKit

最近在微博看到有大神用半天时间学习了SpriteKit并开发了一款打砖块游戏,感觉学习成本应该不高,于是心血来潮地也想感受一下这个苹果早在iOS 7 SDK中就引入的2D游戏引擎框架。
以下内容参照 —— [ SpriteKit Swift 3 Tutorial for Beginners ]

SpriteKit 优势

  • 苹果自家的SDK,不用安装额外的包或插件,并且可以随意调用Apple其他的API。
  • 用Objective-C或者Swift语言就可以编写,上手快
  • 完全免费

新建工程

这里写图片描述
默认的工程设置有两个小瑕疵。
首先,游戏一般都是横屏的,把target settings里面的Portrait选项取消勾选,这样可以保证游戏内容不会以竖屏形式呈现。然后勾选Requires full screen。
其次,删除掉工程里的.sks文件,这类文件类似XIB或Storyboard文件,可以随意拖拽控件,但如果只是做简单的小游戏,手动编码就够了:)
这里写图片描述

加入精灵

首先,SpriteKit的视图层级是UIViewController->SKView->Scene
SpriteKit是基于场景(Scene)来组织的,每个SKView(专门用来呈现SpriteKit的View)中可以渲染和管理一个SKScene,每个Scene中可以装载多个精灵,并管理它们的行为。
而接下来我们要加入的诸如玩家、怪兽等等精灵都是SKSpriteNode类的对象。
创建精灵的代码非常简单:

import SpriteKit

class GameScene: SKScene {

  // 1
  let player = SKSpriteNode(imageNamed: "player")

  override func didMove(to view: SKView) {
    // 2
    backgroundColor = SKColor.white
    // 3
    player.position = CGPoint(x: size.width * 0.1, y: size.height * 0.5)
    // 4
    addChild(player)
  }
}

一步一步地解释的话就是:
1. 声明一个玩家精灵
2. 设置场景的背景色为白色
3. 设置玩家精灵的位置
(注:SpriteKit中的坐标系和其他OpenGL游戏坐标系是一致的,屏幕左下角为(0,0)。不过需要注意的是不论是横屏还是竖屏游戏,view的尺寸都是按照竖屏进行计算的,即对于iPhone来说在这里传入的sizewidth是320,height是480或者568,而不会因为横屏而发生交换。因此在开发时,请千万不要使用绝对数值来进行位置设定及计算)
4. 把玩家添加进场景(显示在屏幕上)

让精灵动起来

加入精灵之后,应该让它动起来。在SpriteKit使用SKAction这个类来操作精灵结点,完成诸如移动,旋转,消失等等动作。这个类同时提供sequencegrouprepeat等方法可以让一系列的action按照规定的序列执行。

碰撞检测和物理引擎

以RayWenderlich中的游戏为例,没加入碰撞检测的时候是这样的,飞镖接触到怪物仍旧直穿而过,完全就是空气一般的存在。我们想要做的是在飞镖和怪物接触到的时候,将它们都移出场景,这样看起来就像是飞镖打中了怪物,并且把怪物消灭了。
这里写图片描述
基本思路是在每隔一个小的时间间隔,就扫描一遍场景中现存的飞镖和怪物。这里就需要提到SpriteKit中最基本的每一帧的周期概念
这里写图片描述
在iOS传统的view的系统中,view的内容被渲染一次后就将一直等待,直到需要渲染的内容发生改变(比如用户发生交互,view的迁移等)的时候,才进行下一次渲染。这主要是因为传统的view大多工作在静态环境下,并没有需要频繁改变的需求。而对于SpriteKit来说,其本身就是用来制作大多数时候是动态的游戏的,为了保证动画的流畅和场景的持续更新,在SpriteKit中view将会循环不断地重绘。

动画和渲染的进程是和SKScene对象绑定的,只有当场景被呈现时,这些渲染以及其中的action才会被执行。SKScene实例中,一个循环按执行顺序包括:

  • 每一帧开始时,SKScene的-update:方法将被调用,参数是从开始时到调用时所经过的时间。在该方法中,我们应该实现一些游戏逻辑,包括AI,精灵行为等等,另外也可以在该方法中更新node的属性或者让node执行action
  • 在update执行完毕后,SKScene将会开始执行所有的action。因为action是可以由开发者设定的(还记得runBlock:么),因此在这一个阶段我们也是可以执行自己的代码的。
  • 在当前帧的action结束之后,SKScene的-didEvaluateActions将被调用,我们可以在这个方法里对结点做最后的调整或者限制,之后将进入物理引擎的计算阶段。
  • 然后SKScene将会开始物理计算,如果在结点上添加了SKPhysicsBody的话,那么这个结点将会具有物理特性,并参与到这个阶段的计算。根据物理计算的结果,SpriteKit将会决定结点新的状态。
  • 然后-didSimulatePhysics会被调用,这类似之前的-didEvaluateActions。这里是我们开发者能参与的最后的地方,是我们改变结点的最后机会。
  • 一帧的最后是渲染流程,根据之前设定和计算的结果对整个呈现的场景进行绘制。完成之后,SpriteKit将开始新的一帧。

在了解了一些SpriteKit的基础概念后,回到我们的话题。我们将用SpriteKit的物理引擎来检测飞镖和怪兽的碰撞。而你仅仅要做的就是以下几步:

  • 设置物理世界 SKPhysicsWorld类,它可以控制场景中的重力等属性
  • 为每个精灵设置物理引擎 SKPhysicsBody类,它附着在每个精灵上,控制结点的各种物理属性
  • 为每种精灵设置类别 这是一个bitmask,可以标识每个精灵属于哪种类别
  • 设置contact delegate 设置代理后,当检测到精灵碰撞,就会通知代理进行处理。比如碰撞的两个物体分别属于飞镖和怪物,就可以将他们双双移出场景了。

关于物理引擎还有很多知识点,因为现在只是一个初探,后面再深入研究。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值