2011年7月13日 星期三

小飛俠的 spr 檔案格式

SPR File Format in "Astroboy Tap Tap Rush"

今日找來 Astroboy Tap Tap Rush 來研究,發現內裡有一些 spr 檔案,應該是 Sprite 的意思,亦即是圖檔來也。用 HexEdit 一看,格式簡單易明。0-3 Bytes 是 spr 內有多少個 PNG 檔,之後的便是第一個檔的大小,接著是第一個檔的內容;第二個檔的大小,接著是第二個檔的內容...。我簡單地寫了一段程式,把 spr 內的 PNG 解放出來。得到的 PNG 完好無缺,可以作為參考之用。瞄了小飛俠的動作圖一眼,發現它的像素比例有點古怪,是縮小時的比例問題,好可能是拿家用機版本的圖縮小而成的緣故。

另外,之前用 iPhonePNGApp 解圖時會出現錯色或半解的問題,今天試了一個 Command line 的 iPhonePNG 來解小飛俠的 PNG,所有圖都能正常解開。
 //  Loading spr
NSString *directory = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"spr"];
NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];

for (NSString *filename in array) {
NSString *fileExtension = [[filename pathExtension] lowercaseString];
if ([fileExtension isEqualToString:@"spr"] == NO) {continue;}

string = [directory stringByAppendingPathComponent:filename];
NSData *data = [NSData dataWithContentsOfFile:string];
unsigned char *dataBuffer = (unsigned char *)[data bytes];

unsigned int *headerInfo = (unsigned int *)dataBuffer;
unsigned int numberOfPNGs = headerInfo[0];

dataBuffer += 4;
for (int i=1; i<=numberOfPNGs; i++) {
headerInfo = (unsigned int *)dataBuffer;
unsigned int fileSize = headerInfo[0];
dataBuffer += 4;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *outputFilename = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%02d.png", filename, i]];
NSData *singleData = [NSData dataWithBytes:dataBuffer length:fileSize];
[singleData writeToFile:outputFilename atomically:YES];

dataBuffer += fileSize;
}
}

沒有留言: