Skip to main content

Posts

[Swift3] weak 與 unowned 關鍵字

雖然在 Swift 中看起來"很像"是不需要煩惱內存管理的問題,不過實際上它還是遵循著自動引用計數 (ARC) 的規則,當一個物件沒有被其他對象引用時會自動被銷毀,如果三魂七魄沒有完全回位的話,就會有個靈體留在現世的空間裡,最經典的範例如下: 閉包(Closure)引用 classClassA { typealias Complete = ()->() var name : String var onComplete : Complete? init(_ name: String){ self.name = name print("Hello I am \(self.name)") onComplete = { print("\(self.name): onComplete!") // --> 閉包引用 self, 計數 + 1 } } deinit { print("deinit: \(self.name)") } } var a : ClassA? = ClassA("A") // --> 引用計數 + 1 a = nil // 2-1 = 1 還剩下 1 所以沒辦法銷毀 ---output------- Hello I am A 由於這邊的 onComplete 宣告為 Optional, 正確的做法要連同 onComplete 一起刪除才可以被回收,若不是 Optional 則會進入無法回收狀態: var b : ClassA? = ClassA("B") b?.onComplete = nil // --> 還好是 Optional 可以設成 nil 計數 - 1 b = nil // 計數 = 0 所以被回收 ---output------- Hello I am B deinit: B 但是做人不需要煩惱太多,這時候就出動 unowned 關鍵字讓物件可以順利被回收: onComplete = { [unowned self] in print...

[Swift3] ? 與 !

學習 Swift 語言覺得最有趣就是變數後面的問號與驚嘆號。看著程式碼帶著一堆 ??!! 相信初學的朋友應該都挺傻眼的。其實會出現 ? 與 ! 是因為 Swift runtime 的特性:不容許變數有 nil 的存在而產生的,這時候就需要先來學習什麼是變數為 Optional(可選性)。 以下是一般情況,預先宣告了一個沒有賦值的變數,然後不小心先使用它,這種情況下就會出現 runtime error: var string: String print(string) ---output--------- variable 'string' used before being initialized 加上?宣告成 Optional 就安全過關: var string: String? //-> 設定為 Optional 所以 runtime safe print(string) ---output--------- nil 重點一:變數會有 nil 情況發生就是加上 ? class ClassA { var b: ClassB? // 不確定b 會不會存在,加上? 就不需要在 init 初始化 } class ClassB { var count = 1 var string = "Hahaha" var x = 12.0 var y = 20.5 } 因為使用了問號 b 還是 Optional,所以沒有 runtime error。 let a = ClassA() print( "\(a.b?.count)" ) ---output--------- nil 而與 ? 相對的就是 ! , 一個包裝,一個拆包。驚嘆號最大的作用就是將「虛轉成實」,所以當使用!打開 Optional 變數時,如果該變數還是 nil 的話,就會出現 runtime error。 let a = ClassA() print( "\(a.b!.count)" ) //使用 ! 強制將 Optional 的 b 打開,結果因為 b 是 nil 所以有 runtime error ---output--...

[App] 國道計程收費速算器 2.0

之前的版本跟目前 國道計程官網 所列資料誤差很大,這支 App 也一直有人在使用,所以為了答謝愛用者只好做了一次大更新,因為對 CoronaSDK scrollView widget 有點怨言,所以 iOS 版本採用 Swift3 重寫了一遍,不過 Android 版本還是維持著 CoronaSDK 版本: V2.0 更新: 更新地圖資料與國道計程收費官網同步,新增多個服務區、樹林與南雲出入口。 修正快速道路與無計費國道串接點選方式,改採用連續點法,如 苗栗到清水服務區點選順序為:苗栗 ->台中系統 -> 中港系統 -> 清水服務區 更新連假模式價錢基數與修正計程車模式價錢顯示。。 地圖可縮放。=D Universal Version includes iOS and Android

[書評] 拖延心理學:為什麼我老是愛拖延?是與生俱來的壞習慣,還是身不由己?

作者: Jane B. Burka & Lenora M . Yuen 推薦指數 ★★★★★ 有時候,只是想了解事情發生原因而不是尋求解法 在這邊不是要講這本書的內容,而是想聊它對我的影響。

[Unity] erinylin.lazylib - Cookie for PlayerPrefs

有鑑於 PlayerPrefs 測試與版本更新問題,將大家都愛用的 PreviewLabs.PlayerPrefs 打包起來,製作重點還是以懶人為主,基本上 PlayerPrefs 資料更新與數量並不可能會有強烈衝擊效能的狀況產生,所以為了方便開發,就弄了一個視覺化工具,方便除錯用。 雖然 PreviewLabs.PlayerPrefs 作者都宣告放棄他們的版權,不過為了尊重程式,僅僅加入了兩個公用函式,其他並無更改。 內有: Cookie Manager Cookie 用 DataObject 混合編輯 ScriptableObject 執行階段除錯視窗工具 當然還是有懶人常數檔案輸出 資料版本控制,方便更新版後儲存資料更新 功能其實很多,有興趣的請自行到 Github 下載並參考範例吧!

[Unity] erinylin.lazylib - fsm2.0

怕上篇文章越改越長,就直接開新的貼。 erinylin_fsm2.0.unitypackage A finite-state machine (FSM) v2.0, use ScriptObject to preset states. 有限狀態機更新版。本人有強迫症,喜歡將工具不斷改寫。本版本主要是學習到 ScriptableObject and EditorGUI 時改寫的。

[Unity] erinylin.lazylib

絕大部分都是組件,會秉持懶人精神,朝使用便捷的方向製作。每個專案都會附上範例場景。不定時更新 erinylin_fsm.unitypackage lastupdated: 03.03,2016 A finite-state machine (FSM), easy to use also can be set by Inspector window. 有限狀態機  

PureMVC for Unity

幾個月前改用 Unity 開發遊戲,到目前的心得為:組件式開發真的是很便利,但是當組件數量多到一定程度時,結構上就有點可怕,常常在某 GameObject 上掛了組件後就忘了它的存在,雖然可以使用 Singleton design pattern 來製作主要的 Manager(本人對 Singleton 並不是很熱愛),程式還是會亂到一定程度,搜尋了一些 Unity with MVC 討論,一部分的人都對實作 MVC 不是很熱絡,也許是 Unity 特有的開發環境導致。 以前開發 Adobe Flex 專案最愛用的 MVC Framework 就是 PureMVC,即使後來有更方便的 MVC Framework 的也擋不住我對它的熱愛。Unity 是沒有所謂的全域 Root Scene,所有場景都是獨立,想要將 AS3 實作邏輯套用在 Unity 上將控制項都在 PureMVC 架構中實作是有點矯情多餘。如何保持 Unity 組件開發模式,導入 PureMVC 鬆綁主要邏輯,就是這次實驗的重點。 不清楚 PureMVC 的朋友們可以到這邊參觀一下: PureMVC 我也會 PureMVC C# Standard Framework on GitHub ViewComponent 與 Mediator 整合是首要工作: 由於 Unity 沒有全域 Root Scene,如果將 new Mediator( viewComponent ) 寫在 PureMVC 架構下,即使透過 GameObject.Find 找那個對應的 GameObject 就轉了九彎十八拐,寫起來一點都不愉快,尤其考慮到場景的轉換,兩個場景中相關 Mediator 的註冊與移除處理,何況對 Unity 組件來說,能不能被打包動態載入是件重要的事。綜合以上問題點,反向思考,改由 GameObject 掛載中介組件,在 OnEnable 與 OnDisable 通知 Facade 去註冊與移除其 Mediator,一來簡化為了實作 Meditaor 掛載 ViewComponent 而對 static class GameObject 的依賴,二來也不會對 Unity 組件開發模式有太大的影響。

[CoronaSDK] TweenTrain, the transition helper class

上週新上架了一個 CoronaSDK transition API helper plugin,主要的目的是為了可以用 string 設定控制所有的動作巨集,方便動作資料預設。 一般來說,如果要使用 transition 達成物件跳躍後往右邊移動,一般語法如下: transition.to( target, {y = target.y-100, transition=easing.outSine, time = 400} ) transition.to( target, {y = target.y+100, transition=easing.inSine, time = 300, delay=400} ) transition.to( target, {x = target.x+300, transition=easing.inSine, time = 600, delay=700} ) 如果改用 tweentrain 就可以寫成: tweentrain.set( target, { "transition:to", {y="-100", transition="outSine", time=400} }, { "transition:to", {y="100", transition="inSine", time=300} }, { "transition:to", {x="300", transition="inSine", time=600} } ) tweentrain.start( target ) 是不是就簡單很多了呢? View the Document on Github Get it from Corona Plugin Store now. =D

[CoronaSDK] 多國語系支援

CoronaSDK 中取得 Android 與 iOS 語系方法並不相同,繁體與簡體取得名稱也不一樣,為了簡化兩系統的繁體與簡體語系支持,所以特別打包了一支函式來控制多國語設定,之前一直忘了分享出來也剛好很久沒更新 Blog 了...=D 使用方法很簡單: 將語系字串放在 locale/ 並以 strings.i18n(預設)與 strings_[ISO_639-1].i18n 繁體共用命名:zh_hant 簡體共用命名:zh_hans 語系字串資料採用 JSON 格式: locale/strings.i18n { "hello" : "Hello", "welcome" : "Welcome" } locale/strings_zh_hant.i18n { "welcome" : "歡迎" } 執行:Global function L( str: String ) -> String Usage: local i18n = require( "i18n" ) -- set device language -> locale/strings_[device setting].i18n i18n.setLocale() -- 假使目前語系為 i18n.language = "zh_hant" print( L("hello"), L("welcome"), L("no data")) -- Hello 歡迎 no data -- 動態更改支援語系到預設值 i18n.setLocale("") print( L("hello"), L("welcome"), L("no data")) -- Hello Welcome no data 備註:僅測試於 Android 與 iOS 系統,如其他裝置需要做修正的話,請自行 DIY。

[Lua] 簡易模擬 C# Delegate Type 行為

因為工作需求,準備開始學習 C#,這兩天研究一些公開的 Unity 原始碼發現 C# 有個 Delegate Type 很有意思,它可以利用 + 與 - 將需要搭配執行的 function 指派到委任者然後一起執行。如: //C#, d1 and d2 are functions allMethodsDelegate += d1; allMethodsDelegate += d2; allMethodsDelegate(); // d1(), d2() allMethodsDelegate -= d2; allMethodsDelegate(); // d1() 參考資料: 使用委派 (C# 程式設計手冊) Edit: 03, 08, 2015, 感謝 fb@shanyungyang 的提醒可以使用 Lua 的 metamethod 實作,為了達到屬性能往下傳,本來是打算採用 * / 但是又怕太混亂,最後就是由另外一個 meta2 來達到效果囉! ^^

[JSFL] Export MovieClip For TexturePacker

一般可分析 swf 的軟體都是針對 main timeline 做定位,所以直接從 Adobe Flash 的 Library 選單輸出的 MovieClip .swf 對其來說都是不合法的格式,如果一個 app 使用的動畫量並不多的話,將 MovieClip 轉拉到新文件重新輸出到不是太麻煩的一件事,但是...為了秉持懶人精神,當然是用 Adobe JavaScript API 來製作 ,傑克真的太神奇了,想要的格式都可以透過這個修改輸出...說實話,現在一堆手持裝置用 App 的編輯軟體,再如何也沒有 Flash 好用啊! Flash 大回春!!!!! 首先完成的是 Export MovieClip For TexturePacker: 可直接將 MovieClip 輸出成 TexturePacker 可以分析的 swf 格式,其他的可分析 swf 的 spritesheet 包裝軟體也可以使用。共有兩種輸出模式,你可以直接將主場景影格1中所有的 MovieClip 實體輸出,或者選擇你要輸出的 MovieClip 實體即可。

[TexturePacker] Batch converting images to rgba4444

因為需要大量將圖片轉檔成較省空間的 rgba4444 格式,研究了一下 TexturePacker command line tool , 只能說,TexturePacker 真的太好用了啊!!!! 轉檔邏輯為將指定檔案夾下所有的 .png 原圖命名加後綴 @2x 順便輸出 0.5 scale 的小圖,所以不需要兩種輸出的可以將最後兩段倍數輸出設定刪除。 --variant 1:@2x \ --variant 0.5:

[CoronaSDK] FLSprite: Flash Sprite Sheet Parser

由於手上有個案子會使用到大量的動畫,之前與客戶配合時為了方便客戶製作,素材都是採用 Flash 或 PhotoShop 輸出 TexturePacker 可打包格式做 sprite sheet 使用。不過為了打包需要輸出大量的 swf,雖然可以使用 Flash 製作 app 用動畫已經簡化的很多步驟,但是某程度上還是有點不便,於是簡單研究了一下 Flash CS6+ 的內建輸出 Sprite Sheet 功能,並分析其輸出的 JSON-Array 格式給 CoronaSDK 使用。 不過嚴格說起來, Flash 打包 Sprite Sheet 的算法並沒有很好,尤其是有些時候,判定整個 MovieClip 範圍的長寬會有錯誤,這時候就是調整一下 MovieClip 後重新打包,也許就會正確,但是其判定規則因為沒有多加研究,所以目前不明,請有發現的朋友們告知一下,謝謝。

[App] 1Sec. 一秒反應王 v1.1.0 (v1.1.1)

反正就是為了降低失智症發生機率所產生的遊戲...XD 認識我的朋友都知道,我的腦記憶體 80% 都是用在工作上,所以日常生活常常呈現一種失智的狀態,為了避免朋友們的擔心,所以花了些時間製作了一個 App 來幫助其他人與自己多活動腦部細胞,來吧!大家一起來運動...腦細胞!! 魔方網製作的影片介紹:(大感恩啦!!!!) 遊戲速播:(大感恩啦!!!!) 佛心評測: *重灌狂人: 超刺激!「1Sec.-一秒反應王」在一秒間腦力瞬間爆發(iPhone, Android) *app01: 只有1秒鐘!超刺激「1Sec.-一秒反應王」活化你的大腦! *魔方網: 《1Sec. 一秒反應王》考驗你的反應跟耐心 專訪: *魔方網: 絕不要變痴呆!《1Sec. 一秒反應王》專訪 Universal Version includes iOS and Android

[Corona SDK] 多螢幕支援定位函式

為方便 Universal version 的製作,在畫面配置上,我都是採用對應螢幕四方界線方式做定位如 top, left, right, bottom, centerX, centerY,這樣在多螢幕顯示時,物件的位置才能一致,以下是定位函式分享,提供給有需要的朋友使用。

[App] 國道計程收費速算器 v1.1.1

視覺化快選國道里程費用計算。 跟上個壽司比起來,這個App真的幸福太多了...短短不到一週含上架就完成了,如果您操作上發現問題的話,請不吝於告知,我會儘快處理的,謝謝。 佛心評測: * PunPop : 【國道計程收費速算器】算好錢才不會弄錯錢。 * 硬式要學 : 計程收費怎算?「國道計程收費速算器 」3 秒算給妳 Universal Version includes iOS and Android

[App] SushiMaster-壽司達人

這個大概是我做過最悲情的遊戲了吧.... Universal Version includes iOS and Android 佛心評測: * punapp.com : 【Sushi Master-壽司達人】可惡,想吃。 * Free4u FB粉絲團: 【APP推介】看著肚子都要餓了哦~~~!

[CoronaSDK] Coroutine 狀態機

最近手上的案子是個麻煩的遊戲,對於遊戲開發來說狀態機(state machine)是很重要的流程控制器,認真研究了一下 Lua 才發現原來它有 Coroutine(協同程序)這個有趣的功能(AS 系列是沒有這種東西的,請原諒我的無知),有興趣搞懂 Coroutine 的朋友可以參考: electronic_blue 的使用 Coroutine 改寫狀態機 ,它恰恰是以 CoronaSDK 為範本作教學,簡單參考了它的範例程式,打包成了 statemachine.lua 供 CoronaSDK 開發使用。