2010年9月23日 星期四

Bin Packing 式的 Sprite 排列說明

在閱讀過 Bin Packing 的文件後,雖然不太明白工作方式,但根據示範圖片的排列,我也能略為理解,並用自己的方式演繹出來。

關於排序的技巧,首先是要取得所有 Sprite 的尺寸,然後由大至小排列好。我是以面積(闊x高)來決定大小;如果單用闊或高來決定大小,相信也沒有問題。有了大小順序之後,便開始排列。我把當前的圖案用「圖A」來表示,後來的圖案以「圖B」、「圖C」來表示。排列的方式是把「圖A」貼在左上角,然後檢查後來的圖案。如果「圖B」高度小於或等如「圖A」時,「圖B」會放在「圖A」的右方;若「圖B」高過「圖A」,便會嘗試放在「圖A」下方;要求是「圖B」的闊度不能大過「圖A」的闊度。在正常情況下,應該能處理得到。若然以上兩個情況都不乎合,或者其中一軸已經沒有空間時,「圖B」便會放在「圖A」的右下方。

按照以上方法,Sprite 將會以「倒L」形狀呈現。

2010年9月20日 星期一

SpriteSheet Maker


搏鬥了九個小時,終於完成了在 Snow Leopard 上運作的 SpriteSheet Maker。之前在做 PVR Reader 時,已經學習到少部份 Snow Leopard 的開發技巧;所以花了四個小時便完成了 Drag & Drog, Context to NSImage, NSImage to PNG, XML output...等部份。其餘的時間,全都花在「如何排列圖案」上。起初所使用的排列方法是自行創作,不過效果及速度都強差人意,便在網上學習學習。原來有一個名為 Bin Packing 的方法。在看過 C++ 及 Python 的代碼後,仍然不太理解運作,我只好憑著參考圖片自行編寫程序。最後能成功地輸出 PNG 及 XML。明天會再花時間用不同面積的圖案反複測試,看看有沒有大問題發生...。

2010年9月13日 星期一

EAGLView 的 iPad 處理

在支援了 iPhone 4 的高清圖像之後,iPad 版本會導致死機,原因是 iPad 目前最新的只是 3.2 版本;而我用上的功能則是 iOS 4.0 才有。在網上找到的方法,不外乎用 respondsToSelector 去檢查是否有 scale 這個 selector,從而斷定是否為 iPad。這個方法可行,但用在我的 EAGLView 內會造成死機。原來是 contentScaleFactor 惹的禍。這個也是 iOS 4.0 的東東,所以也要用 respondsToSelector 檢查過才能使用。
 //  Set UIView's content scale factor if support
if ([[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"scale")]) {
if ([self respondsToSelector:NSSelectorFromString(@"contentScaleFactor")]) {
self.contentScaleFactor = [[UIScreen mainScreen] scale];
}
}

2010年9月12日 星期日

粒子系統教學


我最新的作品將會用上 Particle System,所以在網上學習一下製作方法,找到了這段不錯的教學片段。

2010年9月11日 星期六

OpenGL ES 在 iPhone 4 下的設定

我最新的作品是一個 Universal Binary。一個 IPA 適合 iPhone, iPod, iPad, iPhone 4 的遊戲。亦即是說顧客只需要購買一次,便能同時安裝到以上裝國。為了能滿足 20MB 下載限制的要求,我選擇 iPad 資源作為 iPhone 4 共同使用。由於 iPhone 4 使用高清圖案的方法有些特別,放到 OpenGL 環境下,圖案大小變成兩倍大。起初我把 Texture2D 圖案的 scaleFactor 設定為 0.5f,圖案大小亦變回原來大小,不過卻沒有高清效果。在網上找了很久也找不到以上的對策;最後在 Apple 的 iOS Application Programming Guide 找到解決方法。

- (id)initWithFrame:(CGRect)rect {
if ((self = [super initWithFrame:rect])) {
self.contentScaleFactor = 2.0;
...
}

2010年9月10日 星期五

十分好用的 XML Parser 語法

最近在做新遊戲時,很常用到 XML Parser;當中需要檢查指定的 XML Syntax 有沒有出現。我曾在家中網上學習時找到一段十分好用的語法,但在公司編寫相關程序時,往往都記不起這段語法。現記錄如下:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
NSArray *elementsBeToParse = [[NSArray alloc] initWithObjects:
@"spritesheet", @"sprite", @"name", @"x", @"y", @"width", @"height", @"file", nil];

NSString *lowerElementName = [elementName lowercaseString];
BOOL parseIt = [elementsToParse containsObject:lowerElementName];
if (parseIt == NO) {return;}
...
}

2010年9月7日 星期二

iPhone 的電郵音效路徑

之前把 iPhone 4 收到電郵時的音效改為 Metal Gear Solid 的音效;用了一個星期,覺得效果不好,所以決家還原置換。只要把 caf 檔拷到以下路徑即可:

/System/Library/Audio/UISounds/new-mail.caf

2010年9月2日 星期四

iPhone BlueTooth 與 WiiMote 連線


最近在造新的六足機體,很想可以利用 iPhone 來操控;這需要利用 Open Toolchain 來達成。現在 Toolchain 已安裝,問題是要如何取得 BlueTooth 的數據?我想首先要確認一下是否真的能利用 iPhone 跟其他 BlueTooth 裝置連線。

在 Cydia 中有一個名為 WiiMote DEMO 的軟件可以作為測試之用。打開軟件後,在打開 WiiMote 手掣,按下 1 + 2 鍵後,iPhone 便會跟 WiiMote 連線。成功後,只要旋轉 WiiMote,相同的旋轉角度便會在 iPhone 內的 3D 模型表現出來,十分有趣吸引。

2010年9月1日 星期三

inCase Snap Case 到


等了好久(有一個半月了)的 iPhone 4 機套終於到了!比預計早到了五天。是一個硬膠機套,質感不錯,也不太厚。

至於另一個機套,我前幾天取消了訂購,目的是想轉換為 Apple Bumper。可是再次啟動 Case Program 都說已選擇了機套,無法繼續。我只好至電客服查詢;十分激氣的是撥通後等了半小時也沒有人回應,難道客服中心只有一位員工嗎?