<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>iPhone Coding Notes</title>
	<atom:link href="http://bonjouryentinglai.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://bonjouryentinglai.wordpress.com</link>
	<description>～我的iPhone程式筆記～</description>
	<lastBuildDate>Tue, 20 Dec 2011 06:40:24 +0000</lastBuildDate>
	<language>zh-tw</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='bonjouryentinglai.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>iPhone Coding Notes</title>
		<link>http://bonjouryentinglai.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://bonjouryentinglai.wordpress.com/osd.xml" title="iPhone Coding Notes" />
	<atom:link rel='hub' href='http://bonjouryentinglai.wordpress.com/?pushpress=hub'/>
		<item>
		<title>號外號外：ARSABALLOON最新力作 「瘋節慶」</title>
		<link>http://bonjouryentinglai.wordpress.com/2011/10/03/%e8%99%9f%e5%a4%96%e8%99%9f%e5%a4%96%ef%bc%9aarsaballoon%e6%9c%80%e6%96%b0%e5%8a%9b%e4%bd%9c-%e3%80%8c%e7%98%8b%e7%af%80%e6%85%b6%e3%80%8d/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2011/10/03/%e8%99%9f%e5%a4%96%e8%99%9f%e5%a4%96%ef%bc%9aarsaballoon%e6%9c%80%e6%96%b0%e5%8a%9b%e4%bd%9c-%e3%80%8c%e7%98%8b%e7%af%80%e6%85%b6%e3%80%8d/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 13:27:38 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[AppStore]]></category>
		<category><![CDATA[coronaSDK]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=823</guid>
		<description><![CDATA[睽違半年，小弟我又回來了。這次不是教學文，是來宣傳的。 前陣子和朋友組了一個阿薩布魯的團隊－ARSABALLOON，對，隊名唸起來就是阿薩布魯。裡面的成員除了我和我朋友外，還有三位師大的同學，他們負責對App的畫面進行美化。 今天要來介紹的是團隊的第一個作品，「瘋節慶」 「瘋節慶」是一個以傳統中國節慶為主題的遊戲合集, 希望透過此App將中國傳統節慶之典故與節慶特色介紹給欲了解中國文化的朋友, 並且結合目前大家熟悉的遊戲, 融入濃厚的中國風與中國節慶的遊戲元素, 讓玩家深入體會並參與中國慶典。 可以觀看以下介紹短片： 不管你是iOS還是Android系統都可以下載喔。而且是免費的喔，請大家告訴大家，多多下載。 iOS系統 Android系統 或者直接搜尋「瘋節慶」or「CrazyFestival」都可以找的到喔。未來此App將會長期持續更新，會有英文版本以及持續加入新的節慶遊戲，以及台灣在地活動，歡迎愛台灣的大家，多多把這個App推薦給你身邊的朋友，或者外國朋友，讓全世界看到台灣文化。 如果想了解更多訊息或提供建議，歡迎到我們的粉絲團或官網留言，我們會盡快回覆您。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=823&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>睽違半年，小弟我又回來了。這次不是教學文，是來宣傳的。</p>
<p>前陣子和<a href="http://big-coronasdklua.blogspot.com/" target="_blank">朋友</a>組了一個阿薩布魯的團隊－ARSABALLOON，對，隊名唸起來就是阿薩布魯。裡面的成員除了我和我朋友外，還有三位師大的同學，他們負責對App的畫面進行美化。</p>
<p>今天要來介紹的是團隊的第一個作品，「瘋節慶」</p>
<blockquote><p>「瘋節慶」是一個以傳統中國節慶為主題的遊戲合集, 希望透過此App將中國傳統節慶之典故與節慶特色介紹給欲了解中國文化的朋友, 並且結合目前大家熟悉的遊戲, 融入濃厚的中國風與中國節慶的遊戲元素, 讓玩家深入體會並參與中國慶典。</p></blockquote>
<p>可以觀看以下介紹短片：</p>
<span style="text-align:center; display: block;"><a href="http://bonjouryentinglai.wordpress.com/2011/10/03/%e8%99%9f%e5%a4%96%e8%99%9f%e5%a4%96%ef%bc%9aarsaballoon%e6%9c%80%e6%96%b0%e5%8a%9b%e4%bd%9c-%e3%80%8c%e7%98%8b%e7%af%80%e6%85%b6%e3%80%8d/"><img src="http://img.youtube.com/vi/MbDuOFd9HLY/2.jpg" alt="" /></a></span>
<p>不管你是iOS還是Android系統都可以下載喔。而且是免費的喔，請大家告訴大家，多多下載。</p>
<p><a href="http://itunes.apple.com/tw/app/crazy-festival/id467586771?mt=8">iOS系統</a><br />
<a href="https://market.android.com/details?id=com.arsaballoon.crazyfestival&amp;feature=search_result">Android系統</a></p>
<p>或者直接搜尋「瘋節慶」or「CrazyFestival」都可以找的到喔。未來此App將會長期持續更新，會有英文版本以及持續加入新的節慶遊戲，以及台灣在地活動，歡迎愛台灣的大家，多多把這個App推薦給你身邊的朋友，或者外國朋友，讓全世界看到台灣文化。</p>
<p>如果想了解更多訊息或提供建議，歡迎到我們的<a href="http://www.facebook.com/pages/ARSABALLOON/107094769397396" target="_blank">粉絲團</a>或<a href="http://blog.arsaballoon.com/" target="_blank">官網</a>留言，我們會盡快回覆您。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/823/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/823/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/823/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/823/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/823/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/823/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/823/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/823/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=823&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2011/10/03/%e8%99%9f%e5%a4%96%e8%99%9f%e5%a4%96%ef%bc%9aarsaballoon%e6%9c%80%e6%96%b0%e5%8a%9b%e4%bd%9c-%e3%80%8c%e7%98%8b%e7%af%80%e6%85%b6%e3%80%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>
	</item>
		<item>
		<title>FMDB：我的SQLite救星</title>
		<link>http://bonjouryentinglai.wordpress.com/2011/03/20/fmdb%ef%bc%9a%e6%88%91%e7%9a%84sqlite%e6%95%91%e6%98%9f/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2011/03/20/fmdb%ef%bc%9a%e6%88%91%e7%9a%84sqlite%e6%95%91%e6%98%9f/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 15:03:33 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[iPhoneSDK]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=794</guid>
		<description><![CDATA[好滴～離上次發文又給他隔了三個月，為什麼咧？？因為林盃我很忙，這三個月我跑去訂婚、結婚、歸寧外加峇里島蜜月，所以部落格就這麼給他放著了。以為這裡不會再更新的朋友們～快回來哦～有新文章了。 這次要分享的是在iOS中使用SQLite。其實我對SQLite一點概念都沒有，因為一直沒有機會使用它。有時候突然想到，就會找幾本手邊的工具書或在網路上找尋在iOS中使用SQLite的教學。但是每次學，每次失敗，讓我愈來愈討厭SQLite　囧。直到有一次在網路上發現了FMDB這個東西，才發現不是SQLite很難學，而是SQLite的C API對初學者來說實在太麻煩太瑣碎，難度太高，難怪我怎麼學都學不會。FMDB說穿了其實只是把C API包裝成簡單易用的Objective-C物件。不過這對我這個SQLite初學者來說，可是大大減低了上手的難度。有了FMDB，寫程式時只要專心在SQLite的語法上，而不用去理那堆有看沒有懂的C API，實在是件快樂的事情。 廢話不多說，先來安裝FMDB吧！ 首先到這裡下載FMDB的source code，接著在解開的檔案裡，把src資料夾下除了fmdb.m的檔案加入到自己的iOS專案，最後在專案中加入libsqlite3.dylib這個函式庫就可以了。啥？有人問為什麼不用加入fmdb.m？簡單講，這個檔案是fmdb的使用說明。裡面的註解清楚，範例又簡單，如果有興趣，直接看fmdb.m，大概就會用fmdb了。 以下介紹幾個常用的指令，分享給大家： －開啟／關閉資料庫 使用資料庫的第一件事，就是建立一個資料庫。要注意的是，在iOS環境下，只有document directory 是可以進行讀寫的。在寫程式時用的那個Resource資料夾底下的東西都是read-only。因此，建立的資料庫要放在document 資料夾下。方法如下： NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"MyDatabase.db"]; FMDatabase *db = [FMDatabase databaseWithPath:dbPath] ; if (![db open]) { NSLog(@“Could not open db.”); return ; } 通常這段程式碼會放在UIViewController中viewDidLoad的函式裡。指定路徑後，用[FMDatabase databaseWithPath:]回傳一個FMDatabase物件，如果該路徑本來沒有檔案，會新增檔案，不然會開啟舊檔。最後呼叫[db open]可以開啟該資料庫檔案，[db close]則關閉該檔案。 －建立table 如果是新建的資料庫檔，一開始是沒有table的。建立table的方式很簡單： [db executeUpdate:@"CREATE [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=794&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>好滴～離上次發文又給他隔了三個月，為什麼咧？？因為林盃我很忙，這三個月我跑去訂婚、結婚、歸寧外加峇里島蜜月，所以部落格就這麼給他放著了。以為這裡不會再更新的朋友們～快回來哦～有新文章了。</p>
<p>這次要分享的是在iOS中使用SQLite。其實我對SQLite一點概念都沒有，因為一直沒有機會使用它。有時候突然想到，就會找幾本手邊的工具書或在網路上找尋在iOS中使用SQLite的教學。但是每次學，每次失敗，讓我愈來愈討厭SQLite　囧。直到有一次在網路上發現了FMDB這個東西，才發現不是SQLite很難學，而是SQLite的C API對初學者來說實在太麻煩太瑣碎，難度太高，難怪我怎麼學都學不會。FMDB說穿了其實只是把C API包裝成簡單易用的Objective-C物件。不過這對我這個SQLite初學者來說，可是大大減低了上手的難度。有了FMDB，寫程式時只要專心在SQLite的語法上，而不用去理那堆有看沒有懂的C API，實在是件快樂的事情。</p>
<p>廢話不多說，先來安裝FMDB吧！</p>
<p>首先到<a href="https://github.com/ccgus/fmdb" target="_blank">這裡</a>下載FMDB的source code，接著在解開的檔案裡，把src資料夾下除了fmdb.m的檔案加入到自己的iOS專案，最後在專案中加入libsqlite3.dylib這個函式庫就可以了。啥？有人問為什麼不用加入fmdb.m？簡單講，這個檔案是fmdb的使用說明。裡面的註解清楚，範例又簡單，如果有興趣，直接看fmdb.m，大概就會用fmdb了。</p>
<p><span id="more-794"></span></p>
<p>以下介紹幾個常用的指令，分享給大家：</p>
<p><strong>－開啟／關閉資料庫</strong></p>
<p>使用資料庫的第一件事，就是建立一個資料庫。要注意的是，在iOS環境下，只有document directory 是可以進行讀寫的。在寫程式時用的那個Resource資料夾底下的東西都是read-only。因此，建立的資料庫要放在document 資料夾下。方法如下：</p>
<blockquote><p>NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);</p>
<p>NSString *documentDirectory = [paths objectAtIndex:0];</p>
<p>NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"MyDatabase.db"];</p>
<p>FMDatabase</p>
<p>*db = [FMDatabase databaseWithPath:dbPath] ;</p>
<p>if (![db open]) {</p>
<p style="padding-left:30px;">NSLog(@“Could not open db.”);</p>
<p style="padding-left:30px;">return ;</p>
<p>}</p></blockquote>
<p>通常這段程式碼會放在UIViewController中viewDidLoad的函式裡。指定路徑後，用[FMDatabase databaseWithPath:]回傳一個FMDatabase物件，如果該路徑本來沒有檔案，會新增檔案，不然會開啟舊檔。最後呼叫[db open]可以開啟該資料庫檔案，[db close]則關閉該檔案。</p>
<p><strong>－建立table</strong></p>
<p>如果是新建的資料庫檔，一開始是沒有table的。建立table的方式很簡單：</p>
<blockquote><p>[db executeUpdate:@"CREATE TABLE PersonList (Name text, Age integer, Sex integer, Phone text, Address text, Photo blob)"];</p></blockquote>
<p>這是FMDB裡很常用的指令，[<em>FMDatabase_object executeUpdate:]後面用NSString塞入SQLite語法，就解決了。因為這篇主要是在講FMDB，所以SQLite的語法就不多說了，上述程式碼建立了一個名為PersonList的table，裡面有姓名、年齡、性別、電話、地址和照片。（嗯&#8230;.很範例的一個table）</em></p>
<p><strong>－插入資料</strong></p>
<p>插入資料跟前面一樣，用executeUpdate後面加語法就可以了。比較不同的是，因為插入的資料會跟Objective-C的變數有關，所以在string裡使用?號來代表這些變數。</p>
<blockquote><p>[db executeUpdate:@"INSERT INTO PersonList (Name, Age, Sex, Phone, Address, Photo) VALUES (?,?,?,?,?,?)",</p>
<p>@"Jone", [NSNumber numberWithInt:20], [NSNumber numberWithInt:0], @“091234567”, @“Taiwan, R.O.C”, [NSData dataWithContentsOfFile: <em>filepath</em>]];</p></blockquote>
<p>其中，在SQLite中的text對應到的是NSString，integer對應NSNumber，blob則是NSData。該做的轉換FMDB都做好了，只要了解SQLite語法，應該沒有什麼問題才是。</p>
<p><strong>－更新資料</strong></p>
<p>太簡單了，不想講，請看範例：</p>
<blockquote><p>[db executeUpdate:@"UPDATE PersonList SET Age = ? WHERE Name = ?",[NSNumber numberWithInt:30],@“John”];</p></blockquote>
<p><strong>－取得資料</strong></p>
<p>取得特定的資料，則需使用FMResultSet物件接收傳回的內容：</p>
<blockquote><p>FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList"];</p>
<p>while ([rs next]) {</p>
<p style="padding-left:30px;">NSString *name = [rs stringForColumn:@"Name"];</p>
<p style="padding-left:30px;">int age = [rs intForColumn:@"Age"];</p>
<p>}</p>
<p>[rs close];</p></blockquote>
<p>用[rs next]可以輪詢query回來的資料，每一次的next可以得到一個row裡對應的數值，並用[rs stringForColumn:]或[rs intForColumn:]等方法把值轉成Object-C的型態。取用完資料後則用[rs close]把結果關閉。</p>
<p><strong>－快速取得資料</strong></p>
<p>在有些時候，只會query某一個row裡特定的一個數值（比方只是要找John的年齡），FMDB提供了幾個比較簡便的方法。這些方法定義在FMDatabaseAdditions.h，如果要使用，記得先import進來。</p>
<blockquote><p>//找地址</p>
<p>NSString *address = [db stringForQuery:@"SELECT Address FROM PersonList WHERE Name = ?",@"John”];</p>
<p>//找年齡</p>
<p>int age = [db intForQuery:@"SELECT Age FROM PersonList WHERE Name = ?",@"John”];</p></blockquote>
<p>大概就是這樣囉～對於在Objective-C上使用SQLite有困難的朋友，看完之後是不是覺得一切都變的很簡單呢？趕快去試試吧～</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/794/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/794/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=794&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2011/03/20/fmdb%ef%bc%9a%e6%88%91%e7%9a%84sqlite%e6%95%91%e6%98%9f/feed/</wfw:commentRss>
		<slash:comments>54</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>
	</item>
		<item>
		<title>三個Xcode小技巧</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/12/26/%e4%b8%89%e5%80%8bxcode%e5%b0%8f%e6%8a%80%e5%b7%a7/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/12/26/%e4%b8%89%e5%80%8bxcode%e5%b0%8f%e6%8a%80%e5%b7%a7/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 03:14:03 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[其他開發相關知識]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=743</guid>
		<description><![CDATA[要開發iPhone應用程式，第一關要面對的就是mac專用的IDE開發工具：Xcode。就我目前使用的感想，除了沒有支援中文，以及偶爾會發生需要重開才能解決的小bug外，Xcode還算是一個稱職的開發環境。 所謂工欲善其事，必先利其器。對Xcode愈熟悉，在開發iPhone程式時也將愈有效率。以下就來介紹幾個我個人覺得很基本也很重要的小技巧。 &#160; 1.Method自動補完 這是一個簡單實用的小功能。Objective-C是一個物件導向為主的程式語言，而物件離不開的就是一堆的方法或函式呼叫。有時候方法太多，指令太長，不是忘了正確的名稱就是名稱太長不想打字。這時候就可以利用Xcode內建的功能把對應的函式方法找出來，並自動填寫。 舉個例，在Cocos2d裡有個CCJumpTo的Class，但後面接什麼函式方法忘了，這時只要在要鍵入方法的地方按一下ESC鍵（要跟CCJumpTo空一格），Xcode就會跳出視窗讓你選擇。 用上下鍵選完所要的方法後，按下enter，Xcode就會自動幫你補齊，參數的地方也會提示所需填入的種類，還不錯吧！ &#160; 2.分類函式方法列表 在Xcode的程式碼編輯視窗上方有兩個下拉選單，左邊選單是用來選擇現在要編輯的程式碼，右邊的選單則是顯示這個程式碼所擁有的函式。 如果這個程式不大，右邊的選單列是可以用來快速跳至對應的函式。 但是，如果程式很大，裡面的函式有幾十到上百個，要在茫茫函式裡找到你要的函式，那就需要一點功夫了。還好Xcode有個小功能可以幫你把這個列表再進一步的分類。 做個簡單的示範。以上圖來說，這個程式碼裡有五個函式，先在程式碼裡找到+scene函式，然後在它上面加入 #pragma mark - #pragma mark init method 接著找到-dealloc函式，在上面加入 #pragma mark - #pragma mark other method 好了以後存檔，再看一次列表就會看到表上多了兩行比較明顯的標記。 新手在看一些範例程式時，常會在程式碼裡看到#pragma的符號，主要的用途就是在這裡。在Xcode中#pragma後面的文字和符號不會被編譯，而是被用來顯示在函式列表用的，所以如果想惡搞的話&#8230;. &#160; 3.管理Resources資料夾 最後一個要介紹的，是關於Resources資料夾的檔案管理。這對遊戲開發尤其重要。在一般書籍或網路的教學範例上（包含我寫的範例），如果遇到需要用圖或音效等多媒體檔案時，範例都會說，把檔案拖進Resources資料夾，然後選』Copy items into destination group&#8217;s folder』和』Recursively create groups for any added folders』。 如果專案小，多媒體檔案不多，這樣子做是沒什麼關係。但是開發遊戲時，不但圖檔多，音效檔也多，如果這堆檔案都照上面的做法去加到專案裡，在Finder下這堆檔案就會凌亂的被放在專案資料夾下，完全沒有組織，而且檔名相同的還不能重複出現（因為其實他們都在同一資料夾下）。有人會說Xcode裡有group功能可以把檔案分類， 嗯&#8230;.老實說，這功能只限在Xcode有效。打開Finder到專案資料夾下看，檔案還是一團亂。到底該怎麼做才好？ 想想實際在開發時的情形，美工人員會把圖檔分類後放到』Image』資料夾，音效人員會把一堆音效檔放到』Audio』資料夾。當我們拿到這兩個資料夾時，希望讓它照著資料夾結構放到專案裡。最前面的步驟和上述一樣，把整個資料夾拖到Resources資料夾下，但在跳出的詢問視窗，下方的』Recursively create groups for any added folders』要改成』Create Folder References [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=743&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><img class="aligncenter" title="xcode" src="http://www.24100.net/wp-content/uploads/2010/06/xcode.png" alt="" width="330" height="330" /></p>
<p>要開發iPhone應用程式，第一關要面對的就是mac專用的IDE開發工具：Xcode。就我目前使用的感想，除了沒有支援中文，以及偶爾會發生需要重開才能解決的小bug外，Xcode還算是一個稱職的開發環境。</p>
<p>所謂工欲善其事，必先利其器。對Xcode愈熟悉，在開發iPhone程式時也將愈有效率。以下就來介紹幾個我個人覺得很基本也很重要的小技巧。</p>
<p>&nbsp;</p>
<p><strong>1.Method自動補完</strong></p>
<p>這是一個簡單實用的小功能。Objective-C是一個物件導向為主的程式語言，而物件離不開的就是一堆的方法或函式呼叫。有時候方法太多，指令太長，不是忘了正確的名稱就是名稱太長不想打字。這時候就可以利用Xcode內建的功能把對應的函式方法找出來，並自動填寫。<span id="more-743"></span></p>
<p>舉個例，在Cocos2d裡有個CCJumpTo的Class，但後面接什麼函式方法忘了，這時只要在要鍵入方法的地方按一下ESC鍵（要跟CCJumpTo空一格），Xcode就會跳出視窗讓你選擇。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88ae58d8811-49-321.png"><img class="aligncenter size-full wp-image-751" title="螢幕快照 2010-12-23 上午11.49.32" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88ae58d8811-49-321.png?w=630" alt=""   /></a></p>
<p>用上下鍵選完所要的方法後，按下enter，Xcode就會自動幫你補齊，參數的地方也會提示所需填入的種類，還不錯吧！</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88ae58d8811-54-12.png"><img class="aligncenter size-full wp-image-752" title="螢幕快照 2010-12-23 上午11.54.12" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88ae58d8811-54-12.png?w=630" alt=""   /></a></p>
<p>&nbsp;</p>
<p><strong>2.分類函式方法列表</strong></p>
<p>在Xcode的程式碼編輯視窗上方有兩個下拉選單，左邊選單是用來選擇現在要編輯的程式碼，右邊的選單則是顯示這個程式碼所擁有的函式。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/method-selector.png"><img class="aligncenter size-full wp-image-755" title="method selector" src="http://bonjouryentinglai.files.wordpress.com/2010/12/method-selector.png?w=630" alt=""   /></a>如果這個程式不大，右邊的選單列是可以用來快速跳至對應的函式。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d8812-24-38.png"><img class="aligncenter size-full wp-image-756" title="螢幕快照 2010-12-23 下午12.24.38" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d8812-24-38.png?w=630" alt=""   /></a>但是，如果程式很大，裡面的函式有幾十到上百個，要在茫茫函式裡找到你要的函式，那就需要一點功夫了。還好Xcode有個小功能可以幫你把這個列表再進一步的分類。</p>
<p>做個簡單的示範。以上圖來說，這個程式碼裡有五個函式，先在程式碼裡找到+scene函式，然後在它上面加入</p>
<blockquote><p>#pragma mark -</p>
<p>#pragma mark init method</p></blockquote>
<p>接著找到-dealloc函式，在上面加入</p>
<blockquote><p>#pragma mark -</p>
<p>#pragma mark other method</p></blockquote>
<p>好了以後存檔，再看一次列表就會看到表上多了兩行比較明顯的標記。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-18-26.png"><img class="aligncenter size-full wp-image-757" title="螢幕快照 2010-12-23 下午3.18.26" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-18-26.png?w=630" alt=""   /></a>新手在看一些範例程式時，常會在程式碼裡看到#pragma的符號，主要的用途就是在這裡。在Xcode中#pragma後面的文字和符號不會被編譯，而是被用來顯示在函式列表用的，所以如果想惡搞的話&#8230;.</p>
<div id="attachment_759" class="wp-caption aligncenter" style="width: 266px"><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-35-23.png"><img class="size-full wp-image-759" title="螢幕快照 2010-12-23 下午3.35.23" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-35-23.png?w=630" alt=""   /></a><p class="wp-caption-text">我為什麼要花時間幹這種事...囧</p></div>
<p>&nbsp;</p>
<p><strong>3.管理Resources資料夾</strong></p>
<p>最後一個要介紹的，是關於Resources資料夾的檔案管理。這對遊戲開發尤其重要。在一般書籍或網路的教學範例上（包含我寫的範例），如果遇到需要用圖或音效等多媒體檔案時，範例都會說，把檔案拖進Resources資料夾，然後選』Copy items into destination group&#8217;s folder』和』Recursively create groups for any added folders』。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-53-50.png"><img class="aligncenter size-full wp-image-773" title="螢幕快照 2010-12-23 下午3.53.50" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-53-50.png?w=630" alt=""   /></a></p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-53-50.png"></a>如果專案小，多媒體檔案不多，這樣子做是沒什麼關係。但是開發遊戲時，不但圖檔多，音效檔也多，如果這堆檔案都照上面的做法去加到專案裡，在Finder下這堆檔案就會凌亂的被放在專案資料夾下，完全沒有組織，而且檔名相同的還不能重複出現（因為其實他們都在同一資料夾下）。有人會說Xcode裡有group功能可以把檔案分類，</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-59-32.png"><img class="aligncenter size-full wp-image-774" title="螢幕快照 2010-12-23 下午3.59.32" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-59-32.png?w=630" alt=""   /></a></p>
<p>嗯&#8230;.老實說，這功能只限在Xcode有效。打開Finder到專案資料夾下看，檔案還是一團亂。到底該怎麼做才好？</p>
<p>想想實際在開發時的情形，美工人員會把圖檔分類後放到』Image』資料夾，音效人員會把一堆音效檔放到』Audio』資料夾。當我們拿到這兩個資料夾時，希望讓它照著資料夾結構放到專案裡。最前面的步驟和上述一樣，把整個資料夾拖到Resources資料夾下，但在跳出的詢問視窗，下方的』Recursively create groups for any added folders』要改成』Create Folder References for any added folders』，如此一來，整個資料夾就會依照原本的結構階層進到專案資料夾內。（變成藍色的資料夾）</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d884-26-08.png"><img class="aligncenter size-full wp-image-776" title="螢幕快照 2010-12-23 下午4.26.08" src="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d884-26-08.png?w=630" alt=""   /></a></p>
<p>另外，如果想要有更好的檔案管理，在Finder上，應該把圖案、音效、程式碼完全獨立開來。當把圖案資料夾拖到Resources時，在詢問視窗上不要把copy items的欄位打勾。這樣子Xcode就只會把這個放圖案的資料夾當成連結，而不直接複製一份。這樣的好處是，這些有連結的多媒體資料夾平常就跟一般的資料夾一樣，有新的圖案或音效就用Finder往那裡丟。而當開啟Xcode專案的時候，那些新的檔案就會一併被更新。</p>
<p>不過採用上述方法管理resources的時候，要注意檔案路徑已經不同了。過去檔案是放在</p>
<blockquote><p>[[NSBundle mainBundle] resourcePath]</p></blockquote>
<p>但現在的路徑要改成</p>
<blockquote><p>[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@“<em>yourdir</em>”]</p></blockquote>
<p>才能找到對應的檔案。而過去為了方便而使用的</p>
<blockquote><p>[UIImage ImageNamed:@“<em>yourimage.pn</em>g”];</p></blockquote>
<p>也失效了。因為這個指令只會去找main bundle裡的檔案，子資料夾裡的檔案會找不到。所以要載入圖檔時，請使用</p>
<blockquote><p>[[UIImage alloc] initWithContentsOfFile : @“<em>yourpath”</em>];</p></blockquote>
<p>並填入完整的檔案路徑。</p>
<p>另外，不知道是mac os本身的問題還是Xcode的關係，用上述方法，有時新加入的檔案並沒有被Xcode認到。結果就是讀不到新加的檔案或者一直在用舊的圖檔。</p>
<p>遇到這種問題，可以先試著執行』Build』-&gt;』Clean All Targets』。然後在專案資料夾下把』build』資料夾刪除。還有問題，可以把Xcode quit掉，再重新啟動專案。如果嫌太麻煩，也可以考慮<a href="http://majicjungle.com/blog/?p=123">這裡</a>的作法。原理很簡單，寫一個script，讓Xcode在編譯專案前，先refresh resources資料夾內容。這樣“照理說”新加入的檔案就會被認到了。（要手動也可以，在Xcode左欄找到新加入檔案的對應資料夾，按右鍵選』touch』即可）</p>
<p>以上小技巧，提供給大家參考。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/743/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=743&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/12/26/%e4%b8%89%e5%80%8bxcode%e5%b0%8f%e6%8a%80%e5%b7%a7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>

		<media:content url="http://www.24100.net/wp-content/uploads/2010/06/xcode.png" medium="image">
			<media:title type="html">xcode</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88ae58d8811-49-321.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 上午11.49.32</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88ae58d8811-54-12.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 上午11.54.12</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/method-selector.png" medium="image">
			<media:title type="html">method selector</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d8812-24-38.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 下午12.24.38</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-18-26.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 下午3.18.26</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-35-23.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 下午3.35.23</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-53-50.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 下午3.53.50</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d883-59-32.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 下午3.59.32</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/e89ea2e5b995e5bfabe785a7-2010-12-23-e4b88be58d884-26-08.png" medium="image">
			<media:title type="html">螢幕快照 2010-12-23 下午4.26.08</media:title>
		</media:content>
	</item>
		<item>
		<title>在Cocos2d加入UIView</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/12/07/%e5%9c%a8cocos2d%e5%8a%a0%e5%85%a5uiview/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/12/07/%e5%9c%a8cocos2d%e5%8a%a0%e5%85%a5uiview/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 09:44:27 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[Cocos2d]]></category>
		<category><![CDATA[iPhoneSDK]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=722</guid>
		<description><![CDATA[想當初剛接觸iPhone開發時，對UIKit是一翹不通，又是frame又是bounds的，搞的我一整個很挫折。後來因緣際會看到Cocos2d，只要sprite、center和addchild就幾乎搞定所有的畫面呈現，結果UIKit就被我放棄，改玩Cocos2d了。 Cocos2d雖然在畫面呈現上很方便很強大，但並不是什麼事情都用cocos2d做是最好的。有時候靠著UIKit裡內建的元件，我們可以很簡單的達成需要的工作。比方說，在遊戲裡，過關後要玩家輸入姓名，可以用UITextField。 UITextField不但提供了輸入的畫面，連鍵盤都幫你準備好了。Cocos2d再怎麼強大，應該也沒有人想要自己coding一個鍵盤出來吧？ 另外有時候需要玩家輸入生日或進行選擇時，UIKit裡也提供了UIPickerView這個元件。 預設的元件，對使用者來說會有一種熟悉感，程式設計師也不用花太多腦筋在介面的呈現上。 這次我們就以UITextField為例，來看看怎麼在cocos2d的畫面上加入UIView吧！什麼？很簡單？cocos2d官網有教？ㄟ&#8230;.被發現了，不過該講的還是要講，而且你確定官網上沒有漏掉什麼東西嗎？ 既然很簡單，我們就來操作一次看看。首先，建立一個新的cocos2d專案。好了以後點選Build &#38; Go確認所有設定運作正常。 『Hello World』，好的，沒有什麼問題。 接著在HelloWorldScene.m裡的- init下加入以下程式，建立一個新的UITextField。 UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 50, 200, 40)]; textField.borderStyle = UITextBorderStyleRoundedRect; 然後，剛剛說很簡單的那個，來來來，說看看怎麼把uiview加到cocos2d的畫面裡。 [[[CCDirector sharedDirector] openGLView] addSubview:textField]; 這樣對吧？很簡單吼～那來跑看看～ 啊不是很簡單＝　＝ 這是什麼情形？擺成直的就算了，鍵盤跳出來還擋住輸入畫面是怎麼回事？ 官網教歸教，但沒仔細說明橫向遊戲遇到uiview時該怎麼處理。 來來來，看這邊，在addSubview之前，我們要把textField作一點點的調整，輸入： textField.transform = CGAffineTransformMakeRotation(M_PI * (90.0 / 180.0)); 這會讓textField順時針旋轉九十度。還沒有完，因為cocos2d和UIKit的座標原點不一樣，有時在調整uiview的位置時真的會想殺人。還好cocos2d提供了簡單的函式幫我們進行轉換，輸入： textField.center = [[CCDirector sharedDirector]　convertToUI:ccp(240, 250)]; convertToUI後面輸入的位置是以cocos2d原點在左下角的座標為依據，所以就螢幕上看到的，x=240是橫向螢幕的中心，y=100則是由螢幕下方往上250 pixel的位置。利用上述的函式，我們可以很輕易的把cocos2d裡的位置轉換給uiview。 現在再來看一下執行結果 如何？看著cocos2d和UIView完美的結合在一起，感覺還不賴吧^^ 對了，上次有網友提到希望再看到一些遊戲的教學，不過小弟課業工作兩頭忙，要挪出時間來寫一篇豐富的教學實在有點困難。不知道大家還希望看到哪部份的教學，如果有空，我會盡力。 倒是我很佩服http://www.raywenderlich.com/的作者，同樣是iphone開發者，工作之餘還可以花時間寫那麼多長篇的教學。哪天應該寫信去請教他，是否可以讓我把他的文章翻譯後放在我的部落格，這樣以後自己要找資料方便，大家也看的開心。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=722&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>想當初剛接觸iPhone開發時，對UIKit是一翹不通，又是frame又是bounds的，搞的我一整個很挫折。後來因緣際會看到Cocos2d，只要sprite、center和addchild就幾乎搞定所有的畫面呈現，結果UIKit就被我放棄，改玩Cocos2d了。</p>
<p>Cocos2d雖然在畫面呈現上很方便很強大，但並不是什麼事情都用cocos2d做是最好的。有時候靠著UIKit裡內建的元件，我們可以很簡單的達成需要的工作。比方說，在遊戲裡，過關後要玩家輸入姓名，可以用UITextField。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/app_kb.png"><img class="aligncenter size-medium wp-image-723" title="app_kb" src="http://bonjouryentinglai.files.wordpress.com/2010/12/app_kb.png?w=161&#038;h=300" alt="" width="161" height="300" /></a></p>
<p>UITextField不但提供了輸入的畫面，連鍵盤都幫你準備好了。Cocos2d再怎麼強大，應該也沒有人想要自己coding一個鍵盤出來吧？<span id="more-722"></span></p>
<p>另外有時候需要玩家輸入生日或進行選擇時，UIKit裡也提供了UIPickerView這個元件。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/uipickerview.png"><img class="aligncenter size-medium wp-image-724" title="uipickerview" src="http://bonjouryentinglai.files.wordpress.com/2010/12/uipickerview.png?w=300&#038;h=211" alt="" width="300" height="211" /></a>預設的元件，對使用者來說會有一種熟悉感，程式設計師也不用花太多腦筋在介面的呈現上。</p>
<p>這次我們就以UITextField為例，來看看怎麼在cocos2d的畫面上加入UIView吧！什麼？很簡單？cocos2d官網有教？ㄟ&#8230;.被發現了，不過該講的還是要講，而且你確定官網上沒有漏掉什麼東西嗎？</p>
<p>既然很簡單，我們就來操作一次看看。首先，建立一個新的cocos2d專案。好了以後點選Build &amp; Go確認所有設定運作正常。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/1.png"><img class="aligncenter size-medium wp-image-726" title="1" src="http://bonjouryentinglai.files.wordpress.com/2010/12/1.png?w=300&#038;h=154" alt="" width="300" height="154" /></a>『Hello World』，好的，沒有什麼問題。</p>
<p>接著在HelloWorldScene.m裡的- init下加入以下程式，建立一個新的UITextField。</p>
<p><code>UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 50, 200, 40)];<br />
textField.borderStyle = UITextBorderStyleRoundedRect;<br />
</code></p>
<p>然後，剛剛說很簡單的那個，來來來，說看看怎麼把uiview加到cocos2d的畫面裡。</p>
<p><code>[[[CCDirector sharedDirector] openGLView] addSubview:textField];</code></p>
<p>這樣對吧？很簡單吼～那來跑看看～<br />
<a href="http://bonjouryentinglai.files.wordpress.com/2010/12/2.png"><img class="aligncenter size-medium wp-image-730" title="2" src="http://bonjouryentinglai.files.wordpress.com/2010/12/2.png?w=300&#038;h=154" alt="" width="300" height="154" /></a></p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/3.png"><img class="aligncenter size-medium wp-image-731" title="3" src="http://bonjouryentinglai.files.wordpress.com/2010/12/3.png?w=300&#038;h=154" alt="" width="300" height="154" /></a></p>
<p>啊不是很簡單＝　＝<br />
這是什麼情形？擺成直的就算了，鍵盤跳出來還擋住輸入畫面是怎麼回事？<br />
官網教歸教，但沒仔細說明橫向遊戲遇到uiview時該怎麼處理。</p>
<p>來來來，看這邊，在addSubview之前，我們要把textField作一點點的調整，輸入：</p>
<p><code>textField.transform = CGAffineTransformMakeRotation(M_PI * (90.0 / 180.0));</code></p>
<p>這會讓textField順時針旋轉九十度。還沒有完，因為cocos2d和UIKit的座標原點不一樣，有時在調整uiview的位置時真的會想殺人。還好cocos2d提供了簡單的函式幫我們進行轉換，輸入：</p>
<p><code>textField.center = [[CCDirector sharedDirector]　convertToUI:ccp(240, 250)];</code></p>
<p>convertToUI後面輸入的位置是以cocos2d原點在左下角的座標為依據，所以就螢幕上看到的，x=240是橫向螢幕的中心，y=100則是由螢幕下方往上250 pixel的位置。利用上述的函式，我們可以很輕易的把cocos2d裡的位置轉換給uiview。</p>
<p>現在再來看一下執行結果</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/12/4.png"><img class="aligncenter size-medium wp-image-734" title="4" src="http://bonjouryentinglai.files.wordpress.com/2010/12/4.png?w=300&#038;h=154" alt="" width="300" height="154" /></a> <a href="http://bonjouryentinglai.files.wordpress.com/2010/12/5.png"><img class="aligncenter size-medium wp-image-735" title="5" src="http://bonjouryentinglai.files.wordpress.com/2010/12/5.png?w=300&#038;h=154" alt="" width="300" height="154" /></a></p>
<p>如何？看著cocos2d和UIView完美的結合在一起，感覺還不賴吧^^</p>
<p>對了，上次有網友提到希望再看到一些遊戲的教學，不過小弟課業工作兩頭忙，要挪出時間來寫一篇豐富的教學實在有點困難。不知道大家還希望看到哪部份的教學，如果有空，我會盡力。</p>
<p>倒是我很佩服<a href="http://www.raywenderlich.com/">http://www.raywenderlich.com/</a>的作者，同樣是iphone開發者，工作之餘還可以花時間寫那麼多長篇的教學。哪天應該寫信去請教他，是否可以讓我把他的文章翻譯後放在我的部落格，這樣以後自己要找資料方便，大家也看的開心。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/722/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/722/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/722/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=722&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/12/07/%e5%9c%a8cocos2d%e5%8a%a0%e5%85%a5uiview/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/app_kb.png?w=161" medium="image">
			<media:title type="html">app_kb</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/uipickerview.png?w=300" medium="image">
			<media:title type="html">uipickerview</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/1.png?w=300" medium="image">
			<media:title type="html">1</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/2.png?w=300" medium="image">
			<media:title type="html">2</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/3.png?w=300" medium="image">
			<media:title type="html">3</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/4.png?w=300" medium="image">
			<media:title type="html">4</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/12/5.png?w=300" medium="image">
			<media:title type="html">5</media:title>
		</media:content>
	</item>
		<item>
		<title>iPad開發心得</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/10/25/ipad%e9%96%8b%e7%99%bc%e5%bf%83%e5%be%97/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/10/25/ipad%e9%96%8b%e7%99%bc%e5%bf%83%e5%be%97/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 14:51:36 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[雜記]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=701</guid>
		<description><![CDATA[距離上次的文章隔了三個月，對於支持我的各位網友們實在很抱歉。 過去幾個月來，一直忙於iPad的開發，加上其他有的沒的突發事件，真的沒什麼空靜下來好好寫一篇文章。今天抽個空來稍微寫一下這陣子開發iPad App的心得，對於想要看到Cocos2d教學的網友們，可能要讓你們失望了。 開發iPad App，說難不難，說簡單卻也沒那麼簡單。在還沒接觸時，心裡只會覺得跟開發iPhone相比，不過就是把圖放大，畫面元素重新調整與排列罷了。但仔細翻閱iPad programming guide和其它文件後，才知道要學的東西還真不少： SplitView與PopoverView：首先，iPad和iPhone最大的不同就在於螢幕的尺寸。以往在iPhone上，受限於螢幕大小，很多控制選項或資訊的呈現，都要使用全螢幕的方式排列。這樣使用者在操作上才會順手，畫面也才夠賞心閱目。但到了iPad，情況就不同了。iPad螢幕這麼大，只不過要調整音量大小或使用者設定，就要占滿整個畫面，不但沒有妥善利用大螢幕的優點，整個畫面看起來也很單調。因此在iPad的SDK裡，新增了SplitView與PopoverView兩個類別。PopoverView在iPad裡是一個很實用的物件，當需要顯示的資訊只有一點點，不需要使用到全螢幕的時候，就可以使用PopoverView來呈現這類資訊。PopoverView還附有箭頭指示，讓使用者知道這是點選了哪個按鈕才跳出來的選單。而SplitView則提供了iPad橫向時的顯示方式，像下圖的“設定”，就把選單和選單的內容分成左右兩部份。橫項的時候，因為螢幕比較寬，所以選單和其內容可以做這樣的排列（直的時候，SplitView會自動變成PopoverView）。 Interface Orientation：這interface orientation是一個很令人頭大的問題。iPad剛發表時，其中主打的一個特色就是不論正著拿還反著拿，iPad都能正確的把資訊顯示給使用者（』It just fit me』還記得吧！）。使用者用的快樂，代表的就是開發者的痛苦。官方Human interface guidelines裡就很明白的說，任何iPad App都要盡可能的支援四種方向的畫面呈現。所以以前在開發iPhone時算是特色的interface orientation，在iPad上變成應該要有的功能。所以下列的函式在開發iPad App裡變得相當重要。 - (BOOL)shouldAutorotateToInterfaceOrientation: - (void)willAnimateRotationToInterfaceOrientation:　duration: - (void)didRotateFromInterfaceOrientation: It&#8217;s just a iPad：雖然說自己曾在iPad剛發表時，在部落格裡認為iPad不只是一台放大版的iPod touch。但是，如果你是開發者，那很抱歉，iPad真的就只是一台放大版的iPod touch。它不是PC，也不是Notebook，它沒有那麼強大，記憶體甚至比iPhone 4還要小。相信很多人在看了iPad的廣告或者自己實際體驗過後會覺得，iPad提供了很好的使用者體驗，比一般小筆電還要順暢。打電動也媲美現在的PC Game。然而，這一切的一切，都是iPad軟體工程師沒日沒夜的最佳化才得到的結果。所以，千萬別以為PC上的那一堆炫麗的效果或豐富的界面，在iPad上一定可以順順利利的執行。它，只是一台iPad。 以上就是這幾個月iPad的開發心得。雖然有一段時間沒開發cocos2d相關程式，不過還是有在注意cocos2d的發展狀況。Cocos2d現在的功能愈來愈豐富，寫程式也愈來愈方便。下次有空再挑個合適的教學來寫吧！<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=701&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>距離上次的文章隔了三個月，對於支持我的各位網友們實在很抱歉。<br />
過去幾個月來，一直忙於iPad的開發，加上其他有的沒的突發事件，真的沒什麼空靜下來好好寫一篇文章。今天抽個空來稍微寫一下這陣子開發iPad App的心得，對於想要看到Cocos2d教學的網友們，可能要讓你們失望了。</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/10/digital_taipei_e8b2b7e4b8bbe5bba3e5918a_e7868ae7868ae696b0e8819e2.jpg"><img class="aligncenter size-full wp-image-704" title="Digital_Taipei_買主廣告_熊熊新聞2" src="http://bonjouryentinglai.files.wordpress.com/2010/10/digital_taipei_e8b2b7e4b8bbe5bba3e5918a_e7868ae7868ae696b0e8819e2.jpg?w=630" alt=""   /></a></p>
<p>開發iPad App，說難不難，說簡單卻也沒那麼簡單。在還沒接觸時，心裡只會覺得跟開發iPhone相比，不過就是把圖放大，畫面元素重新調整與排列罷了。但仔細翻閱iPad programming guide和其它文件後，才知道要學的東西還真不少：<span id="more-701"></span></p>
<ul>
<li><strong>SplitView與PopoverView：</strong>首先，iPad和iPhone最大的不同就在於螢幕的尺寸。以往在iPhone上，受限於螢幕大小，很多控制選項或資訊的呈現，都要使用全螢幕的方式排列。這樣使用者在操作上才會順手，畫面也才夠賞心閱目。但到了iPad，情況就不同了。iPad螢幕這麼大，只不過要調整音量大小或使用者設定，就要占滿整個畫面，不但沒有妥善利用大螢幕的優點，整個畫面看起來也很單調。因此在iPad的SDK裡，新增了SplitView與PopoverView兩個類別。PopoverView在iPad裡是一個很實用的物件，當需要顯示的資訊只有一點點，不需要使用到全螢幕的時候，就可以使用PopoverView來呈現這類資訊。PopoverView還附有箭頭指示，讓使用者知道這是點選了哪個按鈕才跳出來的選單。而SplitView則提供了iPad橫向時的顯示方式，像下圖的“設定”，就把選單和選單的內容分成左右兩部份。橫項的時候，因為螢幕比較寬，所以選單和其內容可以做這樣的排列（直的時候，SplitView會自動變成PopoverView）。</li>
</ul>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/10/split_view.jpg"><img class="aligncenter size-full wp-image-710" title="split_view" src="http://bonjouryentinglai.files.wordpress.com/2010/10/split_view.jpg?w=630" alt=""   /></a></p>
<ul>
<li><strong>Interface Orientation：</strong>這interface orientation是一個很令人頭大的問題。iPad剛發表時，其中主打的一個特色就是不論正著拿還反著拿，iPad都能正確的把資訊顯示給使用者（』It just fit me』還記得吧！）。使用者用的快樂，代表的就是開發者的痛苦。官方Human interface guidelines裡就很明白的說，任何iPad App都要盡可能的支援四種方向的畫面呈現。所以以前在開發iPhone時算是特色的interface orientation，在iPad上變成應該要有的功能。所以下列的函式在開發iPad App裡變得相當重要。</li>
</ul>
<blockquote><p>- (BOOL)shouldAutorotateToInterfaceOrientation:</p>
<p>- (void)willAnimateRotationToInterfaceOrientation:　duration:</p>
<p>- (void)didRotateFromInterfaceOrientation:</p></blockquote>
<ul>
<li><strong>It&#8217;s just a iPad：</strong>雖然說自己曾在iPad剛發表時，在部落格裡認為iPad不只是一台放大版的iPod touch。但是，如果你是開發者，那很抱歉，iPad真的就只是一台放大版的iPod touch。它不是PC，也不是Notebook，它沒有那麼強大，記憶體甚至比iPhone 4還要小。相信很多人在看了iPad的廣告或者自己實際體驗過後會覺得，iPad提供了很好的使用者體驗，比一般小筆電還要順暢。打電動也媲美現在的PC Game。然而，這一切的一切，都是iPad軟體工程師沒日沒夜的最佳化才得到的結果。所以，千萬別以為PC上的那一堆炫麗的效果或豐富的界面，在iPad上一定可以順順利利的執行。它，只是一台iPad。</li>
</ul>
<p>以上就是這幾個月iPad的開發心得。雖然有一段時間沒開發cocos2d相關程式，不過還是有在注意cocos2d的發展狀況。Cocos2d現在的功能愈來愈豐富，寫程式也愈來愈方便。下次有空再挑個合適的教學來寫吧！</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/701/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/701/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/701/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=701&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/10/25/ipad%e9%96%8b%e7%99%bc%e5%bf%83%e5%be%97/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/10/digital_taipei_e8b2b7e4b8bbe5bba3e5918a_e7868ae7868ae696b0e8819e2.jpg" medium="image">
			<media:title type="html">Digital_Taipei_買主廣告_熊熊新聞2</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/10/split_view.jpg" medium="image">
			<media:title type="html">split_view</media:title>
		</media:content>
	</item>
		<item>
		<title>AR工具系列 II：加速度計</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/07/09/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97-ii%ef%bc%9a%e5%8a%a0%e9%80%9f%e5%ba%a6%e8%a8%88/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/07/09/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97-ii%ef%bc%9a%e5%8a%a0%e9%80%9f%e5%ba%a6%e8%a8%88/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 10:08:07 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[Argumented Reality]]></category>
		<category><![CDATA[Augmented Reality]]></category>
		<category><![CDATA[iPhoneSDK]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=684</guid>
		<description><![CDATA[加速度計在iPhone APP上的應用很多，從遊戲的控制、shake undo、到iPhone的姿態訊息，都是藉由加速度計的資訊計算而來。今天AR教學的第二篇，就要來說明一下怎麼利用程式取得iPhone加速度計的資訊。 首先，借用一下iPhone Dev Center 官方文件的圖片： 上圖是iPhone加速度計的三軸方向示意圖。iPhone的加速度計可以量測三個方向的加速度量值，輸出的數值單位是G。G不是高斯，更不是公克，是重力加速度。讓我們來複習一下國中物理課，加速度指的是速度在特定間隔時間的改變量，地球的重力加速度為1G = 9.8m/s^2。所以當我們把上圖的iPhone放在空間中時，會得到Y軸的數值為-1，即-9.8m/s^2，負號代表向下。 這裡要強調一下，加速度計是量測加速度的方向與大小，不是速度的大小，也不是量測重力的大小和方向。我們可以簡單的做一個實驗，拿起手上的iPhone（拿直的），打開safari，隨便進入一個網頁。接著，左右快速的橫向移動iPhone，如果速度夠快，就會看到safari轉成橫向了。這是因為iPhone是用加速度計來判斷它的直橫方向，所以當我們左右快速移動時，橫向的加速度大於垂直方向的重力加速度，iPhone系統就會判定為iPhone現在是擺橫的了。 好的，聊完了簡單的物理概念後，現在來看看程式要怎麼寫吧！ 首先，必需在需要使用加速度的類別宣告中，加入加速度計的protocol。像這樣： @interface MyViewController : UIViewController&#60;UIAccelerometerDelegate&#62; 在父類別的後方使用大於小於的符號，並且把UIAccelerometerDelegate這個委派加進去就完成準備工作了。 接著，在類別初始化的函式（可能是- (id)init、-(void)viewDidLoad或其它函式）加入以下程式碼，建立一個存取加速度計資料的物件： UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; accel.delegate = self; accel.updateInterval = 1.0f / 60.0f; accel是我們建立的加速度計物件，後面的兩行是用來設定這個物件的委派物件和加速度計的更新速率。更新速率調的愈高，反應愈靈敏。但並不是愈靈敏就是愈好，這需要看程式設計的需求而決定。 最後，我們要在這個類別的.m檔裡加入下方的函式： - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { } 因為我們前面已經在這個類別加入了UIAccelerometerDelegate的protocol，所以當加速度計在特定的時間感應到有加速度的變化時，這個函式就會被呼叫。要取用三軸加速度計的資料，只要在該函式裡使用： acceleration.x acceleration.y acceleration.z 即可得到xyz三軸的加速度資訊。 至於這三軸的資訊要怎麼使用在AR app上，會在各項AR工具的教學結束後，再統一說明。這裡就先賣個關子，請各位先發揮自己的創造力和想像力加以應用囉！<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=684&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>加速度計在iPhone APP上的應用很多，從遊戲的控制、shake undo、到iPhone的姿態訊息，都是藉由加速度計的資訊計算而來。今天AR教學的第二篇，就要來說明一下怎麼利用程式取得iPhone加速度計的資訊。</p>
<p>首先，借用一下iPhone Dev Center 官方文件的圖片：</p>
<p><a href="http://bonjouryentinglai.files.wordpress.com/2010/07/device_axes.jpg"><img class="aligncenter size-full wp-image-687" title="device_axes" src="http://bonjouryentinglai.files.wordpress.com/2010/07/device_axes.jpg?w=630" alt=""   /></a><span id="more-684"></span><br />
上圖是iPhone加速度計的三軸方向示意圖。iPhone的加速度計可以量測三個方向的加速度量值，輸出的數值單位是G。G不是高斯，更不是公克，是重力加速度。讓我們來複習一下國中物理課，加速度指的是速度在特定間隔時間的改變量，地球的重力加速度為1G = 9.8m/s^2。所以當我們把上圖的iPhone放在空間中時，會得到Y軸的數值為-1，即-9.8m/s^2，負號代表向下。</p>
<p>這裡要強調一下，加速度計是量測加速度的方向與大小，不是速度的大小，也不是量測重力的大小和方向。我們可以簡單的做一個實驗，拿起手上的iPhone（拿直的），打開safari，隨便進入一個網頁。接著，左右快速的橫向移動iPhone，如果速度夠快，就會看到safari轉成橫向了。這是因為iPhone是用加速度計來判斷它的直橫方向，所以當我們左右快速移動時，橫向的加速度大於垂直方向的重力加速度，iPhone系統就會判定為iPhone現在是擺橫的了。</p>
<p>好的，聊完了簡單的物理概念後，現在來看看程式要怎麼寫吧！</p>
<p>首先，必需在需要使用加速度的類別宣告中，加入加速度計的protocol。像這樣：</p>
<blockquote><p>@interface MyViewController : UIViewController&lt;UIAccelerometerDelegate&gt;</p></blockquote>
<p>在父類別的後方使用大於小於的符號，並且把UIAccelerometerDelegate這個委派加進去就完成準備工作了。</p>
<p>接著，在類別初始化的函式（可能是- (id)init、-(void)viewDidLoad或其它函式）加入以下程式碼，建立一個存取加速度計資料的物件：<br />
<code><br />
UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; accel.delegate = self;<br />
accel.updateInterval = 1.0f / 60.0f;<br />
</code><br />
accel是我們建立的加速度計物件，後面的兩行是用來設定這個物件的委派物件和加速度計的更新速率。更新速率調的愈高，反應愈靈敏。但並不是愈靈敏就是愈好，這需要看程式設計的需求而決定。</p>
<p>最後，我們要在這個類別的.m檔裡加入下方的函式：<br />
<code><br />
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {<br />
}<br />
</code><br />
因為我們前面已經在這個類別加入了UIAccelerometerDelegate的protocol，所以當加速度計在特定的時間感應到有加速度的變化時，這個函式就會被呼叫。要取用三軸加速度計的資料，只要在該函式裡使用：<br />
<code><br />
acceleration.x<br />
acceleration.y<br />
acceleration.z<br />
</code><br />
即可得到xyz三軸的加速度資訊。</p>
<p>至於這三軸的資訊要怎麼使用在AR app上，會在各項AR工具的教學結束後，再統一說明。這裡就先賣個關子，請各位先發揮自己的創造力和想像力加以應用囉！</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/684/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/684/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/684/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/684/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/684/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/684/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/684/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/684/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=684&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/07/09/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97-ii%ef%bc%9a%e5%8a%a0%e9%80%9f%e5%ba%a6%e8%a8%88/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/07/device_axes.jpg" medium="image">
			<media:title type="html">device_axes</media:title>
		</media:content>
	</item>
		<item>
		<title>AR工具系列 I：Camera</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/06/06/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97i%ef%bc%9acamera/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/06/06/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97i%ef%bc%9acamera/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 03:56:51 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[Argumented Reality]]></category>
		<category><![CDATA[Augmented Reality]]></category>
		<category><![CDATA[iPhoneSDK]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=664</guid>
		<description><![CDATA[上次小秀了一段擴增實境的影片，發現大家好像對這主題很有興趣。所以打算規劃一系列的AR教學，讓大家能夠輕鬆入門。 Argumented Reality，簡稱AR，中文翻譯為擴增實境。和虛擬實境不同的地方在於，虛擬實境是在螢幕上呈現一個完全由軟體建構出來的世界。而擴增實境則是在螢幕顯示的真實世界上加入一些虛擬的資訊。舉個簡單的例子，如果各位有個二三十歳以上，應該看過七龍珠這個漫畫或卡通。裡面很多人都會在左眼或右眼掛上一個可以顯示對方戰鬥力的儀器，這個儀器的背景是真實世界，但是當它對準某個敵人時，則會顯示對方的戰鬥力和其它數值（如果戰鬥力太高，還會爆炸XD）。 除了這個，像是魔鬼終結者那些機器人看到的影像，或者戰鬥機飛行員的螢幕畫面，這些都可以算是一種擴增實境。 簡易的擴增實境，只要有個攝影機顯示真實畫面，然後利用程式把一些資訊疊在這個畫面上就好了。但如果要更有實用價值，則必需考慮到攝影機與真實世界的相對位置。 判斷攝影機與真實世界相對位置的方法，簡單來說可以分成兩大類： 影像辨識處理：這種方法是把攝影機看到的影像抓進程式裡做計算，每一個frame算一次，藉以判別現在相機和真實世界的位置。它的好處是，只要有相機就可以計算，而且非常精確。缺點在於，像iPhone這種CPU不是很強的機器，每計算一個frame需要的時間很長，結果實際上看起來就有點lag。此外，為了判別相機的相對移動，通常還需要一個參考用的圖案。程式根據該圖示在畫面中的相對位置，才能計算出相機的移動，實用性就大大被限制住了。上面的影片是ARToolkit這套開發工具在iPhone上的實測畫面。可以看到虛擬的畫面很精準的疊在真實世界中的圖示上，只是說畫面實在有些lag。當然這個問題隨著iPhone硬體的更新，會逐漸好轉。這一段影片就比較神奇了，這是由國外大學開發的一個稱為Parallel Tracking and Mapping的技術。基本上它也是影像處理，只是它不需要額外的參考圖示，程式本身會去找出畫面中屬於平面的部份，再進行相對位置的計算。他們有開放Source Code，如果有興趣可以去看看。不過code本身不是寫給iPhone用的，而且他們也明講code仍屬開發階段。我抓下來看過了，光要了解內容可能就要不少時間，如果還要讓iPhone可以用，那就&#8230;.囧囧囧 姿態位置感測器：和上述方法不同，這種方法主要利用的是其它搭配的姿態感測器，用來判斷攝影機與真實世界的相對位置。以iPhone為例，GPS可以用來得知攝影機在地圖上的哪個位置，磁力計則提供水平旋轉時的角度，加速度計則用來計算攝影機的仰角或傾角。此種方法因為不需要影像判識，所以比較不會受限於CPU的能力。相反的，因為仰賴的是其它週邊的感測器，因此這些感測器的精確度就影響了整體定位上的表現。在iPhone上利用這些感測器作為攝影機姿態的判別，精確度確實是比用影像判識的方法差上一截。如果各位手上有iPhone 3GS，可以試試看。把它水平的放在桌上，打開內建的指南針程式，待它靜止後，記住北方的方向。接著，快速的把iPhone水平旋轉90或180度，然後&#8230;.指南針的北方和剛剛一樣嗎？　囧 上面說了這麼多，除了簡單介紹一下擴增實境是幹什麼的外，主要是要充版面（誤）。好啦～開玩笑的。從上面的簡介可以知道，擴增實境的重點，就是把實際畫面呈現在螢幕上，並把虛擬物件疊在畫面上。所以今天就來說明一下在iPhone上要如何打開攝影機，並把物件疊在上面。 在iPhone上要開啟攝影機，我們要使用的類別是UIImagePickerController，相關程式碼如下： UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate = self; imagePicker.navigationBarHidden = YES; imagePicker.toolbarHidden = YES; imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.showsCameraControls = NO; imagePicker.cameraOverlayView = the view you want to attach; 首先先建立一個UIIMagePickerController的物件，接著把delegate指到你想指的地方，然後如果不想要navigationbar和toolbar的話，記得把它們關掉。在sourceType的部份，設定為IImagePickerControllerSourceTypeCamera，因為UIImagePickerController除了提供相機供能外，相片圖庫也是由它提供。接著則是把最底下有快門按鈕的工具列也關掉。最後最重要的一件事，把想要疊在螢幕上的物件（必須為UIView）設定給cameraOverlayView，這樣該物件就會出現在攝影機的畫面上了。 另外，因為剛剛把相機底下含快門按鈕的工具列給關了，所以畫面顯示的時候，底下會留下一段黑色的橫條，不是很好看。所以我們要把相機顯示的畫面放大一點，讓它填滿整個螢幕。 float bandWidth = 54; float screenHeight = 480; float [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=664&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>上次小秀了一段擴增實境的影片，發現大家好像對這主題很有興趣。所以打算規劃一系列的AR教學，讓大家能夠輕鬆入門。</p>
<p>Argumented Reality，簡稱AR，中文翻譯為擴增實境。和虛擬實境不同的地方在於，虛擬實境是在螢幕上呈現一個完全由軟體建構出來的世界。而擴增實境則是在螢幕顯示的真實世界上加入一些虛擬的資訊。舉個簡單的例子，如果各位有個二三十歳以上，應該看過七龍珠這個漫畫或卡通。裡面很多人都會在左眼或右眼掛上一個可以顯示對方戰鬥力的儀器，這個儀器的背景是真實世界，但是當它對準某個敵人時，則會顯示對方的戰鬥力和其它數值（如果戰鬥力太高，還會爆炸XD）。</p>
<p>除了這個，像是魔鬼終結者那些機器人看到的影像，或者戰鬥機飛行員的螢幕畫面，這些都可以算是一種擴增實境。</p>
<p>簡易的擴增實境，只要有個攝影機顯示真實畫面，然後利用程式把一些資訊疊在這個畫面上就好了。但如果要更有實用價值，則必需考慮到攝影機與真實世界的相對位置。</p>
<p>判斷攝影機與真實世界相對位置的方法，簡單來說可以分成兩大類：<span id="more-664"></span></p>
<ol>
<li><strong>影像辨識處理：</strong>這種方法是把攝影機看到的影像抓進程式裡做計算，每一個frame算一次，藉以判別現在相機和真實世界的位置。它的好處是，只要有相機就可以計算，而且非常精確。缺點在於，像iPhone這種CPU不是很強的機器，每計算一個frame需要的時間很長，結果實際上看起來就有點lag。此外，為了判別相機的相對移動，通常還需要一個參考用的圖案。程式根據該圖示在畫面中的相對位置，才能計算出相機的移動，實用性就大大被限制住了。<span style="text-align:center; display: block;"><a href="http://bonjouryentinglai.wordpress.com/2010/06/06/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97i%ef%bc%9acamera/"><img src="http://img.youtube.com/vi/5M-oAmBDcZk/2.jpg" alt="" /></a></span>上面的影片是ARToolkit這套開發工具在iPhone上的實測畫面。可以看到虛擬的畫面很精準的疊在真實世界中的圖示上，只是說畫面實在有些lag。當然這個問題隨著iPhone硬體的更新，會逐漸好轉。<span style="text-align:center; display: block;"><a href="http://bonjouryentinglai.wordpress.com/2010/06/06/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97i%ef%bc%9acamera/"><img src="http://img.youtube.com/vi/pBI5HwitBX4/2.jpg" alt="" /></a></span>這一段影片就比較神奇了，這是由國外大學開發的一個稱為Parallel Tracking and Mapping的技術。基本上它也是影像處理，只是它不需要額外的參考圖示，程式本身會去找出畫面中屬於平面的部份，再進行相對位置的計算。他們有開放Source Code，如果有興趣可以去看看。不過code本身不是寫給iPhone用的，而且他們也明講code仍屬開發階段。我抓下來看過了，光要了解內容可能就要不少時間，如果還要讓iPhone可以用，那就&#8230;.囧囧囧</li>
<li><strong>姿態位置感測器：</strong>和上述方法不同，這種方法主要利用的是其它搭配的姿態感測器，用來判斷攝影機與真實世界的相對位置。以iPhone為例，GPS可以用來得知攝影機在地圖上的哪個位置，磁力計則提供水平旋轉時的角度，加速度計則用來計算攝影機的仰角或傾角。此種方法因為不需要影像判識，所以比較不會受限於CPU的能力。相反的，因為仰賴的是其它週邊的感測器，因此這些感測器的精確度就影響了整體定位上的表現。在iPhone上利用這些感測器作為攝影機姿態的判別，精確度確實是比用影像判識的方法差上一截。如果各位手上有iPhone 3GS，可以試試看。把它水平的放在桌上，打開內建的指南針程式，待它靜止後，記住北方的方向。接著，快速的把iPhone水平旋轉90或180度，然後&#8230;.指南針的北方和剛剛一樣嗎？　囧</li>
</ol>
<p>上面說了這麼多，除了簡單介紹一下擴增實境是幹什麼的外，主要是要充版面（誤）。好啦～開玩笑的。從上面的簡介可以知道，擴增實境的重點，就是把實際畫面呈現在螢幕上，並把虛擬物件疊在畫面上。所以今天就來說明一下在iPhone上要如何打開攝影機，並把物件疊在上面。</p>
<p>在iPhone上要開啟攝影機，我們要使用的類別是UIImagePickerController，相關程式碼如下：<br />
<code><br />
UIImagePickerController* imagePicker =<br />
[[UIImagePickerController alloc] init];<br />
imagePicker.delegate = self;<br />
imagePicker.navigationBarHidden = YES;<br />
imagePicker.toolbarHidden = YES;<br />
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;<br />
imagePicker.showsCameraControls = NO;<br />
imagePicker.cameraOverlayView = <em>the view you want to attach</em>;<br />
</code><br />
首先先建立一個UIIMagePickerController的物件，接著把delegate指到你想指的地方，然後如果不想要navigationbar和toolbar的話，記得把它們關掉。在sourceType的部份，設定為IImagePickerControllerSourceTypeCamera，因為UIImagePickerController除了提供相機供能外，相片圖庫也是由它提供。接著則是把最底下有快門按鈕的工具列也關掉。最後最重要的一件事，把想要疊在螢幕上的物件（必須為UIView）設定給cameraOverlayView，這樣該物件就會出現在攝影機的畫面上了。<br />
另外，因為剛剛把相機底下含快門按鈕的工具列給關了，所以畫面顯示的時候，底下會留下一段黑色的橫條，不是很好看。所以我們要把相機顯示的畫面放大一點，讓它填滿整個螢幕。<br />
<code><br />
float bandWidth = 54;<br />
float screenHeight = 480;<br />
float zoomFactor = screenHeight / (screenHeight - bandWidth);</code></p>
<p><code> </code></p>
<p><code>imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, zoomFactor, zoomFactor);<br />
</code><br />
工具列的高度大約是54pixel，所以把相機畫面的寬和高各放大約1.13倍，就會填滿整個螢幕了。</p>
<p>最後，我們要把剛剛建立的UIImagePickerController物件叫出來。如果剛剛的UIImagePickerController是寫在某個UIViewController裡面，那麼只要把UIImagePickerController用modal view的方式叫出來就可以了。<br />
<code><br />
[self presentModalViewController:imagePicker animated:NO];</code></p>
<p>OK!大功告成，這次就先講到這裡囉～</p>
<p>（咦？沒了？教學的部份有點短說＠＠還好前面有寫些東西充版面ＸＤ&#8230;）</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/664/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=664&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/06/06/ar%e5%b7%a5%e5%85%b7%e7%b3%bb%e5%88%97i%ef%bc%9acamera/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>
	</item>
		<item>
		<title>我也要來擴增實境（AR）一下！</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/05/13/%e6%88%91%e4%b9%9f%e8%a6%81%e4%be%86%e6%93%b4%e5%a2%9e%e5%af%a6%e5%a2%83%ef%bc%88ar%ef%bc%89%e4%b8%80%e4%b8%8b%ef%bc%81/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/05/13/%e6%88%91%e4%b9%9f%e8%a6%81%e4%be%86%e6%93%b4%e5%a2%9e%e5%af%a6%e5%a2%83%ef%bc%88ar%ef%bc%89%e4%b8%80%e4%b8%8b%ef%bc%81/#comments</comments>
		<pubDate>Thu, 13 May 2010 14:23:30 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[雜記]]></category>
		<category><![CDATA[Augmented Reality]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=654</guid>
		<description><![CDATA[真糟糕，一忙起來部落格就一個月沒更新，實在是對不起大家。最近在幫朋友處理一個概念性的app，裡頭要用到Augmented Reality (AR)的相關技術。但是牽涉到人家的創意，這裡就不多說。 下面錄了一段比較簡單的AR影片，但是畫質有點糟，又對不太到焦，傷眼睛就抱歉囉～ AR這個東西，說難不難，說簡單卻也沒那麼簡單。基本上，要實作一個AR程式，需要的知識有 了解如何啟動iPhone攝影機，並把UIView疊在畫面上。 利用加速度計和磁力計計算iPhone的姿態。 利用GPS資訊計算iPhone的水平位移。 OpenGL ES &#8230;. 前面三項大概花個一兩天就可以學會了，問題比較大的大概是OpenGL ES吧！當然不用OpenGL ES也是可以做出其他的AR app，只是OpenGL ES的彈性比較大。只要運用加速度計和磁力計算出iPhone的姿態後，利用OpenGL ES調整虛擬照相機的視角，虛擬物件便會隨著iPhone的姿態轉移到對應的位置上。 加速度計和磁力計哪天有空再把相關程式放上來，只是這兩者皆無法在模擬器上執行，如果沒有購買iPhone Developer Program的話很難驗証程式的正確性。至於OpenGL ES嘛～雖然我有看了一點，不過實在太懶了，所以改用現成的SIO2 3D遊戲引擎來處理3D繪圖的工作。這部份就等用了比較熟練，再上來分享囉～<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=654&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>真糟糕，一忙起來部落格就一個月沒更新，實在是對不起大家。最近在幫朋友處理一個概念性的app，裡頭要用到Augmented Reality (AR)的相關技術。但是牽涉到人家的創意，這裡就不多說。</p>
<p>下面錄了一段比較簡單的AR影片，但是畫質有點糟，又對不太到焦，傷眼睛就抱歉囉～</p>
<p><span style="text-align:center; display: block;"><a href="http://bonjouryentinglai.wordpress.com/2010/05/13/%e6%88%91%e4%b9%9f%e8%a6%81%e4%be%86%e6%93%b4%e5%a2%9e%e5%af%a6%e5%a2%83%ef%bc%88ar%ef%bc%89%e4%b8%80%e4%b8%8b%ef%bc%81/"><img src="http://img.youtube.com/vi/5wRnl8g4UK8/2.jpg" alt="" /></a></span><span id="more-654"></span></p>
<p>AR這個東西，說難不難，說簡單卻也沒那麼簡單。基本上，要實作一個AR程式，需要的知識有</p>
<ol>
<li>了解如何啟動iPhone攝影機，並把UIView疊在畫面上。</li>
<li>利用加速度計和磁力計計算iPhone的姿態。</li>
<li>利用GPS資訊計算iPhone的水平位移。</li>
<li>OpenGL ES &#8230;.</li>
</ol>
<p>前面三項大概花個一兩天就可以學會了，問題比較大的大概是OpenGL ES吧！當然不用OpenGL ES也是可以做出其他的AR app，只是OpenGL ES的彈性比較大。只要運用加速度計和磁力計算出iPhone的姿態後，利用OpenGL ES調整虛擬照相機的視角，虛擬物件便會隨著iPhone的姿態轉移到對應的位置上。</p>
<p>加速度計和磁力計哪天有空再把相關程式放上來，只是這兩者皆無法在模擬器上執行，如果沒有購買iPhone Developer Program的話很難驗証程式的正確性。至於OpenGL ES嘛～雖然我有看了一點，不過實在太懶了，所以改用現成的SIO2 3D遊戲引擎來處理3D繪圖的工作。這部份就等用了比較熟練，再上來分享囉～</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/654/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=654&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/05/13/%e6%88%91%e4%b9%9f%e8%a6%81%e4%be%86%e6%93%b4%e5%a2%9e%e5%af%a6%e5%a2%83%ef%bc%88ar%ef%bc%89%e4%b8%80%e4%b8%8b%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>
	</item>
		<item>
		<title>慘！iPhone OS 4發表了～</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/04/11/%e6%85%98%ef%bc%81iphone-os-4%e7%99%bc%e8%a1%a8%e4%ba%86%ef%bd%9e/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/04/11/%e6%85%98%ef%bc%81iphone-os-4%e7%99%bc%e8%a1%a8%e4%ba%86%ef%bd%9e/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 15:56:16 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[其他開發相關知識]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhoneSDK]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=647</guid>
		<description><![CDATA[在還未接觸iPhone程式開發以前，做為一個iPhone使用者，最期待的就是看到Apple官方發表新的OS。對許多手機控來說，iPhone的功能總是東缺西少的，透過新版的OS更新，iPhone才能更接近大家心目中完美的手機。 但是！自從當了開發者，有作品上架後，一切就都變了。。。。。 變成開發者，代表自己變成提供服務的一方。只要新的OS提供了新的服務，開發者就得盡可能的把這些新功能加入到自己的APP中，滿足大家的期待，不然就等著被使用者唾棄吧！ 上面講的還只是小事情，反正花點時間和心力，把新的API看完，該加入的功能寫一寫，就沒事了。萬一新的OS那麼剛好，內建的新功能直接取代自己已經上架的APP，或者某項新服務直接官方支援，搶人飯碗，那就只能說上輩子沒積陰德，算你倒楣。 有關新OS的功能，各大論譠和網站都已經提的差不多了，這次只是想站在開發者的立場整理一些心得，看看新的OS有什麼特別，如果文章中有什麼遺漏或錯誤的地方，還請大家糾正。 大家都知道，Jobs在Keynote中把iPhone OS 4的重點分成七大類，我們就一項項來看吧！ Multitasking : 好的，眾所期待的多工終於出現了。未來使用者可以掛著MSN，上網聽音樂外加收信和導航了（PS1:真有這麼多事可以做？）（PS2:為什麼我的iPhone 3G不支援　&#62;』&#60;）。但是只要稍微去K一下OS 4的API就會知道，多工不是完全被動交給系統去處理。也就是說～不好意思，如果你的APP要能放到背景，麻煩改一下程式碼，讓它支援特定的工作。乖乖改吧！各位開發者～ Folder : 喔！這個好！新功能！現在可以放在iPhone的APP上限是2160個，而且以後不用翻頁翻到死了。最重要的是，這功能和開發者一點關係都沒有。（爽） Mail : 嗯。。。統一收件匣（我只有一個帳號）、多個Exchange帳號（沒在用Exchange）、更方便的。。。。好！跟我沒關係，跳過。 iBooks : 這還要說什麼嗎？免費的小熊維尼iBooks一本？好啦！有空我會看。 Enterprise : 老實講，目前跟我關係好像不太大。。。。 Game Center : 剛好印證剛剛前面說的，官方內建新服務，搶人飯碗。可憐的Open Fient，以後還能不能在iPhone遊戲市場中存活啊？先撇開這個不談，對遊戲開發者或遊戲軟體商來說，有一個像Game Center或Open Fient的服務是很重要的。使用者每天很努力的打電動，拼排名，不然就是挑戰朋友，邀朋友一起玩。玩的人快樂，賣遊戲的更快樂。現在App Store上的遊戲那麼多，要不是有這些呆呆的玩家免費幫遊戲打廣告，呼朋引伴叫大家玩，遊戲要在APP海中被使用者發覺，是一件多麼困難的事啊！喔對了，本來要來看一下Open Fient的API把它加到我的APP的，看來不用花這個時間了，直接看Game Center的就好了^^ iAd : 又一個服務中槍了！沒錯，就是在說你，AdMob。Apple官方的廣告服務耶！AdMob是google的又怎樣，APP是Apple在審，只要你AdMob裡的功能犯到Apple iAd，不好意思，這個APP一定不會過的啦！虧我還去弄了一個paypal給AdMob，看來是要跳槽囉～ 以上是我這個還算新手的開發者對於iPhone OS 4的一點心得吧～ 這次文章內容有點少，來點無聊的充充版面。上面寫的是開發者對OS 4的感想，那如果只是一個不會寫程式的單純使用者呢？（括號內是我的註解） Multitasking : YA～終於有了～（完全和我相反心態） Folder : 唷！這個還不錯～（有志一同？） Mail : 嗯。。。。 iBooks : [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=647&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://bonjouryentinglai.files.wordpress.com/2010/04/f_243164_1.jpeg"><img class="aligncenter size-full wp-image-651" title="f_243164_1" src="http://bonjouryentinglai.files.wordpress.com/2010/04/f_243164_1.jpeg?w=630" alt=""   /></a></p>
<p>在還未接觸iPhone程式開發以前，做為一個iPhone使用者，最期待的就是看到Apple官方發表新的OS。對許多手機控來說，iPhone的功能總是東缺西少的，透過新版的OS更新，iPhone才能更接近大家心目中完美的手機。</p>
<p>但是！自從當了開發者，有作品上架後，一切就都變了。。。。。</p>
<p>變成開發者，代表自己變成提供服務的一方。只要新的OS提供了新的服務，開發者就得盡可能的把這些新功能加入到自己的APP中，滿足大家的期待，不然就等著被使用者唾棄吧！<span id="more-647"></span></p>
<p>上面講的還只是小事情，反正花點時間和心力，把新的API看完，該加入的功能寫一寫，就沒事了。萬一新的OS那麼剛好，內建的新功能直接取代自己已經上架的APP，或者某項新服務直接官方支援，搶人飯碗，那就只能說上輩子沒積陰德，算你倒楣。</p>
<p>有關新OS的功能，各大論譠和網站都已經提的差不多了，這次只是想站在開發者的立場整理一些心得，看看新的OS有什麼特別，如果文章中有什麼遺漏或錯誤的地方，還請大家糾正。</p>
<p>大家都知道，Jobs在Keynote中把iPhone OS 4的重點分成七大類，我們就一項項來看吧！</p>
<ol>
<li><strong>Multitasking : </strong>好的，眾所期待的多工終於出現了。未來使用者可以掛著MSN，上網聽音樂外加收信和導航了（PS1:真有這麼多事可以做？）（PS2:為什麼我的iPhone 3G不支援　&gt;』&lt;）。但是只要稍微去K一下OS 4的API就會知道，多工不是完全被動交給系統去處理。也就是說～不好意思，如果你的APP要能放到背景，麻煩改一下程式碼，讓它支援特定的工作。乖乖改吧！各位開發者～</li>
<li><strong>Folder : </strong>喔！這個好！新功能！現在可以放在iPhone的APP上限是2160個，而且以後不用翻頁翻到死了。最重要的是，這功能和開發者一點關係都沒有。（爽）</li>
<li><strong>Mail : </strong>嗯。。。統一收件匣（我只有一個帳號）、多個Exchange帳號（沒在用Exchange）、更方便的。。。。好！跟我沒關係，跳過。</li>
<li><strong>iBooks : </strong>這還要說什麼嗎？免費的小熊維尼iBooks一本？好啦！有空我會看。</li>
<li><strong>Enterprise : </strong>老實講，目前跟我關係好像不太大。。。。</li>
<li><strong>Game Center : </strong>剛好印證剛剛前面說的，官方內建新服務，搶人飯碗。可憐的Open Fient，以後還能不能在iPhone遊戲市場中存活啊？先撇開這個不談，對遊戲開發者或遊戲軟體商來說，有一個像Game Center或Open Fient的服務是很重要的。使用者每天很努力的打電動，拼排名，不然就是挑戰朋友，邀朋友一起玩。玩的人快樂，賣遊戲的更快樂。現在App Store上的遊戲那麼多，要不是有這些<span style="text-decoration:line-through;">呆呆的</span>玩家免費幫遊戲打廣告，呼朋引伴叫大家玩，遊戲要在APP海中被使用者發覺，是一件多麼困難的事啊！喔對了，本來要來看一下Open Fient的API把它加到我的APP的，看來不用花這個時間了，直接看Game Center的就好了^^</li>
<li><strong>iAd : </strong>又一個服務中槍了！沒錯，就是在說你，AdMob。Apple官方的廣告服務耶！AdMob是google的又怎樣，APP是Apple在審，只要你AdMob裡的功能犯到Apple iAd，不好意思，這個APP一定不會過的啦！虧我還去弄了一個paypal給AdMob，看來是要跳槽囉～</li>
</ol>
<p>以上是我這個還算新手的開發者對於iPhone OS 4的一點心得吧～</p>
<p>這次文章內容有點少，來點無聊的充充版面。上面寫的是開發者對OS 4的感想，那如果只是一個不會寫程式的單純使用者呢？（括號內是我的註解）</p>
<ol>
<li><strong>Multitasking : </strong>YA～終於有了～（完全和我相反心態）</li>
<li><strong>Folder : </strong>唷！這個還不錯～（有志一同？）</li>
<li><strong>Mail :</strong> 嗯。。。。</li>
<li><strong>iBooks :</strong> 無聊～（我也這麼覺得）</li>
<li><strong>Enterprise : </strong>看不懂。。。（我也看不懂　囧）</li>
<li><strong>Game Center :</strong> 喔　（什麼“喔“！我要賺錢就靠它了）</li>
<li><strong>iAd : </strong>我討厭廣告　（我很喜歡耶　$_$）</li>
</ol>
<p>大概就是這樣啦～其實這裡只列出OS 4最主要的七大功能，剩下還有一堆有的沒的小更新，官方宣稱有一百種，大家就努力去挖吧～</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/647/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=647&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/04/11/%e6%85%98%ef%bc%81iphone-os-4%e7%99%bc%e8%a1%a8%e4%ba%86%ef%bd%9e/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>

		<media:content url="http://bonjouryentinglai.files.wordpress.com/2010/04/f_243164_1.jpeg" medium="image">
			<media:title type="html">f_243164_1</media:title>
		</media:content>
	</item>
		<item>
		<title>在Cocos2d中使用touch event</title>
		<link>http://bonjouryentinglai.wordpress.com/2010/03/28/%e5%9c%a8cocos2d%e4%b8%ad%e4%bd%bf%e7%94%a8touch-event/</link>
		<comments>http://bonjouryentinglai.wordpress.com/2010/03/28/%e5%9c%a8cocos2d%e4%b8%ad%e4%bd%bf%e7%94%a8touch-event/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 14:55:47 +0000</pubDate>
		<dc:creator>bonjouryentinglai</dc:creator>
				<category><![CDATA[Cocos2d]]></category>

		<guid isPermaLink="false">http://bonjouryentinglai.wordpress.com/?p=619</guid>
		<description><![CDATA[最近網友的回應讓我想到，教學寫了那麼多，好像還沒教過怎麼處理觸控事件。實在是天大的疏忽，這個教學應該在早早之前就寫了說。iPhone唯一能讓使用者輸入的介面就是那一大片的觸控螢幕，如果一個iPhone app沒有觸控功能，那還搞屁啊？今天我們就來看看如何在程式裡處理觸控事件。 如果你已經看過其他iPone SDK的相關書籍，大概會知道，iPhone的觸控主要由三個函式方法負責： ﹣(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; ﹣(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; ﹣(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 基本上看到函式的名稱就可以知道它所對應的功能。當使用者第一次按下螢幕時，touchesBegan的方法就會被觸發。如果使用者開啟移動，touchesMoved裡的程式便會被執行。最後一個touchesEnded就是當手指離開螢幕時要會觸發的函式。 這三個函式並沒有順序性的關係，也不需要三個函式的內容都寫，完全取決於這個app遇到對應的觸控事件時該怎麼處理對應的動作。 重點來了，如果你在cocos2d的CCLayer裡寫入這三個函式方法，是一點用處也沒有的，因為cocos2d有自己的觸控事件函式。但是也不用太擔心，基本上沒有什麼困難的地方，只不過就是在上述三個函式的名稱前加入cc兩個字而已： ﹣(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; ﹣(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; ﹣(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 至於為什麼要改名字，A兜。。。這個老實說我也不是很清楚，只能告訴你因為cocos2d並沒有直接繼承UIKit的類別，所以很多protocol都得重新稍微定義一下才行，大概是這個樣子。 好了，廢話不多說，來寫程式。這一次的程式目的是建立一個CCSprite物件，使用者可以觸碰這個物件並移動它，當使用者的手指離開螢幕後，物件會回到螢幕中心的位置。 前置作業就不再重覆了，開啟一個cocos2d專案，在HelloWorldScene.h裡的大括內加入 CCSprite *touchIcon; 接著到HelloWorldScene.m裡，把- (init)的部份改為下列程式碼： -(id) init　{ // always call 『super』 init // Apple recommends to re-assign 『self』 with the 『super』 return [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=619&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>最近網友的回應讓我想到，教學寫了那麼多，好像還沒教過怎麼處理觸控事件。實在是天大的疏忽，這個教學應該在早早之前就寫了說。iPhone唯一能讓使用者輸入的介面就是那一大片的觸控螢幕，如果一個iPhone app沒有觸控功能，那還搞屁啊？今天我們就來看看如何在程式裡處理觸控事件。</p>
<p>如果你已經看過其他iPone SDK的相關書籍，大概會知道，iPhone的觸控主要由三個函式方法負責：</p>
<blockquote><p>﹣(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;</p>
<p>﹣(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;</p>
<p>﹣(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;</p></blockquote>
<p><span id="more-619"></span><br />
基本上看到函式的名稱就可以知道它所對應的功能。當使用者第一次按下螢幕時，touchesBegan的方法就會被觸發。如果使用者開啟移動，touchesMoved裡的程式便會被執行。最後一個touchesEnded就是當手指離開螢幕時要會觸發的函式。</p>
<p>這三個函式並沒有順序性的關係，也不需要三個函式的內容都寫，完全取決於這個app遇到對應的觸控事件時該怎麼處理對應的動作。</p>
<p>重點來了，如果你在cocos2d的CCLayer裡寫入這三個函式方法，是一點用處也沒有的，因為cocos2d有自己的觸控事件函式。但是也不用太擔心，基本上沒有什麼困難的地方，只不過就是在上述三個函式的名稱前加入cc兩個字而已：</p>
<blockquote><p>﹣(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;</p>
<p>﹣(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;</p>
<p>﹣(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;</p></blockquote>
<p>至於為什麼要改名字，A兜。。。這個老實說我也不是很清楚，只能告訴你因為cocos2d並沒有直接繼承UIKit的類別，所以很多protocol都得重新稍微定義一下才行，大概是這個樣子。</p>
<p>好了，廢話不多說，來寫程式。這一次的程式目的是建立一個CCSprite物件，使用者可以觸碰這個物件並移動它，當使用者的手指離開螢幕後，物件會回到螢幕中心的位置。</p>
<p>前置作業就不再重覆了，開啟一個cocos2d專案，在HelloWorldScene.h裡的大括內加入</p>
<blockquote><p>CCSprite *touchIcon;</p></blockquote>
<p>接著到HelloWorldScene.m裡，把- (init)的部份改為下列程式碼：</p>
<blockquote><p>-(id) init　{<br />
// always call 『super』 init<br />
// Apple recommends to re-assign 『self』 with the 『super』 return value<br />
if( (self=[super init] )) {</p>
<p>self.isTouchEnabled = YES;</p>
<p> touchIcon = [CCSprite spriteWithFile:@"Icon.png"];<br />
[touchIcon setPosition:ccp(240,160)];<br />
[touchIcon setOpacity:100];<br />
[self addChild:touchIcon];<br />
}<br />
return self;<br />
}
</p></blockquote>
<p>這裡比較重要的大概就是self.isTouchEnabled = YES這行，主要功能就是把接收觸控事件的功能打開，這樣等等加入的觸控函式才能發揮功用。剩下就只是touchIcon這個物件的一些相關設定，這次比較偷懶，連圖檔都不附了，反正cocos2d模版裡就有圖檔，我們就直接拿來用，省去大家還要下載的麻煩。</p>
<p>接著就是今天的重頭戲了，我們要加入負責接收觸控事件的三個函式。將下列程式碼加到HelloWorldScene.m裡：</p>
<blockquote><p>- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {<br />
UITouch *myTouch = [touches anyObject];<br />
CGPoint location = [myTouch locationInView:[myTouch view]];<br />
location = [[CCDirector sharedDirector] convertToGL:location];</p>
<p>CGRect rect = CGRectMake(touchIcon.position.x -<br />
touchIcon.contentSize.width/2, touchIcon.position.y -<br />
touchIcon.contentSize.height/2,<br />
touchIcon.contentSize.width, touchIcon.contentSize.height);</p>
<p>if (CGRectContainsPoint(rect, location)) {<br />
[touchIcon setOpacity:255];<br />
}<br />
}</p>
<p>- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {<br />
UITouch *myTouch = [touches anyObject];<br />
CGPoint location = [myTouch locationInView:[myTouch view]];<br />
location = [[CCDirector sharedDirector] convertToGL:location];</p>
<p>CGRect rect = CGRectMake(touchIcon.position.x -<br />
touchIcon.contentSize.width/2, touchIcon.position.y -<br />
touchIcon.contentSize.height/2,<br />
touchIcon.contentSize.width, touchIcon.contentSize.height);</p>
<p>if (CGRectContainsPoint(rect, location)) {<br />
[touchIcon setPosition:location];<br />
}<br />
}</p>
<p>- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {<br />
UITouch *myTouch = [touches anyObject];<br />
CGPoint location = [myTouch locationInView:[myTouch view]];<br />
location = [[CCDirector sharedDirector] convertToGL:location];</p>
<p>CGRect rect = CGRectMake(touchIcon.position.x -<br />
touchIcon.contentSize.width/2, touchIcon.position.y -<br />
touchIcon.contentSize.height/2,<br />
touchIcon.contentSize.width, touchIcon.contentSize.height);</p>
<p> if (CGRectContainsPoint(rect, location)) {<br />
[touchIcon runAction:[CCMoveTo actionWithDuration:0.5 　　　　　　　　　　　　position:ccp(240,160)]];<br />
[touchIcon setOpacity:100];<br />
}<br />
}
</p></blockquote>
<p>這三個函式的結構大同小異，所以這裡就將相同的部份統一說明。</p>
<p>首先看到的是</p>
<blockquote><p>UITouch *myTouch = [touches anyObject];<br />
CGPoint location = [myTouch locationInView:[myTouch view]];<br />
location = [[CCDirector sharedDirector] convertToGL:location];
</p></blockquote>
<p>我們先建立一個UITouch物件myTouch，它的內容來自於touches。接著我們用locationInView這個方法從myTouch中取出觸碰的位置。最後一行相當重要，因為myTouch傳回的位置所用的座標原點是在螢幕左上角，但在cocos2d中所使用的座標原點則是在螢幕左下角，所以cocos2d提供了這個簡便的方法讓我們轉換兩者間的關係。這一步一定要記得做，不然到時觸控起來會很奇怪。</p>
<p>接著程式建立了一個CGrect，</p>
<blockquote><p>CGRect rect = CGRectMake(touchIcon.position.x &#8211; touchIcon.contentSize.width/2, touchIcon.position.y &#8211; touchIcon.contentSize.height/2,　touchIcon.contentSize.width, touchIcon.contentSize.height);
</p></blockquote>
<p>這是由Core Graphic所定義的矩形結構，我們用CGRectMake這個C語言函式來建立它。參數依序是矩形左下角的x和y值，以及矩形的寬和高。我們建立的這個大小就是touchIcon的範圍，有了這個範圍，我們再利用CGRectContainsPoint這個函式來判斷這個矩形是否有包函觸碰的位置。如果有，代表使用者按到這個圖形了，我們再依觸碰事件的種類來執行對應的動作，包括：</p>
<p><strong>ccTouchesBegan：</strong>使用者第一次按到touchIcon，把圖檔的透明度調成255（即不再半透明）。</p>
<p><strong>ccTouchesMoved：</strong>使用者開始移動手指，設定touchIcon的位置為手指移到的位置點。</p>
<p><strong>ccTouchesEnded：</strong>使用者手指離開螢幕，此時令touchIcon執行回到中心點的動作，並將圖檔調回半透明。</p>
<p>趕快run一下你的程式，操作起來應該會下面的影片一樣。基本的觸控事件處理大概就是這麼一回事，是不是很簡單呢？</p>
<span style="text-align:center; display: block;"><a href="http://bonjouryentinglai.wordpress.com/2010/03/28/%e5%9c%a8cocos2d%e4%b8%ad%e4%bd%bf%e7%94%a8touch-event/"><img src="http://img.youtube.com/vi/bqEdARtsPEY/2.jpg" alt="" /></a></span>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bonjouryentinglai.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bonjouryentinglai.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bonjouryentinglai.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bonjouryentinglai.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bonjouryentinglai.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bonjouryentinglai.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bonjouryentinglai.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bonjouryentinglai.wordpress.com/619/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bonjouryentinglai.wordpress.com&amp;blog=9479813&amp;post=619&amp;subd=bonjouryentinglai&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bonjouryentinglai.wordpress.com/2010/03/28/%e5%9c%a8cocos2d%e4%b8%ad%e4%bd%bf%e7%94%a8touch-event/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e4afd407cf5e5d1d1cceae9e534f41ac?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">bonjouryentinglai</media:title>
		</media:content>
	</item>
	</channel>
</rss>
