在《銀行大亨》中一直想加入多一點客人角色及其動作圖片;但礙於公司政策,遊戲必須在 20MB 以下,唯有將圖量減少。我的下一個作品亦不例外。作為一個創作人,追求更流暢細膩的動畫是我其中一個目標;因此在新作的初階,我嘗試研究一下相關技術。發現在 Adobe Fireworks 中能輸出一種新的 PNG 格式。它是 Indexed color 256 色的格式,但卻擁有 alpha 漸變透明的支援。
我把圖片放進 iPad 及 iPod Touch,確定真機能支援這個格式,效果十分好。而圖檔大小在 Device Build 中只增加了 4KB,比起原先 RGBA 細小很多,十分適合作為遊戲的開發。
My studies, development and creations on Robotics, iPhone Apps, Andriod Apps,...etc.
2010年11月26日 星期五
2010年11月22日 星期一
AppSales Mobile 多帳號支援
AppSales Mobile Mulit-Accounts Support
一直以來都很愛用 AppSales Mobile,貪它功能齊全及方便;相對比起 Apple 那個,真是跑驘十條街。雖然如此,但它還有美中不足之處,就是對於中文的數據輸入會出現亂碼,以及沒有多帳號(Multiple Accounts)支援。既然作者提供了源碼,那就自己動手來改。最簡單的修改是把 App.m 中的 getDocPath 以帳號名來劃分,其改動如下:
一直以來都很愛用 AppSales Mobile,貪它功能齊全及方便;相對比起 Apple 那個,真是跑驘十條街。雖然如此,但它還有美中不足之處,就是對於中文的數據輸入會出現亂碼,以及沒有多帳號(Multiple Accounts)支援。既然作者提供了源碼,那就自己動手來改。最簡單的修改是把 App.m 中的 getDocPath 以帳號名來劃分,其改動如下:
NSString* getDocPath() {使用這個改動時,在設定頁面輸入帳號名稱後,需要重新啟動 AppSales Mobile 才進行更新;否則會出現問題。原因是源碼沒有登出機制,要是剛檢查了帳號 A 的報告再登入帳號 B 的話,系統會誤以為仍然是帳號 A。雖然使用上有點不便,但只憑這麼簡單的改動,方法算是接受到吧!
// 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;
}
2010年11月21日 星期日
粒子系統 DEMO 程式
2010年11月20日 星期六
《親子王下載工具》發佈...失敗!

暫時只能在有源碼的情況下,在模擬器上執行吧~
Labels:
iPhone,
SmartParents
2010年11月19日 星期五
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];
}
Labels:
iPhone,
Learning,
SmartParents
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;
}
Labels:
iPhone,
Learning,
SmartParents
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 檔名右方的內容,便是取得該檔案時的網址。這個網址對製作《親子王下載工具》十分重要。
Labels:
iPhone,
Learning,
SmartParents
2010年11月15日 星期一
File Sharing 設置

《親子王下載工具》會把下載到的每一頁圖片合成到一個 PDF 檔案,而檔案會儲存在 Documents 目錄下。為了方便存取 PDF,我特別在 plist 中加入了 Application supports iTunes file sharing。這樣便能在 iTunes > Apps 下的 File Sharing 項目下直接存取 PDF 到電腦內。
Labels:
iPhone,
Learning,
SmartParents
2010年11月14日 星期日
2010年11月12日 星期五
《銀行大亨》高清版及免費版提交了
《銀行大亨》高清版及免費版都在昨天提交了。而標清版亦已經提交了一個星期,卻沒有得到 Apple 任何的回覆,看來 Steve Jobs 一個星期的承諾又變成廢話了。
Labels:
Game Development,
iPad,
iPhone
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日 星期日
2010年11月5日 星期五
《銀行大亨》標清版已經提交

《銀行大亨》標清版已經提交。我們在 iOS 4.2 測試過沒有問題,相信十天後便能上架。
標清版主要是給 iPhone, iPhone 3G, iPhone 3GS, iPod Touch 等非 Retina Display 的裝置使用;而高清版則是所有機型均可使用,亦即是說包含了標清版在內。
Labels:
Game Development,
iPhone
2010年11月3日 星期三
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 圖檔分開,不再共用資源...。
可是,我發現在 iPad 4.2 會出現圖片比例問題。這是由於在設計上共用了 iPhone 4 及 iPad 版的圖片資源所導致。為了節省資源,iPad 版使用了 iPhone 4 的圖案,很多檔名都使用了 @2x 格式,導致在 iOS 4.2 上執行時,誤以為是 Retina 格式而令到圖案尺寸縮小了 50%。由於 UIImage 的 scaleFactor 是只能讀取而不能寫入。所以暫時的解決方法是把 iPad 及 iPhone 4 圖檔分開,不再共用資源...。
訂閱:
文章 (Atom)