發表文章

目前顯示的是 2016的文章

PIN2 - 拼圖

圖片
< Android下載 > 這是很久前的一個小遊戲練習,主要目的是作為一個新的實作框架的練習。成像的部份最早是用GDI,後來改成OpenGL,現在又把它拿出來改成使用good。基本上這是個純C++的程式,LUA只佔用來作初始化的5行程式碼。

吃金幣的人(Coin Eater)

圖片
這是把之前作的 基因算法實驗裡的吃金幣的人 遊戲化的一個小作品。 下載  ( src ) ; 這個遊戲比較特別的地方是,這是第一個發佈的遊戲裡面不是全用LUA實作的。實作是一半使用C++另一半使用LUA,C++這邊主要實作比較需要效能的算術邏輯,LUA這邊主要處理成像和UI。

最佳化繪圖管線批次繪製物件(Batch Sprite)

最開始的時候,good的繪圖管線為了簡化設計和實作,物件在繪製時是一個一個畫。每個物件都是以一個 glDrawArray 畫出來,也就是說花費一個draw call畫出來。 一開始針對繪圖最佳化的規劃除了 貼圖合併 之外,另一個主要的功能是批次繪製功能作最佳化。現在終於實作了這個功能,可以大幅減少draw calls。 原來繪製物件的方式是透過glVertexPointer傳入長寬各為1的單位矩形,再使用 glDrawArray 畫出物件。底下是簡單的記錄,一步步將原本的繪製物件的管線轉換為批次繪圖方式。 1,第一步就是先把glTranslate、glScale及glRotate等方法替換掉。首先弄個可以計算4*4矩陣的工具,把這些方法都透過矩陣運算,得到一個轉換矩陣。再使用glLoadMatrix載入這個自行計算得到的轉換矩陣,然後看看是不是結果和原來一樣,如果和原來的結果是一樣的話,表示這個轉換矩陣的計算是正確的。 使用glLoadMatrix載入轉換矩陣時,如果結果不對,可以試試對轉換矩陣作一次transpose轉換,看是不是因為使用的矩陣定義和OpenGL相反。 2,第二步要利用上面求出且驗證正確的轉換矩陣,來再進一步替換掉glLoadMatrix。也就是將傳入glVertexPointer的矩形的4個點,用轉換矩陣轉換成最終結果的座標,並且不需要使用glLoadMatrix將轉換矩陣傳遞給OpenGL,因為我們已經自己作了座標的轉換。再來驗證看看結果是否正確,沒有問的話就可以進入到下一步。 3,以上兩個步驟已經將OpendGL轉換矩陣的部份都替換掉,由我們自已的底層計算得到。將來再作進一步最佳化時,還可以把這個預先計算得到的轉換矩陣cache起來,只在狀態變動及需要時再重新計算,如此還可以進一步提高繪圖速度。 接下來就是要將每一個繪製物件的動作儘可能的合併起來批次處理。基本原則是準備大一點的buffer,針對vertex、texture coord及color,分別使用glVertextPointer、glTexCoordPointer及glColorPointer餵給OpendGL,在最後使用 glDrawArray 繪出時再指定實際繪出的數量即可,這樣就能夠大符減少draw call。 使用 glDrawArray 批次

成語四則運算

圖片
花了點時間作了這個結合數字成語和四則運算的小遊戲,其中有超過一半的時間都花在收集和整理成語資料上面... << Android 下載 >> 附上 src 。 PS: dat.h是由idiom_ansi.txt轉換過來的,就當作給對src有興趣的人的人的作業。

Good Game Editor 1.4.4

* 修正貼圖物件在負數Scale時顯示錯誤。 * 修正編輯器開啟舊檔時偶發性當機的問題。 * 修正地圖編輯器(MapEditor)繪製圖格超出地圖範圍時造成當機的問題。 * Good.OBJ更名為 Good.SPRITE 。 * 新增 Good.SetName 。 下載 Good Game Editor 1.4.4 + libgood 1.4.4 下載Good Game Player Android 1.4.4

數獨詳解 - Kill Sudoku Step by Step

圖片
用了大約一周的時間把之前的 Kill Sudoku 改成安卓版。一開始原本是打算把html5版本使用WebView直接作移植,但作了一些測試後發現有些困難,比如說怎麼作就是搞不定讓顯示和內建的Chrome一樣,還有拖曳畫面的效能也和內建的Chrome有很大的差異的問題等等。最後只好選擇用java+jni的方式改版,因為最早的版本原本就是C++,所以java這邊主要的工作只剩UI的處理。 << Android 免費下載 >>  ( src )

Char Link

圖片
利用前幾天再加上周末二天的瑣碎時間,把link這個範例程式改版製作成一個小品遊戲:CharLink。 << Android Download >> 附上 Source 。 PS: ar.lua和Util.lua請自行到good的samples目錄底下找。

單人撲克101

圖片
以前和同事逛書店的時候,看到了一本收錄100個單人紙牌的遊戲書。那時候就和同事半開玩笑的說,把這本書買回去再把裡面的遊戲一個一個實作出來當作是練功吧。後來有一天我真的去把這本書給買了回來,然後每天早上上班之前,利用最多30分鐘的時間一邊啃著麵包一邊實作紙牌遊戲。那陣子每天我至少可以實作一個單人紙牌遊戲,最多的時候一天可以實作4個...不過一直實作作到33個的時候我停手了... 最近心血來潮想說把它移植上android,所以再拿出來檢視一下。原本這是一個windows的應用程式,當初實作的時候沒有特別考慮太多跨平台,把source拿來看了後大概規劃一下怎麼改就動手了,斷斷續續花了一周時間。 Android版本單人撲克101 下面大概對過程作個記錄。 ; 每一個紙牌遊戲都是繼承自CardGame這個類別。下面列出主要和平台有關係的介面,也是移植的時候需要改版的地方。 class CardGame { public:   virtual void DrawGame(CDCHandle dc, RECT const& rcClient) const;   virtual bool OnMouseDown(CPoint point, RECT const& rcClient);   virtual bool OnMouseMove(CPoint point, RECT const& rcClient);   virtual bool OnMouseUp(CPoint point, RECT const& rcClient);   void DrawCard(CDCHandle dc, int x, int y, int card) const;   void DrawCover(CDCHandle dc, int x, int y) const;   void DrawEmptyCard(CDCHandle dc, int x, int y) const;   void EraseBkgnd(CDCHandle dc, RECT const& rcClient) const; }; 如上和平台有關的介面有二個,一個和畫圖有關係,另一個和輸入有關係。 1,首先我另外建立了Ca

Good Game Editor 1.4.3

圖片
* 物件屬性檢視器(Property View)的ComboBox改為以關卡編輯器(Level Editor)的物件列表取代。 * 新增 Resource.GetFirstLevelId 。 * 新增Ctrl+F5開始播放資源樹指定關卡。 * 新增 Good.GetName 。 * Good.IsVisible更名為 Good.GetVisible 。 * 新增範例animator(簡易動作系統)。 下載Good Game Editor 1.4.3 下載libgood-1.4.3 下載Good Game Player 1.4.3 Android