Swift 遊戲開發之「方塊彈珠」(一)

前言

在上一篇文章中,咱們已經明白了「蝸牛睡不着」的遊戲背景,知道咱們要去完成的遊戲是什麼。在正式進入真正的遊戲開發以前,爲了有一個較好的過渡,咱們先來利用 UIKit 框架自己的一些物理模擬能力,完成一些有趣的 demo,來協助咱們理解一些遊戲開發的中常常遇到的概念。git

UIKit 物理模擬

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))
複製代碼

2019-11-21 22.36.56.gif

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 的各類概念並實踐。

  • 遊戲講解;
  • 熟悉 2D 編程(ing);
  • 剛體碰撞與檢測;
  • 小球的發射與方塊的消除;
  • 遊戲邏輯完善。

GitHub 地址: github.com/windstormey…

相關文章
相關標籤/搜索