在上一篇文章中,咱们已经明白了「蜗牛睡不着」的游戏背景,知道咱们要去完成的游戏是什么。在正式进入真正的游戏开发以前,为了有一个较好的过渡,咱们先来利用 UIKit
框架自己的一些物理模拟能力,完成一些有趣的 demo,来协助咱们理解一些游戏开发的中常常遇到的概念。git
self.animator = UIDynamicAnimator(referenceView: view)
let redView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
redView.backgroundColor = .red
view.addSubview(redView)
let gravity = UIGravityBehavior(items: [redView])
self.animator?.addBehavior(gravity)
复制代码
let collision = UICollisionBehavior(items: [redView])
collision.translatesReferenceBoundsIntoBoundary = true
self.animator?.addBehavior(collision)
复制代码
默认状况下,碰撞的边界和容器视图的边界是相同的,若是咱们想将碰撞边界设置为容器边界往内缩进一些,能够这么作:github
collision.setTranslatesReferenceBoundsIntoBoundary(with: UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50))
复制代码
let anchor = CGPoint(x: self.view.bounds.width / 2, y: 100)
let attachment = UIAttachmentBehavior(item: redView, attachedToAnchor: anchor)
self.animator?.addBehavior(attachment)
复制代码
这部份内容我纠结了一下,以为仍是有必要跟你们说明,回想我当初接触物理引擎时,由于一会儿进入陌生的领域,不少基础概念须要补,为了一次到位,跟你们分享几个后续游戏开发过程当中会常常接触到的术语。spring
这部分应该是高中数学。在游戏中,向量一般用来描述位置和速度。由于向量的内容实在太多,一一说完感受都能开个辅导班了,所以我只列出一部分后续游戏中可能会用到的重点内容提示,细节你们有时间再自行展开。编程
得益于在 Swift 中,全部的类型均可以使用「拓展」来增长额外的方法实现一套向量的计算一点都不难。Swift 自定义运算符的功能很是强大,由于它能够节约大量重复代码,但也存在一些问题。除非咱们自定义的运算符能被其余阅读代码的人看懂(我本身也不能保证呀~),不然将一些晦涩难懂的符号定义为运算符将下降代码的可读性。swift
「物理引擎」在一个游戏中是没办法直接去使用的,必须借助于一个附着体使其发挥对应的能力。而「世界」就是物理引擎发生做用的场景,其为全部游戏中的物体得以容身的「宇宙」,若是一个物体位于这个世界以外,那么它是没法被物理引擎管理的,也没有任何物体可以影响到它。markdown
常规概念。一个物体的质量越大,其重量越大,下坠的速度也就越快。框架
常规概念。在 SpriteKit
物理世界中,速度由两部分构成:水平速度和垂直速度,也即「x 速度」和「y 速度」。oop
其为物理世界中的对象自己。一个物体可以受外力做用,而且可以和其它物体发生碰撞,具备质量和速度。物理分为「动态物体」和「静态物体」,「静态物体」代表其不受外力做用,也不会移动。spa
做用力会致使物体移动。当本游戏中,咱们发射一个小球,会给小球施加一个做用力,当咱们松开球时,球会得到一个加速度,从而离开初始位置。重力和做用力不是一个概念,重力是另一种力,它对处在当前重力环境中的全部物体都有影响。要做用多大的力才能使物体移动,这于物体自己的质量有关,在相同的力下,分别将该力做用于较重的物体和较轻的物体,较轻的物体移动速度会相对较快。code
常规概念。当一个物体于其它物体接触时,会因两者之间产生的摩擦力而致使运动速度的衰减。在真实世界中,物体和物体之间产生的摩擦力会由于产生热能而被转移掉,但在 SpriteKit
中,仅能作到将动能凭空消耗掉,若是咱们想要彻底模拟热能的转换,须要再写一套逻辑。咱们能够对某个物体制定其摩擦系数,摩擦系数越低,表面越光滑,与其它物体接触时,两者的动能损失就越小。
碰撞体规定了物体的形状,物体自己贴图并不能决定其真正的刚体大小,好比计算一我的的腰围时,必需要求贴身测量,咱们测的就是人这个「刚体」自己的腰围,并非穿着衣服的腰围。SpriteKit
默认提供正方形、矩形、圆形和多边形,能够自定义 Path
设置不一样的碰撞体。
边缘碰撞体是碰撞体的子集。其由一条或多条细线构成,边缘碰撞体多数用于构建「墙」等障碍物。具备边缘碰撞体的物体永远不会运动,它是「静态物体」。
当两个物体/刚体发生碰撞时,咱们称之为「碰撞」。碰撞是行为,碰撞体是对象。发生碰撞时,咱们能够从「碰撞」中获取到碰撞体双方的信息,好比发生碰撞的是哪些物体以及碰撞的位置等。
链接是两个物体之间的一种关系。最经常使用的是 pin
链接,即一个物体可以旋转,但不能从另外一个物体的某个相对点离开。另外一种是 spring
链接,一个物体可以离开另一个物体,但当它运动到距离另外一个物体的某个范围时,会被弹回去,如上文中的最后一个 demo 所演示的效果。
在这篇文章中,咱们经过 UIKit
里自带的一些物理模拟方法作了一些物理小实验,并描述了一遍相关概念,供后续进行游戏开发时的基础支撑。
在下一篇文章中,咱们将引入 SpriteKit
的各类概念并实践。
GitHub 地址: github.com/windstormey…