噗浪大撒幣!沒錢課金就用 viewDidLoad 做畫面過個乾癮

◆課堂練習&作業7:利用 viewDidLoad 客製 App 畫面(自訂 controller 類別先不用看)◆

使用語法包含:
1.用 UIImageView 貼入 GIF 動畫
2.CGAffineTransform 進行形變
3.CAGradientLayer 製作漸層
4.CABasicAnimation&CAShapeLayer 繪製線條動畫
5.CAEmitterLayer&SpriteKit Particle File 做出下雪動畫&下雪粒子特效

成品

歡迎抖~內~(誤)

噗浪愛好者 Part.2
上一篇作業的路徑,這次用 viewDidLoad,搭配物件的形變、漸層跟一些特效做出酷酷的畫面

附上跟成品結果相差甚遠的構思草圖 XD

本來下雪特效想用愛心、用線條描 Plurk 字樣,但發現可能是路徑寫法關係,Plurk 無法做出線條動畫 (ㆆᴗㆆ)
靈機一動,想到噗浪的課金服務──噗幣,決定來大撒幣,現在沒收入不能課金就下個噗幣雨過過癮!

※吉祥物的 Loading GIF 和噗幣原始圖檔是從網頁原始碼抓來的,純練習使用※

製作記錄

【view 跟 path 的形變】

因為懶得重畫愛心,原本畫的愛心又太小,搜尋了一下發現 path 也可以進行形變,只是寫法不太一樣 d(d'∀')

1.語法上的些微差異
對 view 進行形變時用 .transform,後面接 CGAffineTransform

位移:view.transform = CGAffineTransform(translationX: CGFloat, y: CGFloat)
縮放:view.transform = CGAffineTransform(scaleX: CGFloat, y: CGFloat)
旋轉:view.transform = CGAffineTransform(rotationAngle: CGFloat)
寫一起:view.transform = CGAffineTransform.identity.translatedBy(x: CGFloat, y: CGFloat).scaledBy(x: CGFloat, y: CGFloat).rotated(by: CGFloat)斜線部分要對應改成數值或是view的名字

對 path 進行形變時,不能直接用 .transfrom ,但在前面加入 apply 就可以用 CGAffineTransform 了!

位移:path.apply(CGAffineTransform(translationX: CGFloat, y: CGFloat))
縮放:path.apply(CGAffineTransform(scaleX: CGFloat, y: CGFloat))
旋轉:path.apply(CGAffineTransform(rotationAngle: CGFloat))
寫一起:path.apply(CGAffineTransform.identity.translatedBy(x: translateX, y: translateY).scaledBy(x: scale, y: scale).rotated(by: rotateDegree))斜線部分要對應改成數值或是path的名字

2.旋轉角度
做 path 的形變發現數值是 CGFloat,但角度變動不大懶得寫 let oneDegree = CGFloat.pi / 180,找到 Peter 寫過下面這篇文章

簡單來說:CGFloat.pi=180 度;CGFloat.pi/4=45 度,看 180 除以多少會變幾度,如果是逆時鐘方向則是在 CGFloat 前面加上負號

3.練習時的疑惑
對 view 做形變的時候,如果三項分開寫,模擬器只顯示最新(寫在最下面)的那個形變語法,要用寫在一起的語法才能同時位移、縮放、旋轉。不知道是不是預設就是這樣 (´・_・`)

但是用 path 做形變時,不論分開寫或一起寫都可以顯示所有的語法內容(在愛心線條動畫中就是分開寫的,本來想改成寫一起語法,但改了之後要重新調 x、y 位置就算了 XD)

即使上面有寫旋轉,但是模擬器只會顯示位移的語法
另外,寫一起的場合把 translation 跟 scale 順序寫相反的話,結果真的會長得不一樣

【動畫】

其實實作上不難,但是想要一個愛心用 ”stokeEnd”,另一個用 ”stokeStart”

解法:利用 function 參數
把 function 內加入新的參數,型別寫字串(”stokeEnd” 有 ” ” 是字串)並在 function 內動畫語法中的 keyPath: 後面改成參數名,呼叫 function 時參數再寫入 ”stokeEnd” 或是 ”stokeStart” 就可以了

另外,好奇有沒有語法可以畫出來再擦回去,這樣畫完一個循環要再重來時,就不會跳回原本沒畫的樣子,可以看不出破綻的瘋狂循環了 XD

【下雪特效】

1.讓漸層背景跟粒子物件共存
用 SpriteKit Particle File 做出的下雪粒子特效,背景要改成 clear,才能讓後面的漸層背景跑出來,view 跟 scene 都要改,才會全透明只剩粒子物件

view.backgroundColor = .clear
scene.backgroundColor = .clear

2.變更 view 跟 scene 的透明度(.alpha)
雖然這次用哪個改都會呈現一樣效果,但猜測有設背景顏色的話 view 應該連背景都會一起變淡,scene 只有物件本體

view.alpha = 0 ~ 1
scene
.alpha = 0 ~ 1

3.下雪動畫跟特效的比較
兩者都是要慢慢調數值,用粒子特效可以在旁邊馬上看到變化,而用 CAEmitterLayer 要一直開模擬器看製作出的效果會比較麻煩(但 CAEmitterLayer 感覺可以更改的項目比較多)
如果是要做真。雪花,數值跟著 Satinder Singh 大大寫的文章去調的話,做出來真的會超像雪花飄!

【完整程式碼@GitHub】

除了噗浪大撒幣的畫面外,下面一長段註解是理解語法跟課堂練習的部分

【本次參考教學文章】

--

--