Posts Tagged ‘遊戲設計’

Python使用HGE引擎

八月 25th, 2009

大家肯定都知道在Python下面寫2D遊戲有個眾所階知的選擇就是pygame,雖然它簡單好寫,對於簡單的遊戲來說已經足夠,但是他有一個致命的缺點,就是速度太慢了,在pygame的背後是SDL,用純軟體畫圖的函式庫,既然為純軟體繪圖,遇上旋轉、半透明等等需求,更顯得吃力和不切實際,所以該怎麼辦才好呢?

答案是用Haaf’s Game Engine,它是一款用DirectX做為backend的Open source遊戲函式庫,我在先前的文章裡已經有做簡單的介紹,就不再重覆,那這函式庫和Python又有什麼關聯呢? 他是用C++寫的,Python沒辦法用,正因為這樣,我一直一來想幫他寫一個python的binding,我一直想如果Python也能用HGE寫起來一定很開心,我試著找了一下有沒有已經存在這樣的專案,有找到一個,但是居然是在萬惡的GNU授權下的,讓我百思不得其解,那專案的作者到底在想什麼? 想讓大家寫Open source的Game嗎? 我們都知道GNU是大名頂頂的病毒授權,任何程式使用了用GNU的函式庫都會被感染,代表你的主程式一樣得變成GNU的開源授權,我個人非常討厭打著自由名義但是卻有強烈的強迫性質的GNU授權,況且HGE的授權是非常寬鬆的 zlib/libpng License,實在想不透為什麼一個binding可以用超嚴格的GNU,不過那是那作者的自由,我也管不著,在不能接受那惡心的授權,加上我看了一下他的專案似乎好像也沒有很完整的進度,於是我還是決定自己開了一個新的專案

Python HGE

在這樣的情況下,我前些天抽空開了一個新的Open source專案: Python-HGE,把一些最核心的程式碼都用boost.python包裝給Python使用,最核心的部份完成度很高,剩下的需要我在未來有空慢慢補上,License是MIT,如果你問我為什麼選MIT,我想答案應該是商業用途一樣也可以,不像GNU那種假腥腥的自由,還有一個重點就是,我覺得麻省理工這名字聽起來很酷,讓我想起每次在Discovery看到的東西

效能問題

我照著原本HGE的Tutorial7的程式寫了一個Python的版本,這個範例的目的就是在展示HGE的效能,純C++的版本速度當然是很快,而Python的版本FPS掉了不少,一開始讓我覺得有點失望,讓我開始懷疑如果效能掉很多的話,那用Python寫HGE還有價值嗎? 後來仔細思考了一下,對於一般的2D遊戲來說,要像這demo整畫面跑來跑去的圖片加透明效果的情況實在不多,就算有也很難到這樣上千張的圖片,再者我都還沒進行最佳化、跑profile等等,而且雖說FPS掉不少,但是那是和C++數百的FPS比起來,在60以上其實都是可以接受的,加上我測試的這台電腦已經有點年代,對現代的電腦和GUP來說情況只會更好,在如此的考量之下,Python HGE還是有搞頭的

python版的tutorial 7截圖

t7

這個demo可以在這裡下載

目前狀況

目前雖然核心部份已經高度完成,不過我還沒有把編出來的pyd釋放的打算,如果想嘗鮮的話可以直接從那個demo裡面找pyd出來用,又或著自己check out原始碼進行編譯

參與開發

如果有興趣的話,歡迎參與專案的開發,如同我上面所提到的,我用的是boost.python,一款基於C++的python binding函式庫,如果你熟悉boost.python的話當然是最好,就算沒有也沒關系,因為其實大部份工作都是剪下貼上之類的,可以參考我已經寫好的部份,有些函數回傳例如指標之類的東西需要特別處理,除此之外都只是很簡單無腦工作

卡卡獸的移動

七月 14th, 2009

增加了角色移動的功能,感覺上還蠻順暢的,不過好趕,有種在亂寫的感覺

卡卡獸

移動的影片,實做角色移動的部份,因為Webcam是固定焦距,太遠又暴光過 度,所以只能這樣拍,看起來像近視一樣= = 不過感覺上滑動還蠻順暢的

話說,有誰知道哪裡可以找到免費的八個方向角色走路的圖…. 我想要找來測試一下都不知道從何找起 orz
美術白痴的我要畫大概是不太可能

Android遊戲設計初體驗

七月 12th, 2009

今天玩了一下在Android寫game,託以前經驗的福,很容易就上手了,和一般的Game沒有太大的差別,但因為Android所謂的main-thread和main-loop都是用來回應UI用的,因此要更新遊戲的邏輯、畫面,需要另外的Thread,參考Android裡的遊戲範例,很快地就隨便寫出一個還稱不上是Game的小程式來玩,只是簡單地移動貼圖,在模擬器跑慢到暴炸,FPS只有1初頭,根本沒辦法進行debug,而在我的HTC Magic下跑FPS可以到30~40左右,所以要在Android開發遊戲似乎實體的手機是必需的,模擬器平時跑一般的程式都可以慢成誇張的地步了,更何況是不停更新的Game,所以非手機或其它硬體支援不可,除非哪天模擬器效能大改進

簡單的貼圖移動

雖然這小程式沒什麼大問題,但是有件事情讓我很困擾,就是每隔一點段時間就會發生delay,週期性且不斷地發生,這樣的delay會讓玩家感到不爽,難以進行遊戲,糾~竟~是為什麼會有這週期性的delay,我們…繼續看下去

Delay的兇手

找了一些資料,終於讓我發現這週期性delay的兇手,就是來自於garbage collection的週期性回收垃圾,請看VCR

在Android寫一個簡單的貼圖移動程式,發現會有週期性的delay,原因出在於垃圾回收機制不停地週期性地運作,請看背後LogCat的GC發生的一瞬間,程式的畫面就會delay

而亂丟垃圾的兇手就是….

我,沒有什麼寫Java經驗的我,new一個物件似乎很輕鬆平常,反正Java有垃圾回收機制,一般寫程式再怎麼丟都有人幫你撿,但是寫Game就是另一回事了,對於寫Game而言,垃圾回收機制是delay的來源,所以在遊戲迴圈內不能有用完即丟的new物件產生,任何物件在遊戲都應該被reference或是重覆利用,不停丟垃圾的下場就是你的遊戲會因為有人一直停下來幫你撿垃圾所以不停的delay

當我移除所有new之後…

我發現delay似乎還是會發生,想了一想,想到了在這背後還有隱含的new會發生,也就是Java的字串其實骨子裡就是new,只是方便的寫法所以不用特別寫出來,在移除了所有使用到暫時字串的地方後,果然圖片的移動就相當順暢

接著

我想寫一個簡單的地圖引擎實作來看看Android的2D貼圖效能如何,如果不幸的很不夠力,可能就得用OpenGL下去畫2D了

Haaf’s Game Engine : 硬體支援加速的2D遊戲引擎

一月 10th, 2009

長久以來我一直想寫一個2D遊戲引擎,每次我都自己重頭做起,甚至每個pixel都自己用迴圈進行copy和半透明的運算等等工作,但是要寫一個引擎談何容易,不光是有很多細節要處理,設計得好壞又是另一回事,我以前重寫過六次的線上遊戲都是架構在自己寫的引擎上,做為學習確實學到了不少東西,但是就實際應用來看既浪費時間又難以在第一次就做到滿意的地步,使用別人造好的輪子當然是較好的選擇,但是在之前一直沒有見到什麼令人比較喜愛的引擎,SDL也同樣是用軟體繪圖,速度不夠快,要做特效也做不太來,光是旋轉縮放等問題就令人頭大,我只是想寫遊戲,有一天我發現了符合我想法的2D引擎,HGE(Haaf’s Game Engine)

它的銘言是:

Fast and convenient development of high-quality small 2D games without knowing much about technology.

在我研究了一下之後,我發現它正是我心目中的2D引擎,它隱藏了很多煩人的細節,真正做到只是想寫遊戲這樣的要求,它使用Direct3D來畫2D圖形,使用硬體當然速度比軟體畫快得多,它非常簡單好用,支援常見的圖檔案格式,它有粒子系統、資源打包等等功能,總而言之,基本該有的支援它幾乎都有了,而且都很簡單易用,還有最令人高興的是,它的文件非常的清楚、完備,它在之前似乎是商業軟體,後來才變成免費的Open source project,我想因為這樣它的文件才會如此完整,它使用zlib/libpng License,可以使用在商業用途,這也很合我胃口,不會像GNU License病毒那樣,聽到商業兩字就得說掰掰,以做為2D遊戲的引擎而言,這樣的引擎可以說是我心目中的引擎,我今天隨手寫了一個小程式,只是算試玩性質,根本還不能表現它的實力,在我看來要用它來寫東方系列那樣的射擊遊戲也很夠用,有點手癢想寫一個來玩玩看

HGE引擎demo

HGE引擎demo

下載 : HGE引擎demo小程式

當然這對HGE來說只是小菜一盤,請看官網的demo,很酷的demo,令人印相深刻

Code::Blocks的HGE專案樣版

一月 10th, 2009

最近開始研就HGE (Haaf’s Game Engine),為了能方便開新專案寫HGE的程式,我特地研究了一下如何製作Code::Blocks的Wizard template,有個樣版每次開新專案就很方便,不用每次都要設定link之類的麻煩事情,我將它上傳,有興趣的就抓回去使用吧,安裝方法很簡單,只要解壓縮到Code::Blocks安裝的目錄下即可,如果你有安裝其它Project Wizard template的話,有可能會抓不到,或讓其它安裝的template被蓋掉,因為Code::Blocks是依照share\CodeBlocks\templates\wizard\config.script這個script檔來決定有哪些template,遇到這個問題的話,就請手動合併config.script檔案,內容很簡單,應該看了大概就明白在做什麼的

HGE project wizard template for codeblocks

pygame隨便玩

十一月 28th, 2008

什麼是pygame?

pygame是一款用python寫的遊戲函式庫,基於SDL之上,之前就很想要玩玩看,今天隨便找了一個範例然後隨手亂改一番

pygame隨便玩的demo抓圖

pygame隨便玩的demo抓圖

心得就是pygame寫起來很順手、很簡單,改天有空的話用它來寫個Game試試

亂寫的demo可以在這裡下載

pygame亂寫的demo

也沒什麼特別的東西,只有會繞著滑鼠旋轉的圖,只要安裝python直譯器和對應版本的pygame就可以執行