基於XNA的例子下了幾個,不寒而慄。主要是代碼看起來讓人有種回到過去的感覺,那個剛會堆疊代碼,為實現一點小功能欣喜若狂的過去。
說句託大的話,很多例子的編碼方式,看起來就像是未經任何程式訓練,學會了湊幾句文法,就在從事開發的初學者的處女作。結構和思路完全找不到清晰的脈絡,代碼複用和擴充性完全沒有進入作者的大腦。這些看法僅代表個人意見,如果令人不快,請見諒。
如果這種水平代表了國內XNA開發人員的平均水準,那我們擁有著一個並不樂觀的未來。我從來不認為XNA和dotnet framework是一個玩具,打從微軟在中國推廣dotnet平台的那天起,我第一時間弄到了vs2003,時刻關注著它的發展。進階語言是趨勢,是無法復原轉的趨勢,然而因為糊口或者種種原因,我一直沒有成為一個專職的dotnet開發人員。或許這種關注和自己並未投身其中的遺憾,讓我面對國內dotnet 平台圖形開發的囧境格外的敏感。
然而囧境還遠不止於此。dotnet平台過去因為發行的不便造成很多應用不採用dotnet,在pc 平台因為面對原生c++和directX無力還擊,在Xbox live因為正規廠商用原生sdk開發並且零售,後娘養的XNA始終無法佔據主流。過去的一切悲痛隨之逝去,留下一顆健壯的心,準備承受現在的悲痛。
XNA3.1 登陸ZuneHD,成為唯一的圖形介面。windows phone 7確定XNA4為唯一的圖形介面,XNA4 with shader model3。好訊息,因為唯一,可以遠離語言之爭,zune 和 windows phone,dotnet開發人員所期待的舞台,微軟終於把它帶到這個市場上。我可以相信這一切只是開始,在作業系統上,歸於應用也是一種趨勢,對於底層的,原生的開發方式,將會越來越小眾。對於微軟,dotnet就是未來,之於圖形,XNA就是未來。之於微軟死忠的我們,現在不正是前途明朗,應該投入其中的時候嗎?無論是為掘金還是為了興趣。
XNA4,你今天加入了嘛?
希望與失望總是形影不離,XNA開發的群我加了幾個,論壇我也逛了幾個。面對滿篇沒有營養的基礎提問,面對對於zune和windows phone的漠視,面對用xna非要在pc上死磕的悲壯,我無奈,我失望。即使dotnet成為主流的那一天,站在舞台上的也決不會是這些渾渾噩噩的人。
XNA4尚未正式發布,兄弟,你在哪裡。我並非XNA的義務推廣者,在pc平台,我是一個專職的c++開發人員。我對於XNA沒有特別的感情,只是因為windows phone 7,所以dotnet,所以XNA。花了一個星期,前方竟然沒有發現潛在的競爭者,這是何其無聊的局面。
志同者何在,掘金windows phone 7,一起出發吧。
xna4的遊戲定位,微軟的平台提供者身份,註定了XNA是只有draw的設計,DX的弟弟。XNA4 到 最終產品 中間所缺失環節是我著力關注的部分。我前行,我所取得的進展,對於後來者來說就是寶貴的財富。
這幾天我得空的時候在搞情境管理,對於圖形,沒有最好,只有最合適。況且基礎的部分已然掃平了技術障礙,但shader還不能在windows phone 7 上應用。又加上這幾天我發現在XNA上中文竟然一直沒有一個優雅的解決方案。那些用gdi+解決的方案,我的評價只有兩個字:腦殘。被pc平台綁架的解決方案我的評價還是只有兩個字:壯烈。對於花那麼多精力做壯烈的事兒的人,就只能稱為無聊了。
頭上呆毛一顫,我看到一個商機。我開發一個優雅的truetype字型解決方案,大概花一兩個月,按我自我的價值認知判斷價值5W。等到後來者加入這個行列時,他投入5W搞開發應該可以實現和我同等的功能,如果他投入不足5w就能實現同等功能,我這些年程式就白當了。這些吹牛的話聽聽就算了,重要的是一個優雅的XNA中文顯示方案,絕對是有商業價值的。由於是由商業價值的計劃,就恕我只放出庫,源碼就隱了^_^.
XNA圖形引擎計劃變動,truetype顯示方案,優先權提升到比地形更高。
另外還有輸入方案,內嵌在遊戲中的IME,這個先掛起,這要看到時候windows phone7多國語言支援的情況了。手機上沒有中文IME還在中國賣,這樣的笑柄是不可能發生的。關鍵是這個中文IME,能不能再XNA應用中呼出,這個可能性不大,橫向對比其他手機平台,遊戲中的輸入還都是很尷尬的。
假設windows phone 7 還是無視XNA應用中的IME問題,我再開發一個XNAIME模組,這毫無疑問也有著直接的商業價值。
扯了半天,字型沒說一句,正題正題。
http://www.microsoft.com/typography/SpecificationsOverview.mspx
我的方案是直接載入ttf檔案解析,在記憶體中動態產生字模。上面的連結是微軟對ttf檔案的格式說明,我昨夜搞到半夜,以simsunb.ttf為測試對象,將字型檔的基本資料讀取分析完成了,剩下就是對於輪廓資料的解析和顯示。就整個方案來說10%完成度。
使用方法如下,都是虛擬碼
clge_font font =new clge_font(“simsunb.ttf”);
最終輸出方案我還沒寫,不過腦子裡已經構造的很清楚了。
輸出一,輸出到模型,其實就是採用輸出二來實現,將會提供源碼
clge_font.MakeMesh(頂點格式,string 輸入字串,模型尺寸)
輸出二,輸出成路徑。
路徑就是點列表。
使用者可以使用這些路徑去做效果,那我就不管了。比如在每條路徑上搞一個閃光特效,結合樓上的輸出一,就可以實現有一個圍著字的邊緣放煙花的效果。使用者可以使用路徑建立模型,我提供一些從路徑建立模型的樣本,比如建立帶導角,和空心字模型。
clge_font.MakePathList(string 輸入字串)
輸出三,輸出到貼圖
clge_font.WriteToTexture(ushort 字元,int 字型大小,RECT 目標輸出地區)
輸出四,直接繪製String
這個只是對輸出三的封裝,將會提供源碼
ShowFont sfont = new ShowFont(clge_font 字型,int 字型大小,bool 採用動態緩衝還是靜態緩衝)
//動態緩衝就是只建立一張貼圖,根據詞頻調整刪除最早使用的。靜態緩衝在貼圖放滿字模時會再建立一張
SpriteBatch.begin();
sfont.draw(SpriteBatch,string 顯示字串,int x,int y);//提供採用SpriteBatch輸出的實現,使用者如果採用其他引擎做UI輸出,對應修改源碼即可。
SpriteBatch.end();