2010年11月26日 星期五

Indexed-Alpha

在《銀行大亨》中一直想加入多一點客人角色及其動作圖片;但礙於公司政策,遊戲必須在 20MB 以下,唯有將圖量減少。我的下一個作品亦不例外。作為一個創作人,追求更流暢細膩的動畫是我其中一個目標;因此在新作的初階,我嘗試研究一下相關技術。發現在 Adobe Fireworks 中能輸出一種新的 PNG 格式。它是 Indexed color 256 色的格式,但卻擁有 alpha 漸變透明的支援。

我把圖片放進 iPad 及 iPod Touch,確定真機能支援這個格式,效果十分好。而圖檔大小在 Device Build 中只增加了 4KB,比起原先 RGBA 細小很多,十分適合作為遊戲的開發。

2010年11月22日 星期一

AppSales Mobile 多帳號支援

AppSales Mobile Mulit-Accounts Support

一直以來都很愛用 AppSales Mobile,貪它功能齊全及方便;相對比起 Apple 那個,真是跑驘十條街。雖然如此,但它還有美中不足之處,就是對於中文的數據輸入會出現亂碼,以及沒有多帳號(Multiple Accounts)支援。既然作者提供了源碼,那就自己動手來改。最簡單的修改是把 App.m 中的 getDocPath 以帳號名來劃分,其改動如下:
NSString* getDocPath() {
// static NSString *documentsDirectory = nil;
// if (!documentsDirectory) {
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// documentsDirectory = [[paths objectAtIndex:0] retain];
// }
// return documentsDirectory;

// Pacess: Added username as prefix for multiple accounts support
NSString *documentsDirectory = nil;
NSString *username = [[NSUserDefaults standardUserDefaults] stringForKey:@"iTunesConnectUsername"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:username];
return documentsDirectory;
}
使用這個改動時,在設定頁面輸入帳號名稱後,需要重新啟動 AppSales Mobile 才進行更新;否則會出現問題。原因是源碼沒有登出機制,要是剛檢查了帳號 A 的報告再登入帳號 B 的話,系統會誤以為仍然是帳號 A。雖然使用上有點不便,但只憑這麼簡單的改動,方法算是接受到吧!

2010年11月21日 星期日

粒子系統 DEMO 程式

星期三會到廣州辦公室講課,主要教授國內同事在 iPhone 上開發「Particle System」的技巧。為了方便大家理解,亦能使美工看到效果,我決定製作一個簡單的「粒子系統示範程式」,讓同事可以即場修改相關數值並看到效果。

2010年11月20日 星期六

《親子王下載工具》發佈...失敗!

《親子王下載工具》的介面也完成了,正式成為一個製成品。原本打算製作一個 Jailbreak IPA 檔案,方便有需要的網友。可是在 iPhone iOS 3.1.3 上執行時,一點擊「立即下載」便彈回 SpringBoard;而在 iPhone 4 iOS 4.1 上是能執行,但下載到第 36 頁時亦發生彈回 SpringBoard 的情況;相信是由於記憶體不足所導致。一期《親子王》的 PDF 在原有解像度下大約需要 130MB,要花上這麼多記憶體,解決方法的而且確是一個大難題...。

暫時只能在有源碼的情況下,在模擬器上執行吧~

2010年11月19日 星期五

Banker 躍升第一位

上架兩天,終於都成為香港 AppStore 角色扮演類第一名!在美國 AppStore 角色扮演類亦得到第 16 名,直迫 SquareEnix 的 Final Fantasy 系列。多謝大家支持!

2010年11月18日 星期四

《親子王下載工具》製作方法(三)

取得 PictureLayer 及 TextLayer 圖片後,要做的是把它們合併,放進 PDF Context 並且建立 PDF 檔。一本《親子王》共有 76 頁,所以要下載 76 次。
- (void)download:(unsigned int)year month:(Byte)month day:(Byte)day  {
UIImage *pictureImage, *textImage, *finalImage;
NSString *string, *api, *filename;
BOOL contextCreated = NO;
NSData *data;
Byte page;

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableData *pdfData = [NSMutableData data];

for (page=1; page<=76; page++) {
NSLog(@"[download] Processing page %d...", page);
pictureImage = nil;
textImage = nil;

// Get text layer image
api = [NSString stringWithFormat:NETWORK_API_TEXT, year, month, day, page];
string = [NSString stringWithFormat:@"%@%@", NETWORK_SERVER, api];
data = [SmartParentsDownloaderViewController getDataFromFullURL:string];
if ([data length] > 10) {
textImage = [UIImage imageWithData:data];
}

// Get picture layer image
api = [NSString stringWithFormat:NETWORK_API_PICTURE, year, month, day, page];
string = [NSString stringWithFormat:@"%@%@", NETWORK_SERVER, api];
data = [SmartParentsDownloaderViewController getDataFromFullURL:string];
if ([data length] <= 10) {continue;}

pictureImage = [UIImage imageWithData:data];

if (contextCreated == NO) {
contextCreated = YES;
CGRect rect = CGRectMake(0, 0, pictureImage.size.width, pictureImage.size.height);
UIGraphicsBeginPDFContextToData(pdfData, rect, nil);
}

// Merge two uiimage
if (textImage != nil) {
UIGraphicsBeginImageContext(pictureImage.size);
[pictureImage drawAtPoint:CGPointZero];
[textImage drawAtPoint:CGPointZero];
finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
} else {
finalImage = pictureImage;
}

UIGraphicsBeginPDFPage();
[finalImage drawAtPoint:CGPointZero];
}

if (contextCreated == NO) {return;}

UIGraphicsEndPDFContext();

filename = [NSString stringWithFormat:@"SmartParents_%04d_%02d_%02d.pdf", year, month, day];
string = [SmartParentsDownloaderViewController getDocumentFilePath:filename];
[pdfData writeToFile:string atomically:YES];

[pool release];
}

2010年11月17日 星期三

《親子王下載工具》製作方法(二)

有了取得 PictureLayer 的網址及 TextLayer 的網址後,要做的是下載這兩張圖片。

+ (NSData *)getDataFromFullURL:(NSString *)fullURL {

// Create HTTP GET request
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:fullURL]];
[request setHTTPMethod:@"GET"];
[request setTimeoutInterval:5.0f];

// Get response
NSHTTPURLResponse *urlResponse = nil;
NSError *error = [[[NSError alloc] init] autorelease];
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

// Response received
return responseData;
}

2010年11月16日 星期二

《親子王下載工具》製作方法(一)


要製作《親子王下載工具》,首先要了解如何取得《親子王》PDF 檔。

利用 Wireshark 進行封包欄截,發現了 PDF 檔名格式是 SMP_2010_11_11.PDF。可惜的是我無法找到它的路徑,所以無法直接儲存 PDF 檔案。既然讀者在《親子王》官網能免費一頁一頁地閱讀,即是說每一頁的圖案也會下載到電腦內。於是我利用 Internet Explorer 載入數頁後,到電腦內的 Temporary Internet Files,以「最後存取時間」逆排,很容易便看到《親子王》的檔案。原來《親子王》每一頁的圖案都是由一個 PNG 加一個 JPG 檔組成。JPG 是 PictureLayer 圖案,而 PNG 是 TextLayer 圖案。兩者合而為一便成為一頁的內容。在每個 PNG 或 JPG 檔名右方的內容,便是取得該檔案時的網址。這個網址對製作《親子王下載工具》十分重要。

2010年11月15日 星期一

File Sharing 設置


《親子王下載工具》會把下載到的每一頁圖片合成到一個 PDF 檔案,而檔案會儲存在 Documents 目錄下。為了方便存取 PDF,我特別在 plist 中加入了 Application supports iTunes file sharing。這樣便能在 iTunes > Apps 下的 File Sharing 項目下直接存取 PDF 到電腦內。

2010年11月14日 星期日

親子王 PDF


我一直有索取親子王雜誌的習慣,到目前為止已經有 34 本。所佔的空間也越來越多。為了方便搜尋資料,我很想能把它以數碼方式儲存,甚至是放進 iPad 內。可是,官方的網頁內沒有儲存 PDF 的選項,所以我撰寫了一個 iPhone 程式來擷取親子王成為 PDF。

2010年11月12日 星期五

《銀行大亨》高清版及免費版提交了

《銀行大亨》高清版及免費版都在昨天提交了。而標清版亦已經提交了一個星期,卻沒有得到 Apple 任何的回覆,看來 Steve Jobs 一個星期的承諾又變成廢話了。

2010年11月8日 星期一

iOS 4.2 引發的問題(三)

實驗過後,發現方法取得成功,能繼續讓 iPhone 4 及 iPad 共用同一組圖片。方法是利用 initWithCGImage 並加入一個自行設定的 scaleFactor:
//=====================================================================================================================
@interface UIImage (RetinaMod)
- (id)initWithContentsOfResolutionIndependentFile:(NSString *)path;
+ (UIImage*)imageWithContentsOfResolutionIndependentFile:(NSString *)path;
@end

//=====================================================================================================================
@implementation UIImage (RetinaMod)

//---------------------------------------------------------------------------------------------------------------------
- (id)initWithContentsOfResolutionIndependentFile:(NSString *)path {
NSString *systemVersionString = [Common getSystemVersion];
int systemVersion = [systemVersionString intValue];

// Check scale if OS support scale
CGFloat scaleFactor = 1.0f;
if ([[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"scale")]) {
scaleFactor = [[UIScreen mainScreen] scale];
}

NSData *data = [NSData dataWithContentsOfFile:path];
if (systemVersion >= 4 && scaleFactor == 2.0f) {
UIImage *image = [UIImage imageWithData:data];
return [self initWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
}

return [self initWithData:data];
}

//---------------------------------------------------------------------------------------------------------------------
+ (UIImage *)imageWithContentsOfResolutionIndependentFile:(NSString *)path {
UIImage *image = [[[UIImage alloc] initWithContentsOfResolutionIndependentFile:path] autorelease];
return image;
}

@end

2010年11月7日 星期日

iOS 4.2 引發的問題(二)

今日找到一個方法,似乎能使 iPhone 4 及 iPad 共用圖檔資源之餘,亦能避免在 iPad 下出現 Retina 模式。明天會做一下實驗,希望能夠成功!

2010年11月5日 星期五

《銀行大亨》標清版已經提交


《銀行大亨》標清版已經提交。我們在 iOS 4.2 測試過沒有問題,相信十天後便能上架。

標清版主要是給 iPhone, iPhone 3G, iPhone 3GS, iPod Touch 等非 Retina Display 的裝置使用;而高清版則是所有機型均可使用,亦即是說包含了標清版在內。

2010年11月3日 星期三

Robocon 72


今日收到了最新一期 Robocon 雜誌。回顧最近幾期,沒有甚麼新鮮高技術的內容,都是 Line Trace Car、簡單機械人講解...等題材。開始覺得有點沉悶...。

2010年11月2日 星期二

iOS 4.2 引發的問題

昨天收到 Apple 的電郵,指 iOS 4.2 及 SDK 4.2 已開放給開發人員下載。這意味著 Apple 會把新提交的作品主力放在 iOS 4.2 上測試。由於我最新的作品會在星期五提交;所以機我把 iPod Touch 及 XCode 都升級至 iOS 4.2 及 SDK 4.2,以作最後測試。

可是,我發現在 iPad 4.2 會出現圖片比例問題。這是由於在設計上共用了 iPhone 4 及 iPad 版的圖片資源所導致。為了節省資源,iPad 版使用了 iPhone 4 的圖案,很多檔名都使用了 @2x 格式,導致在 iOS 4.2 上執行時,誤以為是 Retina 格式而令到圖案尺寸縮小了 50%。由於 UIImage 的 scaleFactor 是只能讀取而不能寫入。所以暫時的解決方法是把 iPad 及 iPhone 4 圖檔分開,不再共用資源...。