2010年10月30日 星期六

多點觸控試驗

今日做了 Multi-Touch 測試,原本拿 [touches Count] 來檢測觸控點的數目,可是在任何情況都是 1。於是我改用 [event allTouches] 後便成功了:
- (void)touches:(NSSet *)touches withEvent:(UIEvent *)event  {
NSSet *touchArray = [event allTouches];
NSMutableString *string = [[[NSMutableString alloc] init] autorelease];
[string appendFormat:@"Event count: %d\nTouch count: %d", [touchArray count], [touches count]];
[textView setText:string];
}

2010年10月29日 星期五

Barney 時鐘


回到家後,發現大廳的時鐘因為最近乾燥的天氣而開始變得破爛;對於追求完美的我,實在看不順眼,於是決定自製鐘面,把時鐘換一換面。

我決定製作一個大女喜愛的時鐘,於是在網上找一些 Barney 的圖片,作為鐘面的圖案。量度過鐘面的直徑後,在 Photoshop 解立了一張新圖,把選好了的 Barney 圖片放進去。可是,鐘面數字的位置就不知道如何能在 Photoshop 中準確量度;於是我用 Illustrator 來幫忙。在 Illustrator 中建立新文件,加入一個大圓型,目的是作為裁剪的參考線,以及拿圓心來對準鐘面上 12 個數字。首先加入置中的數字 12,然後點選旋轉工具,再按著 Option 鍵選圓心。角度 30 度,點選 Copy 複製。再按 10 次 Command-D。鐘面的數字便會齊全。新增一個圖層,畫一個小圓並放在數字 12 的中央,然後重覆以上的複製步驟。這個小圓是用作鐘面數字旋轉之用。把 12 個數字設定好數值,通常都是 1-12,也可以是分鐘數字,即 5, 10, 15,...60。

這時的鐘面數字基本上已經完成,但數字會比較難看得清楚。我們只需要點選數字,再點選旋轉工具,按著 Option 鍵選小圓心把旋轉軸設定為數字中央,輸入適當的角度。完成後,可以把沒有用的圖層隱藏。選擇所有內容並複製,在 Photoshop 內貼上便完成。

2010年10月28日 星期四

animationWithKeyPath

最近很常用 CAKeyframeAnimation 來製作動畫,但有時想找出 animationWithKeyPath 的值卻很困難,所以在這裡歸納一下:
transform.scale = 比例轉換
transform.scale.x = 闊的比例轉換
transform.scale.y = 高的比例轉換
transform.rotation.z = 平面圖的旋轉
opacity = 透明度

2010年10月26日 星期二

另一好用工具:NameChanger


在製作遊戲的過程,有時會用上 SpriteSheet;有時也會用上零零碎碎的圖檔。很多時候為了方做編程,檔名都會是由順序數字組成。由於很難做到徹底的溝通,美術人員很多時都會隨意把圖檔命名;當圖檔到達程序員手上時,往往需要重新命名。今次介紹的 NameChanger 便能幫到手!

2010年10月25日 星期一

解密至 NSString

昨天加密了的 NSString,其解密方法為:
+ (NSString *)decodeString:(NSString *)string withFormat:(NSStringEncoding)format  {

// Convert incoming string to ASCII data first
NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding];
const Byte *incomingArray = [data bytes];

// Allocate decode buffer
int charCount = [string length]/2;
Byte *byteArray = malloc(charCount);

int sourceOffset = 0;
int targetOffset = 0;
for (int i=0; i Byte highByte = incomingArray[sourceOffset+0];
Byte lowByte = incomingArray[sourceOffset+1];
sourceOffset += 2;

if (highByte >= '0' && highByte <= '9') {highByte -= '0';}
if (highByte >= 'a' && highByte <= 'f') {highByte -= ('a'-10);}

if (lowByte >= '0' && lowByte <= '9') {lowByte -= '0';}
if (lowByte >= 'a' && lowByte <= 'f') {lowByte -= ('a'-10);}

Byte charValue = (highByte<<4)|lowByte;

// Decryption
charValue ^= 117;

byteArray[targetOffset] = charValue;
targetOffset++;
}

// Convert byte array to NSString
NSString *decodedString = [[NSString alloc] initWithBytes:byteArray length:charCount encoding:format];
free(byteArray);

return decodedString;
}

2010年10月24日 星期日

把 NSString 加密

最近編寫了一個把數據傳送到服務器的程序。但由於包含了文字及字符,所以不方便直接傳送。於是便需要編寫一個加密功能:
+ (NSString *)encodeString:(NSString *)string  {
if (string == nil) {return string;}

NSMutableString *resultString = [[[NSMutableString alloc] init] autorelease];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
const Byte *byteArray = [data bytes];
int length = [data length];

for (int i=0; i < length; i++) {
Byte byteValue = byteArray[i];
byteValue ^= 117;

[resultString appendFormat:@"%02x", byteValue];
}

return resultString;
}

判斷 Game Center 的方法

原本《超級銀行家》是加入公司自行推出的 LakooSNS 來進行玩家之間的交流;但礙於始終不夠 Apple Game Center 的競爭,所以決定改用 Game Center。而我一向追求「一個版本走天涯」及「支援最大機款」的前提下,iOS 3.0 版本的用家是無法使用 Game Center,所以在遊戲內便需要即時判斷是執行 Game Center 相關的功能。方法如下:
+ (BOOL)isGameCenterAvailable  {
// Check for presence of GKLocalPlayer API.
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

// The device must be running running iOS 4.1 or later.
NSString *reqSysVer = @"4.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);

return (gcClass && osVersionSupported);
}

2010年10月19日 星期二

Points App 消失...

今天收到 Apple 中國員工的通知,說 Apple 正在整頓所有包點的 App(就好像 Mafia War 那些分好幾個點數版本的 App),需要全面下架。並把購買點數改以 In-App Purchase 方式出現。而每次 In-App Purchase 最大價錢只能為 US$99。

2010年10月17日 星期日

PNG Crusher


今日找到了一個工具,能有效減少 PNG 的檔案大小,它就是「PNG Crusher」。用法也很簡單,只要把所需減肥的 PNG 拖拉到 PNG Crusher 圖示上,放手後便會進行瘦身。檔案會被 Overwrite 成為纖型版。經測試後,減肥率比 XCode 有效,能節省一點空間。

2010年10月16日 星期六

Machinarium


早幾天,同事阿魚介紹了一套超華麗的 WEB Game 給我。它的名字是「Machinarium」(http://machinarium.net/demo)。阿魚說得沒錯,真的是超華麗之作。

由於阿魚知道我的黑技術有點斤兩,所以向我要求把打它的圖黑下來作為參考學習之用。基於這個動機我十分認同,所以我答應了他。

要黑「Machinarium」最重要的工具是 Internet Explorer。沒錯,貪它隨手可得及白痴是也。啟動「Machinarium」一會後,到 Temporary Internet Files,以時間逆排,會看到幾個 101010.100 的檔案。把它們拷出來並改為 xxxxx.swf,再用 Flash Decompiler 反組譯便行。

2010年10月15日 星期五

突破 20MB 限制

《超級銀行家》是一套「支援所有版本」的遊戲;亦即是說付費一次,便能同時享受 iPhone, iPad 及 iPhone 4 版本。這個設計基於想方便有 iPhone 及 iPad 的玩家;而且亦有助下載點擊率、搜尋出現率、排行榜爬升能力。能集合這些優點是要付出代價,就是 IPA 大小已經突破了 Apple 規定在手機直接下載的 20MB 限制。由於這個限制會打擊「即興意慾」,所以我也得想辦法令 IPA 大小下降至 20MB 以下的水平。

方法不外乎是:
1) 使用相同資源,特別是 iPad 及 iPhone 4
2) 把音樂由雙聲軌轉換成單聲軌(是很有效的方法)
3) 減少圖片色深
4) 使用 JPG 代替 PNG
5) 把不常用的資源分拆到服務器,有需要時下載
6) 壓縮檔案

2010年10月8日 星期五

《超級銀行家》Banker 進入最後開發階段


小弟最新力作《超級銀行家》已經進入最後開發階段。它是我第一次嘗試的 Universal Binary 作品;一 App 同時支援 iPhone, iPhone 4 及 iPad。語言方面同時支援正體中文、簡體中文、英文及日文。

《超級銀行家》是一套「時間管理類」作品。今次擔任項目管理、遊戲設計、編程設計,花了很多時間及心血製作,希望能獲得玩家的喜愛。

2010年10月2日 星期六

Twitter API on iPhone

今日的研究題目為 Twitter API。網遊了一會,發現了三個 Sample Code,它們的共通點是使用 MGTwitterEngine。我曾嘗試 MGTwitterEngine 但久缺很多檔案,無法 Build 出一個版本來測試。原因是這個 Engine 是 Objective-C 系,能夠給 Snow Leopard 及 iPhone 平台使用,自然需要多一點內容。有網友把當中 iPhone 不用到的部份刪除,可惜我仍然無法令它正常運作。Twitter 官網不像 Facebook 那般體貼,清楚及有系統地指引開發人員使用官方 API,只好留待日後再花時間研究研究。

2010年10月1日 星期五

在應用程式中發電郵

要在 App 內發 eMail 十分簡單。在 iOS 3.0 之後,iPhone SDK 提供了 MFMailComposeViewController 給開發員來處理發放電郵。
- (void)sendEmail:(NSArray *)recipientsArray subject:(NSString *)subject message:(NSString *)message html:(BOOL)isHTML  {
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:subject];
[controller setToRecipients:recipientsArray];
[controller setMessageBody:message isHTML:isHTML];
[self presentModalViewController:controller animated:YES];
[controller release];
}