用code畫國旗
這次的作業是用程式畫出國旗,大家知道在海上有所謂的「國際信號旗」?
既然在海上飄盪了五年,這次要挑一個國際信號旗來當作業!
一開始想做看起來有點難的Y(Yankee),Yankee代表船正在拖著一個船錨。但看了一下畫三角形的程式方法,覺得有點難,想說先來做簡單的Oscar就好,O(Oscar)代表的是人員落水。好端端的人怎麼會落水呢?我還真遇過一次😅
先研究了一下要怎麼畫三角形,結果程式中出現了目前還沒學過的CALayer,我是一個沒辦法矇著眼睛假裝自己會然後硬抄程式的人,只好先研究了一下什麼是CALayer?為什麼畫完三角形不能用,而是要透過這個layer呢?
根據這個網站:https://www.appcoda.com.tw/calayer-introduction/
每個View都是透過layer做為圖形繪製的基礎。
看完有懂一些嗎?
...
..
.
我是沒有。
但總之看了一下範例,我想應該就是畫布的感覺吧~ 🚬
先找出需要的背景色(黃色)的RGB,丟到老師給的網站Schem Color裡查色素,給的是#ffff00,不是我需要的RGB,所以丟到Google大神直接打RGB,居然出現了!google真是我的bff <3
打完以上那一串後... 我大概就卡死了五個小時,一開始看著說明試圖用著自己取的名字來做出旗幟,但就是亂七八糟跑不出來。
最後一邊看著學長姐的code一邊練習。先不要自己亂取名字,先用學長姐的名字,這樣要對錯比較好對。
然後終於就寫出來了!
雖然看著抄都還是會跑不出來,畢竟旗幟不一樣,要自己融會貫通一下!
寫出來後信心滿分,等下要挑戰更難的Yankee.
以下是參考學長姐的code寫出來滴~
import UIKit//設定國旗大小var rect = CGRect(x: 0, y: 0, width: 500, height: 500)//設定旗幟名稱,加入view的大小let flag = UIView(frame: rect)//設定國旗底色,用取好的名字flag.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 0/255, alpha: 1)//製作紅色三角形let rectTRI = CGRect(x: 0, y: 0, width: 500, height: 500)//取名字let TAView = UIView(frame: rectTRI)//設定三角形的顏色TAView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)//開始畫三角形let TRI1 = UIBezierPath()var PointA = CGPoint(x: 0, y: 0)TRI1.move(to:PointA)PointA = CGPoint(x:500, y:0)TRI1.addLine(to: PointA)PointA = CGPoint(x: 500, y: 500)TRI1.addLine(to:PointA)TRI1.close()//用CAShapeLayer生成let rectLayer = CAShapeLayer()rectLayer.path = TRI1.cgPath//rectlayer的路線要跟著tri1剛剛走過的路走TAView.layer.mask = rectLayerflag.addSubview(TAView)flag
接下來挑戰一開始覺得有點複雜的Yankee
我先進到咖啡廳,試圖靠著昨天的記憶,自己寫出Yankee的旗幟。不過還是需要不停地回頭看昨天寫的程式。
寫完以後變這樣...
看出來了吧,我自己設定了500*500的方塊,然後按照指標網頁給我的70*70的數據,然後就變這樣了。
所以決定在筆記本上先畫出座標,立刻發現我給自己出了難題。紅黃色區隔每邊為6等分,我做了500*500,根本就很難加減乘除。所以我隨機立斷把500改成600,立刻解決了數學不好的難題。
接下來我卡在對於
let redStripe = CGRect(x: 0, y: 0, width: 600, height: 600)let stripes = UIView(frame: redStripe)stripes.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
這段令我想不開的程式,覺得到底為什麼要分別寫兩行呢?害我每次都不知道之後addSubview的時候到底要加在哪個名字上。
後來我去youtube看了這支影片
瞬間回復之前做storyboard的記憶。
然後發現應該是我自己+參考的學長姐的名字沒有取清楚(還怪人家)導致自己有點混亂。
如果學另一個學長姐把名字取成
let frameBlue = CGRect
let viewBlue = UIView(frame: frameBlue)
就比較好區分兩個名字的差別。
frameBlue:先設定大小
viewBlue = UIView(frame) :view應用之前設定好的大小
接下來要改顏色什麼的,都以view為基準,因為view才是實實在在的畫紙,frame只是選紙的大小而已,像是A3吧。
之後要畫貝茲曲線UIBezierPath()
let path = UIBezierPath()
就是我現在生出一個叫path的畫筆,這個畫筆要用貝茲曲線這個工具來做圖。
var point = CGPoint(x,y)
var是變數,用var的原因是後面要不停的改落點,所以用變數。一開始我一直把let path跟var point讀成設定未來動向的基準,然後就一直卡死。
後面我發現var point雖然前面有個var,但其實只是宣告變數而已,point開始就可以看作起點了,而不是背景設定。
path.move(to:point)
是說我現在把剛剛拿出來的貝茲曲線工具開始移動,移動到(point)
下一行就說明這個point在哪。
這樣反覆就可以畫出來了。
這樣搞清楚以後,我要回去改我的作業了。
改作業
- 取好名字以後真的清楚很多,不會自己左腳踩右腳
- 遇到的小問題是使用path.close()的時候,常常會做出奇怪的形狀如下圖
後來研究了一下,發現一定要先寫path1.addLine(to:point1)下面再街上path1.close()才會連好線。在這一塊我有點搞不清楚path1.addline()這邊,到底是先寫點再畫線,還是先畫線再寫點。
但看樣子應該是先宣告畫線再告知去何處吧。所以才會先寫addline然後再跟電腦說addline到關閉曲線的地方(起始點)。
最後終於寫出我滿意的旗幟(雖然覺得中間那槓太寬很奇怪,後來回去改的時候code亂掉... T_T我就放棄了),好在有先拍照