2014年10月28日 星期二

[Xcode] 錯誤:"dyld: Symbol not found: _swift_isaMask"

更新了Xcode 6.1之後,突然冒出了"dyld: Symbol not found: _swift_isaMask"的錯誤訊息,導致程式完全無法運行 (它崩潰...我更崩潰啦 ... Orz)

到處檢查、亂調後,並沒有改善,上網查查有沒有其他苦主,終於得到解答啦!趕緊上來記錄分享一下~

救世主文章:https://stackoverflow.com/questions/25957086/running-from-xcode-6-1-linker-errors/26130574#26130574?newreg=e20d94a294ef4a0aad1a00673d5b5ce5

照著第一個解答的快捷鍵,清了一下專案,真的就解決這個問題了!!!(那我之前花的時間是... ...搥地板)

不使用快捷鍵的話,也可以在Product標籤中看到Clean的選項~ (^_^)

2014年8月1日 星期五

[iOS] 調整系統音量(System Volume)_ Swift

因為有網友提出討論,所以就花了點時間研究了一下,順便練習把Objective-C的程式碼改寫成Swift,有需要的人可以參考一下喔!寫法上是有一些差異,但是應該看得懂,也比較好轉換回去Objective-C(因為比較熟咩~),如果是需要Objective-C的版本,可以參考「相關文章」,本篇文章較之前多了監聽實體按鍵的部分。

接下來,只要Copy & Past(喂!沒個正經)就可以獲得一個可互動、調整系統音量的ScrollBar,以及一個當使用者按下機身左側的音量實體按鈕時,會跟著顯示當前音量數值的Label(ScrollBar本身就會跟著動,但是有時候我們會有心想把它隱藏起來XD)

介面安置
不過在這之前,我們需要先在storyboard上安置一個view以及一個label,然後與你的程式碼作連結,如下。
// Storyboard上的一些介面元素連結
@IBOutlet var mpVolumeViewParentView: UIView
@IBOutlet var volumeLabel: UILabel
加入Framework
在專案中加入兩個Framework:MediaPlayer.Framework以及AVFoundation.framework,並且匯入檔案,如下。
import MediaPlayer
import AVFoundation
音樂準備
將要播放的音樂拉進專案中,記得將copy的那個選項勾起來。(在完整程式碼中標示出的紅字,麻煩請改成此音樂的檔名跟檔案格式~)

以上就完成準備動作,接下來就不多說,直接來看完整的程式碼囉!

完整程式碼
import UIKit
import MediaPlayer
import AVFoundation

class ViewController: UIViewController {
    // Storyboard上的一些介面元素連結
    @IBOutlet var mpVolumeViewParentView: UIView
    @IBOutlet var volumeLabel: UILabel

    let volumeView = MPVolumeView()
    var audioPlayer = AVAudioPlayer()
    let musicPlayerController = MPMusicPlayerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 把volumeView實體顯示在舞台上設置的UIView(mpVolumeViewParentView)裡面,並且把大小設置成與其相同
        mpVolumeViewParentView.backgroundColor = UIColor.clearColor();
        volumeView.frame = mpVolumeViewParentView.bounds
        mpVolumeViewParentView.addSubview(volumeView)
        
        // 播放音樂
        var music = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("UetoAya", ofType: "mp3"))
        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: music, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
        
        // 監聽音量實體按鈕
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "getInstanceVolumeButtonNotification:", name:"AVSystemController_SystemVolumeDidChangeNotification", object: nil)
    }
    
    // 接收到音量改變處理
    func getInstanceVolumeButtonNotification(notification: NSNotification) {
        
        var info = notification.userInfo
        var volume = info["AVSystemController_AudioVolumeNotificationParameter"] as NSValue
        println("音量改變:\(volume)")
        
        showCurrentVolumeText(volume)
    }
    
    // 顯示音量文字
    func showCurrentVolumeText(currentVolume:NSValue) {
        
        self.volumeLabel.text = "\(currentVolume)"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

運作起來長這樣


外部參考資料/相關連結:
  • 獲取音量實體按鍵事件的方法:link
  • 監聽案件音量:link
  • NSNotification相關的資料:link
相關文章:
  • [iOS] 調整系統音量(System Volume)_ Objective-C:link

2014年2月20日 星期四

《半路叛逃》閱讀心得

這本書應該是歸類在「商業行銷」類別,不是言情或勵志小說,但是我卻看到哭了出來......
不是因為裡面有什麼感人的故事情節,而是作者半路有太多的動機跟觀點都句句戳中了我。
作者在遊戲公司中任職多年,沒日沒夜的辛勞,卻付出在自己不認同的專案上。 這點,相信在許多大體制的公司中都有相同的情況,不管是因為內部政治的鬥爭、管理階層的決策判斷、公司發展方向等等的「人為限制」,我們往往做著違背自己理念的事情。 我們知道我們不是機器人,所以提出了自我意志,勇敢說不,但是一旦上述的人為限制壓迫下來,仍舊只能照作,因為你只是「員工」,大體制下的小螺絲釘。 在這樣的惡性循環之下,所有的理想跟熱情早就灰飛煙滅,最討厭聽到的話也變成了從上層丟下來的:

上層:「你的熱情呢?你做的這個東西我看不到你的熱情。」
您沒看到嗎?大概是因為......您正踩著呀?!

每當遇到這種情況,真的是滿腦子裡都像有一群網友不斷地丟著:「快點閃人吧!」「把辭職信丟在他臉上」「你怎麼還在那?」的跑馬燈不斷地閃過,數量之多,都已經快模糊了視線,掩蓋掉理智。但是作者沒有因此衝動的離開,而是開始挪出下班時間,嘗試開發出自己的潛能 ─ 獨立開發者的能力,有過經驗與自信之後,才很有Guts的提出了辭呈。

「為什麼要離職?」
「因為我想要做遊戲。」
「你現在不就是在作遊戲嗎?」
「我想做,我想做的遊戲。」

這是我在一開始被這本書強烈吸引的最大因素,強烈的熱情與理想,就在這裡引爆開了,離開與放下,就是最好的新開始!!當初提離職,也是有這樣有點像鬼打牆一般的對話,但是也因為這樣,你會更確信所處的環境是一個泥沼,你需要更努力地撐起來,離開它,踏上堅實的平面,你才能前行。

《半路叛逃》這本書是作者從最初決定成為獨立開發者製作遊戲相關app之後的經驗傳承,不管成功與不成功的專案,完整地分享了各個經驗所獲得的寶貴Know-how。我認為不論是否是製作遊戲app,這本書的內容都能提醒我們各個階段要注意的事情,更重要的是,感染作者的熱情,這是做任何事,要快樂要成功的最大要件 ─ 熱情。

相信各位熱血志士們在看了此書之後,內心也跟我一樣澎湃不已!
(應該不是因為當時我正在播著學友哥的音樂吧?!不然我怎麼會流淚呢! T_T ) 
________________________________________________ 
書名:《半路叛逃》ISBN:9789861993645 
作者:半路
出版社:PCuSER電腦人文化
出版日期:2012/09/27

主觀評價:★★★★★

2014年2月12日 星期三

[Xcode] 取得螢幕畫面尺寸 Device Screen Size

原本只有iPhone 4以下的幾種與iPod時,螢幕尺寸很單純,所以可能只需要知道現在使用的是iPhone/iPod或iPad,因為就只有這兩種尺寸。但是當iPhone 5出來之後,螢幕的比例被拉長了,開發者不可能任由設置的圖檔在不同的裝置中被裁切,甚至是壓縮變形,影響美觀,更會影響使用者的感受,因此,我們必須判別不同的螢幕尺寸,來做適當的應對。
可以透過UIScreen類別來處理,如下
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
/* 分解動作是這樣:
CGRect screenBound = [[UIScreen mainScreen] bounds];
CGSize screenSize = screenBound.size;
*/
CGFloat screenWidth = screenSize.width;
CGFloat screenHeight = screenSize.height;
screenSize的width與height屬性可以分別取得裝置螢幕尺寸的寬與高,但其實不管是iPhone 5或是iPhone Classic螢幕寬度尺寸是一樣的(320.0f),所以我們只要用螢幕高度去判斷目前的裝置即可,方法如下:
if (screenSize.height > 480.0f) 
{
   // iPhone 5
   NSLog(@"iPhone 5");
} 
else 
{
   // iPhone Classic
   NSLog(@"Not iPhone 5")
}
iPhone 5的螢幕高度會是568.0f,而iPhone Classic的是480.0f,所以只要偵測到的高度大於480.0f,便可得知目前使用的是iPhone 5系列裝置。將上述程式碼中的紅字部分替換成你需要執行的動作,就趕緊執行看看吧~

相關參考資料:
官方UIScreen Class Reference:link
How to detect if the device is an iPhone 5(包含判斷iPhone或iPad):link

2014年2月10日 星期一

[Xcode] 啟動畫面Launch Image

Launch Image (Default Image)是一個當系統啟動APP時,在APP運行的準備期間會暫時顯示的靜態圖片,等到APP正式開始運作時,這個圖片便會被移除。加入了這個畫面可以提供給使用者即時的回饋,讓他們知道已經確實啟動了APP。倘若開發者並未設置Launch Image,在按下APP icon後到正式載入軟體畫面之間,會有一小段時間是全黑或是全白畫面,這樣的畫面會讓使用者有不好的感受,所以建議要設置Launch Image提升使用者經驗喔!

接受的檔案格式為.png檔,請避免使用交錯式的.png檔(interlaced PNGs)。

以iPhone與iPod來說,需要準備三種尺寸的.png圖檔,並且檔名設置與下列相同:
尺寸1 (320×480)   檔名:Default.png
尺寸2 (640×960)   檔名:Default@2x.png
尺寸3 (640×1136) 檔名:Default-568@2x.png

設置方法很簡單,將準備好的三個圖檔匯入專案中,點選Images.xcassets這個檔案,選擇LaunchImage,並且將圖檔拖曳至對應的方框中即可完成設置囉!也可以自己另外再建置新的LaunchImage Set,按右鍵就可以看到選項,操作畫面如下圖:

相關參考資料:
官方iOS App Programming Guide - App Launch (Default) Images:link

[iOS] 調整系統音量(System Volume)_ Objective-C

尤其是遊戲與音樂類別的APP中,常會提供音量調整的介面,而這個音量大小很多時候都是牽動著系統音量的。曾經使用過一個音樂播放程式,有scroll bar可調整音樂音量,但是其音量的調整範圍卻是建立在系統音量之下,意思就是說,當今天系統音量是0.1時,用這個APP中內建的介面去調整音量,怎麼調都調不大聲,真正播放出來的聲音只介於0~0.1之間,由此來判斷,這個APP的音量控制,可能是使用AVAudioPlayer的volume屬性來做調整的。
如果想在APP中調整系統音量,方法有兩種,都是使用MediaPlayer.Framework,所以請記得在專案裡面加入喔:

方法1. 透過MPVolumeView
這個方法是透過MPVolumeView自動生成的scroller,讓使用者可以在APP中手動調整音量。
在.h標頭檔中將MPVolumeView.h匯入
#import <MediaPlayer/MPVolumeView.h>
.m實作檔中加入以下程式碼:
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
[volumeView setFrame:CGRectMake(130, 305, 166, 40)];
[self.view addSubview:volumeView];
將紅字的部分替換成你想要的位置與大小,執行看看,就會看到畫面中出現一個scroller。試著拉動看看,會有股無名火從心中生起,想罵我這個騙子,因為就只是個scroller呀!與系統音量一點關係也沒有,按了右側的實體按鍵,也沒看scroller有什麼改變。
大人真是冤枉呀!我也是照著努力查來的資訊這麼做的咩!也是堵在這久久無法前行,之後發現,還真要騙才行!要先騙編譯器說:『唉嘿~我這個APP現在可是要播聲音的呢!這個...音量的事情...要麻煩...(搓手)』,要先行告知,方法就是先在專案中匯入一個音樂檔,並且加入AVFoundation.framework,接著撰寫下列程式碼:
在.h標頭檔中將AVFoundation.h匯入
#import <AVFoundation/AVFoundation.h>
在.m實作檔中加入
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.mp3"]] error:NULL];
[audioPlayer prepareToPlay];
[audioPlayer stop];
將紅字替換成你的音樂檔名即可。執行看看,這次在按右側實體按鍵時,scroller也會跟著改變了!(如果本來就已經在播放影片跟音樂的話,上述的這一段應該就不需要了。)

方法2. 透過MPMusicPlayerController的volume屬性
其實volume這個屬性在iOS 7.0已經不宜使用了(deprecated),所以有許多做鬧鐘相關APP應用的開發者感到非常困擾,雖然硬是要用的話還是可以用啦!所以還是介紹一下。
請先在.h標頭檔中匯入MPMusicPlayerController.h,如下:
#import <MediaPlayer/MPMusicPlayerController.h>
至.m實作檔中,在需要程式自動調整系統音量的函式中加入下述程式碼:
MPMusicPlayerController *musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
musicPlayerController.volume = 1.0;
將紅字替換成你想要的音量大小,範圍為0.0~1.0之間,即可不透過使用者手動來改變系統音量,但在改變的同時,手機上會顯示出你調整的音量大小。
相關參考資料:
  • 關於volume屬性的官方文件
  • MPVolumeView之救人一命的大好文章:link
  • 官方Media Player Functions Reference:link
  • 官方MPVolumeView Class Reference:link
  • MPVolumeView Class教學:link
  • 監聽系統音量變化教學:link
2014/08/01 更新:
[iOS] 調整系統音量(System Volume)swift版本: link

2014年1月29日 星期三

[Xcode] 不使用web view,用safari打開網頁

[Xcode] 不使用web view,用safari打開網頁 在製作App時,我們有時候會需要讓使用者打開網頁,範例使用情境可能是連結到App的粉絲團,或是開發公司的官方網站等。
而這裡說的打開網頁不是在App裡面添加一個web view的介面元素來顯示網頁,而是另外啓動iPhone內建的瀏覽器safari來打開指定的網頁。
這時我們僅需要在程式碼中加入下列程式碼,並粗體黃字的部分,替換成需要的網址即可。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://yummylife11.blogspot.tw/"]];
那,要加在哪裡呢?
若是在按下按鈕後要開啟,那麼就直接加在按鈕的IBAction裡,如下:
- (IBAction)linkToMyBlog:(id)sender
{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://yummylife11.blogspot.tw/"]];
}
若是是按下表格中某一儲存格時開啟網頁,則範例如下:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //按下表格第5段、第1行時開啟網頁
    if ([indexPath section] == 4 && [indexPath row] == 0)
    { 
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://yummylife11.blogspot.tw/"]];
    }
}
網頁開啟後的結果如圖所示:

2014年1月27日 星期一

[Xcode] 在Static Cells表格上增加/改變accessoryType

[Xcode] 在Static Cells表格上增加/改變accessoryType 在使用動態表格(Dynamic Prototypes)時,我們常會在tableView:cellForRowAtIndexPath:方法裡添加程式碼來改變儲存格的AccessoryType屬性。但是若是使用靜態表格(Static Cells)便無法透過上述的方法來達成。
此時,我們可以透過透過tableView:willDisplayCell:forRowAtIndexPath:方法添加/改變AccessoryType,如下:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
未使用AccessoryType,以及使用後的執行結果如圖:
另外,AccessoryType有五種:
1. UITableViewCellAccessoryNone                           (預設,不使用Accessory)
2. UITableViewCellAccessoryDisclosureIndicator       (指向右側的灰色小箭頭)
4. UITableViewCellAccessoryDetailButton                (一個資訊的圖示)
3. UITableViewCellAccessoryDetailDisclosureButton  (綜合以上兩種)
5. UITableViewCellAccessoryCheckmark                   (核取的小勾勾)

若需要了解如何製作靜態表格,或是有相關的疑慮,可以參考看看「相關分享資訊」。
相關分享資訊:
[Xcode] 在一般的UI View Controller上建立Static Cells

2014年1月26日 星期日

[Xcode] 在一般的UI View Controller上建立Static Cells

Table View是一個經常使用的UI元件,大多書籍的教學都是在使用Dynamic Prototype,較少是Static Cells,所以感覺上後者似乎是簡單到不需要教學了 XD,但沒想到......我卻花了好久的時間在解決問題......(怒)為什麼一直不顯示呀?!Storyboard上看到的是幻覺嗎?

在茫茫網海裡面搜尋,整體而言有兩種解答:
1. 請改用TableViewController。
   (可我不想要用呀!我還有其他介面元素妻小要照顧......(跪))
2. 可以在UIViewController裡面放Container然後外連到一個TableViewController就可以了。
    (這個方法似乎符合我的需求......馬上來一試)

因為不太熟悉Container的用法,所以花了點時間,終於看到表格正常的顯示在手機上啦!趕緊分享出來,希望可以幫到很多網路上迷途的小羊兒們。

步驟一、 任何一個程式範本都可以,我們會使用Storyboard (這個分享使用「Single View Application」)。

步驟二、 在Storyboard的元件庫裡找到Container View。
步驟三、 拖曳Container View到你欲放置Static Cells的View上,如下圖。
步驟四、 刪除原本的Container所連接的View Controller,拖曳一Table View Controller至附近。在Container上按著右鍵至此Table View Controller上,放開,選擇embed(嵌入),見下圖,即完成連結,會發現被連結的視圖尺寸改變成Container
步驟五、 在屬性面板中將Table View的內容改成Static Cells,接著就可以自行設定需要的表格內容,作完這些就可以試著跑跑看模擬器了。雖然可以看到畫面了,但是我們目前還無法控制跟截取這個View Controller的資訊,我們必須連結我們自訂的Class。

步驟六、 新增Objective-C Class,是UITableViewController的Subclass,並且將Table View Controller的Class指向此檔案。如果這個時候試著執行模擬器,就會發現有警告訊息出現,而且Container裡面會沒有顯示任何東西(怎麼有種越用越糟的感覺 XD)。
步驟七、 莫心慌,要解決這個問題很簡單,從谷歌大神以及警告訊息中可得知,由於所製作的表格非動態顯示,所以我們不能實作以下三個方法,必須在我們剛剛建立的class中之.m實作檔裡,將它們註解掉或是刪掉,即可正常運行:
// 需刪除或註解掉的三個方法
- (NSInteger)numberOfSectionsInTableView:
- (NSInteger)tableView: numberOfRowsInSection:
- (UITableViewCell *)tableView: cellForRowAtIndexPath:
測試的運行結果如下:

2014年1月15日 星期三

《任天堂創造“驚奇”的方程式》閱讀心得

任天堂是什麼公司呢?岩田笑著這麼說:「是創造笑容的企業,我認為那應該就是娛樂產業應有的模樣吧」。
初閱讀時,其實有些煩躁,相對於數據的彰顯,我較喜歡看到實際運作的故事與改變,但是作者在一開始對於任天堂豐功偉業的鋪陳採用了一連串的數據,看得有些混亂。不過很快地就像在看小說一樣,一段段的研發故事娓娓道來。

整本書的架構是從家用型遊戲主機吃了大敗仗,市場大餅拱手讓給SONY,在失勢後,專注思考遊戲的本質,關心玩家與遊戲環境,製作創新產品讓主機的發展回歸到遊戲性的重心上,以及新的遊戲體驗——Wii與DS,除了遊戲機的成功外,任天堂最大的目標——讓更多人玩遊戲——也因此達成了。在這些故事過程中也穿插許多任天堂重要人物的貢獻與訪談,包含:岩田聰、宮本茂、橫井軍平與內山溥等。然而,蘋果電腦的iPhone帶起了智慧型手機的革命瘋潮,APP市場中遊戲占了大宗,不管是遊戲的人口擴大、遊戲製作人口擴大、隨身攜帶等目標都重複並且被實踐得更透徹了,面對這樣的威脅,任天堂又會再用什麼樣的方式捲土重來呢?本書運用像序章預告一般的結尾,讓人引頸期盼任天堂的下一步動作。

讓我印象最深刻的內容有下面四點:

一、不能讓媽媽討厭的家用型遊戲主機

這已經不只是以「使用者中心」的設計思考了,連與使用者的關係人都一併考量進去了,畢竟許多玩家能不能玩遊戲機是掌控在媽媽手上的(笑)。先從如何讓媽媽不要討厭遊戲主機開始思考,所以這時可能就要思考它的大小、好不好收納等等問題,之後才衍伸到,讓家人也能輕鬆入門的遊戲機。這本書看下來,會發現任天堂許多思考的點都是這樣「直白」的議題或目標,像是:為什麼人們不接觸遊戲了呢?不想讓人感到害怕或討厭呢!「帶著DS真是太好了」大戰等等,而不是要提升硬體規格或技術。
一股腦的爲使用者著想的體貼,有時甚至也沒有先去想如何藉新構想圖利,對使用者/玩家好的事情,先做了再說,其他附帶的好處,之後再考慮囉!

二、PDA與黑膠帶就是DS的原型

在創造一個新的互動方式時,會先試做原型(prototype)來模擬與使用看看是否真的符合概念,以及測試使用性等等,也是一個很好的溝通工具。讓我比較驚訝的是,雙螢幕掌機DS的原型竟然是一個可以使用觸控筆操作的PDA(當時很熱門的硬體),在螢幕中間貼了一條黑色膠帶隔開,裡面放了一個很簡單的軟體——在螢幕下面的區塊戳瑪利歐,瑪利歐就會跳起來。有時候我們會把原型做得太過複雜跟精緻,這樣做可能一方面體驗/實驗出來的東西更準確,但是其實大多時候會模糊了真正該讓人體驗的最純粹的焦點,所以必要的時候要放下設計師對於完美的堅持~XD。

三、橫井軍平的「洗練技術的水平思考」

像任天堂這樣的遊戲商應該也可以算是科技產業吧?運用科技創造讓使用者愉悅的產品。談到科技的話,就會讓人直覺認為應該是要求新求變,其技術要像沒有終點般地一直突破創新,任天堂在Wii開發之前,的確有段時日是以這樣的想法在製作產品,不斷的提升規格,但是那是玩家想要的嗎?任天堂把自己定位在「娛樂產業」,他們致力於想要讓玩家有怎麼樣的新遊戲體驗,以及如何讓更多人體驗,秉持著「原本所謂的娛樂,只要能高明地運用洗練的技術令人們感到驚訝就好。是不是最新科技無所謂,人們會不會驚訝才是問題。」(岩田)的想法,善用了許多早已成熟的技術製作令人驚豔的遊戲相關產品,橫井軍平就是這方面的能者,例如:「光線槍」-反轉太陽能板作為能源的既定概念,搖身一變成了感應器這樣的點子,槍上有LED燈,目標物上則裝有太陽能板,一旦太陽能板接收到槍上的光線,目標物則會作出回饋。

四、維修換新的機子上,卻妥善保留著玩家的回憶

最近在關注「服務設計」這個領域,所以對於書上這個售後服務的例子非常有感觸,任天堂非常清楚自己的產品對於使用者而言是什麼角色,「對小孩子來說,自己的玩具是被灌注了喜愛心意的物品,所以並非只要還一個新的就能解決問題」。大家應該都有過在購買的產品上,自己添加一些物件來彰顯個人化,又或者是一種占地為王的表現?像是在手機上掛吊飾、在筆電上貼上自己的創意貼紙,在筆上貼名字之類的,但是這些東西壞掉之後呢?任天堂的維修服務,今天機器若可以幫忙修,就會用修的方式(比較耗成本),若不能修必須換新時,他們還會小心翼翼地將你在機台上裝飾的貼紙撕下,並貼在新機子相同的位置上,若有貼保護貼了,也會一併私下奉還,這樣貼心的舉動,並不是個案,將回憶轉移,確保使用者能夠以相同的愛對待新的機子。
________________________________________________
書名:《任天堂創造“驚奇”的方程式》ISBN:9789862568620
作者:井上 理 (Inoue Osamu)
出版社:青文
出版日期:2011/06/25


主觀評價:★★★★★(大推)
就心得而言,我是不是太囉唆了呢?Orz