2009年4月28日 星期二

Giant Beetle Robot


好正!

2009年4月25日 星期六

Lottery Pro 回復原價

一個星期前,我把 Lottery Pro 的零售價調高一倍,即由 US$0.99 提升至 US$1.99。這個嘗試主要是想測試一下顧客的心理!當所有六合彩應用程式都是 US$0.99 時,而特別有一套最靚的六合彩應用程式收取 US$1.99 的話,究竟顧客會如何選擇?雖然售價調高一倍,但實際上只是 HK$8 的差別,因此值得嘗試做今次的實驗。

經過七天的嘗試,整體銷售金額下跌了 15%,亦即是說有 57.5% 的顧客不在乎六合彩應用程式是否美觀,只在乎價錢。我也把 Lottery Pro 的零售價調回原價。

2009年4月20日 星期一

關於 Availability Date 的運作

跟據上次「命運時計 Destiny Clock」的經驗,Apple 需要一個星期的時間去完成審批;今次「愛情配對 Love Pair」在上傳一星期後的今天,也順利通過審批,正式上架了。

我原先把「愛情配對」的發售日設定為5月1日,但發現審批通過後,會自動放上架公開發售。因此我對於 Availability Date 的運作起了疑問;後來我把日期重新設定在5月1日,便發現不能再從 iTunes 上找到,亦意味著已經落架。

根據這個經驗,應用程式在獲得審批時會立即上架,如果真的要按預定的時間才上架的話,便需要重新把發售日儲存一次。

2009年4月19日 星期日

UIImageView Mask 的製作方法

第四個 iPhone 作品的介面中會用上計時棒。隨著時間流逝,計時棒會慢慢變短。直覺上,要達成這個外觀,就需要用上 Mask 技巧。在網上搜尋過後,也沒有針對 UIImageView 的遮罩技術;我嘗試解拆別人的遊戲,發現他們是用很多張圖來達成。這個做法不但浪費儲存空間,效果亦不會流暢。我只好自行研究,幸好已初見成效。

首先要建立 UIImage 及 UIImageView:

imageTimebar = [UIImage imageNamed:@"Timebar.png"];
viewTimebar = [[UIImageView alloc] initWithImage:imageTimebar];
viewTimebar.center = CGPointMake(35+(284/2), 55);

並在 drawRect:(CGRect)rect 函數加入:

rect = CGRectMake(0, 0, iTimeLeft, 22);
CGImageRef image = imageTimebar.CGImage;
CGImageRef masked = CGImageCreateWithImageInRect(image, rect);
UIImage *imageNew = [UIImage imageWithCGImage:masked];
viewTimebar.image = imageNew;
viewTimebar.frame = CGRectMake(35, 55, iTimeLeft, 22);
CFRelease(masked);
iTimeLeft--;

2009年4月18日 星期六

製作 CAF 格式的方法

在 Love Pair 以後的 iPhone Applications 都會加入音效,因此少不免用上 CAF 格式的音效檔案。在製作的過程中,我會使用 WAV 格式來做編輯,貪其優質音色。因此,完成編輯後便需要把 WAV 格式轉換為 CAF 格式。我的做法是把 WAV 檔案匯入到 iTunes,然後輸出成 AIFF 格式。再把檔案改名為 CAF。這樣便能匯入到 iPhone 專案內。

2009年4月17日 星期五

判斷相片上不同部份的技巧

這是我自行研究出來的技巧。方法很簡單:
1) 把兩張相同大小的相片,以點對點的方式做比較
2) 做比較時會容許偏差,因而建立了 Color Thresold 值
3) 當兩個像素的偏差值大於 Color Threshold 時,程式會把座標記錄
4) 記錄時會先檢查當前座標是否在過往記錄的容許範圍內(Distance Thresold)
5) 如果在容許範圍內,今次的座標會跟過往記錄結合
6) 否則會建立新的記錄
7) 按這個做法比較全張相片
8) 最後得出數個範圍資料,就是不同處的地方

要設立 Color Thresold 值是因為我曾經在 Photoshop 中建立一張黑底白色英文字的圖片,之後把某些字母換成其他顏色。我發現這個做法會造成某些白字的邊緣像素產生變化,從而令到程式誤以為是不同點。加入這個數值之後,問題解決了一半。

另一個問題是出現像「X」、「i」、「j」的情況,如果座標只記錄相連的像素時便會出現問題,因此加入容許範圍值 Distance Thresold 去解決這個問題。

2009年4月16日 星期四

第四作品開發工具


我的第四個作品是一個找碴遊戲。原先是第一個作品,卻因為想以最短時間進行一次 iTunes Store 實作,所以先造最簡單的 Lottery Pro;後來亦因為想鍛鍊好自己的編寫能力及準備好共用模組,因而開發了第二作品 Destiny Clock 及其伸延作品 Love Pair。到現在,終於能繼續這個作品的開發計劃。

由於這個作品會用上大量的圖案,花費在開發上的時間也相對增多。為減低開發成本,我決定把重複性的工作交給電腦。因而利用 C# 編寫出這個圖片對比工具。這個工具會讀取資料夾中的相片,並進行比較;當找到不同的部份後,會將它記錄下來,把不同的部份輸出成個別的 PNG 檔案,並以不同顏色的方框顯示出來;最後更會將所有圖片資料輸出到 XML 檔案之內,作為 iPhone 遊戲程式內的資料檔。

在製作這個工具遇到最大的困難是:如何判斷相片上的不同部份?如果單以像素來判斷,若遇上X形狀時,又如何知道哪些像素是在同一個部份?最終,我也想出了一個簡單的方法,而且出來的效果也很好。雖然作為一個工具,速度的快慢不太重要,但我的宗旨是「既然可快,為何不快?」。所以,也把工具的效率提升了!

2009年4月15日 星期三

Daily Top 50


一直以來,當我在 iTunes Connect 檢閱下載報告時,左上角一直都出現 Daily Top 50 字眼。究竟是甚麼意思?是指我的 Lottery Pro 成為當天下載量最多的頭五十名?還是以我整個帳戶來計算?是以香港的下載數量來計算?還是美國?甚至全球?還是有其他意思?

以我的估計,應該是以我的戶口來計算,原因是 Report 中有時包含不止 Lottery Pro 一個軟件;而範圍方面,應該是全球吧!否則應該會標明在那個地區成為首 50 名,再加上不是每天都有香港的顧客購買我的作品。如果以上假設成立的話,我實在有點擔心,以我現時的銷量可以成為下載量全球首 50 名,豈不是大部份人賺不了錢?!不過,亦可能同一名次可以容納很多人也說不定,即是有 100 位第 50 名的用戶。真的想了解計算的標準。

研究過後,這個 Daily Top 50 應該是顯示自己帳戶內,最頭 50 筆下載資料而已。

2009年4月13日 星期一

Love Pair 審批進行中


昨天研究過 Memory Leaks 的結果,發現大部入的 Memory Leaks 都是由系統產生;而關於 Love Pair 的則只有一個由 Autorelease 造成。今天,我作最後修改後,便把 Love Pair 上傳到 App Store 等待 Apple 方面的審批。

「愛情配對」是一個計算感情關係的應用程式。它利用中國術數中八字五行的平衡狀況來計算出兩位人仕的感情基數。透過了解先天的感情基數,再加以後天的努力,便能創造出美滿的關係。「愛情配對」絕對不僅僅適用於情侶關係,也適用於朋友關係、親人關係。

2009年4月12日 星期日

Lottery Pro v1.1 上架

Lottery Pro v1.1 兩次遭到審批被拒後,最終在昨晚得到通過。相信是回歸銷售日排行榜的原故,昨天的下載數字立即彈跳到最初的銷情!十分感謝支持 Lottery Pro 及 Destiny Clock 的顧客!

2009年4月11日 星期六

第三作品 Memory Leak?


經過這兩天全力趕工之後,我的第三個作品已經完成,並進入最後的調整及除錯階段。可是在測試中出現兩次記憶體洩漏。不知道這個情況是由系統產生,還是由我的代碼產生,事關這個洩漏的圖像是呈錐形,意味著洩漏的記憶體也遭到釋放,代表了沒有問題?看來要研究一下 Instruments 的使用方法。今個作品花了很多心血及時間,我自己感到十分滿意。希望今次的記憶體洩漏情況能盡會解決,好讓她能在五月一日上架。

2009年4月10日 星期五

非整數座標出現的結果

iPhone 是支援小數點座標,在 2D 的環境下比較少用。而我基本上只使用整數座標。在製作第三個作品時,發現原來 iPhone 在處理小數座標時,是會把 UIImageView 圖像作小數化處理。事緣有一張單數闊度的圖像,在顯示時我用上了 UIImageView.center 來處理座標位置。由於是設定中心點,所以單數闊度的圖像便會出現小數點座標,從而影響了原本圖像的內容。上圖左邊就是剛才所說的例子;而右邊的是原圖,大家可以看出箇中分別。

2009年4月9日 星期四

UIPickerView 陷阱

最近幾天都忙於同時開發第三及第四個作品,希望盡快能把更多的作品推出市場,賺取第一桶金。在開發的過程中,無意中發現了使用 UIPickerView 時十分容易跌入的陷阱。在正常的情況下,我們都是用 didSelectRow:(NSInteger)row inComponent:(NSInteger)component 來得知某一行的資料被選定了,從而讀取其數值;原來這個處理方法,在同時有多行捲動時,便會出現錯失訊號的情況。解決辦法是在 didSelectRow 內,不在按 component 來更新數值,取而代之是直接調用 selectedRowInComponent 來取得所有行的數值。這樣,問題便能解決。

2009年4月7日 星期二

UITextField 之用法

我的第三個 iPhone 作品需要用上 UITextField。之前利用 Interface Builder 時,很簡單便用得到;而在非使用 Interface Builder 的情況下,需要研究一下才能領會。其實用法也很簡單。只要在 .h 中宣告 UITextFieldDelegate 後,在 .m 中建立 UITextField:

並加入處理輸入後的程序,取得所輸入之字串便完成:

2009年4月5日 星期日

Destiny Clock 上架


經歷了一個星期的時間,Destiny Clock 終於都上架了。今次的審批比起上次 Lottery Pro 的三天時間多出了 100%。可能是 iTunes App Store 有越來越多的應用程式需要審批吧。

2009年4月4日 星期六

XCode Project Template


今天學到新的捷徑,就是把最常使用的檔案或專案建立一個範例,令以後建立檔案時,不用再人手修改適合自己的檔案內容。方法很簡單,只要在 \Developer\Platforms\iPhoneOS.platform\Developer\Library\XCode\Project Templates〔或 File Templates〕下,把合用的 Template 複製一份出來,並把相關檔案修改及儲存。當下次建立檔案或專案時,選擇新複製出來的名稱即可。特別留意的是,檔案中可以加入特別變數,如:___PROJECTNAMEASIDENTIFIER___、«FILEBASENAMEASIDENTIFIER»,以迎合檔案名稱。

2009年4月2日 星期四

iPhone:播放音效

這幾天沒有其他工作在手,於是加緊開發第三個 iPhone 應用程式。這個應用程式是繼承了上一個作品衍生出來的實用工具。雖說是工具,但今次需要更多的聲光效果,於是我在網上搜尋了數個關於播放音效的例子,原來十分簡單易用。

方法如下:
一)從 Apple 下載 BubbleLevel 官方示範程式
二)把 BubbleLevel 內的 SoundEffect.m 及 SoundEffect.h 抄到自己的專案
三)加入 AudioToolBox Framework
四)在建立 View 的部份加入以下代碼:

NSBundle *mainBundle = [NSBundle mainBundle];
mySFX = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"SoundFile" ofType:@"caf"]];

*以上是假設播放 SoundFile.caf
五)在需要播放音效的地方加入 [mySFX play];