開始學習Android遊戲開發,這一系列文章實際是我的學習筆記,希望和大家一起成長,如果有理解不對的地方,希望被指出。
這個筆記不限於移動設備上的遊戲開發,其實遊戲開發很多內容是跨平臺的,好多代碼可以公用,只是Backend不同而已。我們理解了一種平臺上的框架的原理,再學習其他框架就很簡單了。
開發語言,我選用Java,因爲Java的全面向對象的語言特性,能更好的支持設計模式,更符合人的思維習慣,而且,在現今,Java的效率已經不是太大的問題。
遊戲框架,我選用libgdx 入手,
也有其他框架可供選擇,
比如:
Android平臺上的AndEngine。
起初應用於Iphone設計的Cocos2D。
我選用了libgdx, 是因爲其支持桌面端的遊戲開發,我可以直接在Desktop上學習和測試,這樣效率更高。
libgdx是基於JAVA實現的,其也由少量的C++原生代碼。最爲一般開發者,只需要關注Java部分就可以了。
而且libgdx的代碼的可讀性,架構設計的清晰度都非常高。是學習遊戲框架用的理想選擇。
public enum ApplicationType
{
}
從代碼看出libgdx支持四種遊戲類型。
其中WebGL是一種在網頁裏呈現3D的技術,有別於以往需要用瀏覽器加掛外部程序的(如Applet),通過WebGL的技術,只需要編寫網頁代碼即可實現3D圖像的展示。WebGL的規格尚在開發中,由非營利的Khronos Group管理。
好,開始!
怎麼搭環境,我就不多說了,JDK肯定是必須得,我用的版本是1.6,然後去Eclipse.org下載一個eclipse-java-indigo-win32.
libgdx的代碼在 http://libgdx.googlecode.com/svn/trunk/ 我們需要用SVN下載,(不會SVN的自己去搜搜SVN的用法),我用的是TortoiseSVN。也可以下一個命令行的版本,直接在命令行操作。
開始一個學習,比較經典的例子就是Hello World。這個在libgdx的源代碼目錄裏面,已經爲我們準備好了,呵呵!
我們只需要導入到我們的Eclipse工作空間裏面就可以運行了,看到實際效果了,然後逐代碼分析一哈,就可以了。學習之後,就可以自照貓畫虎的寫自己的代碼了。
其實libgdx的代碼挺簡單的,就幾百個文件,一般人只要用功,完全有可能吃透。
這個是程序的入口點。
import com.badlogic.gdx.backends.jogl.JoglApplication;
public class HelloWorldDesktop
{
public static void main (String[] argv)
{
libgdx的後端程序類型有,android, jogl, lwjgl, angle, gwt.
jogl和lwjgl是OpenGL的Java 綁定。
分別是:
Java™ Binding for the OpenGL® API
The Lightweight Java Game Library (LWJGL)
public class HelloWorld implements ApplicationListener
實際的程序體是HelloWorld 類,它實現了ApplicationListener 接口。
你只要在該監聽者接口的接口函數裏簡單地實現你的程序邏輯,就可以了。
Application接口是框架的程序類需要實現的接口。
用戶的程序類作爲一個參數傳入框架程序類的構造函數。
ApplicationListener接口用戶的程序監聽類需要實現的接口。也就是說,需要用戶實現的部分,都劃分到了監聽接口裏面了。
用戶也可以直接繼承Game類,這個類實現了ApplicationListener接口。
程序類的構造函數有兩種,一種是簡單的直接傳入窗口的title以及寬度和高度,另外一種就是需要傳入一個更加詳細的配置類。
XXXGraphics類是libgdx的具體圖形框架實現類。我們用戶的listener對象作爲了一個參數,傳入XXXGraphics。
類似的還有 XXXInput類,XXXFiles類,XXXAudio類。
具體圖形的實現類又分爲GL10,GL11,GL20,GLU等。 這應該就是設計模式中的橋接模式吧。
文件類又分爲訪問外部文件和內部文件,外部文件的意思就是沒有打包在程序裏面,而使用的外部資源,比如SD卡里面的資源。
總體說來,libgdx包括五個部分:
應用程序框架
圖形模塊
音頻模塊
輸入輸出模塊
文件操作模塊
public class Gdx
{
public static Application app;
public static Graphics graphics;
public static Audio audio;
public static Input input;
public static Files files;
public static GLCommon gl;
public static GL10 gl10;
public static GL11 gl11;
public static GL20 gl20;
}
這個類,裏面的所有變量都是類變量,相當於在程序作用域裏的一系列全局變量。
對於遊戲開發來說,我們需要使用Game類和Screen接口,
Game類實現了ApplicationListener接口。相當於一個適配器,使得用戶主要需要實現Screen接口,在其Screen接口的實現類裏實現自己的邏輯。
Screen,一個屏幕,相當於一個場景。
一般一個遊戲裏面有多個屏幕,包括菜單。所以一般的實現是,先建一個抽象類實現Screen接口,然後具體的屏幕類再extend這個抽象類。
而在Game類的create方法裏面設定起始屏幕。
@Override
public void create ()
{
setScreen(new GameScreen(this));
}
Screen接口的函數包括:
render()
show()
hide()
Screen的實現類,在構造函數裏面獲得了Game對象的引用,
public GameScreen(Game game) {
super(game);
}
從而可以在代碼裏實現跳轉到其他屏幕,比如:
if(map.bob.bounds.overlaps(map.endDoor.bounds)){
game.setScreen(new GameOverScreen(game));
}
if(Gdx.input.isKeyPressed(Keys.ESCAPE)) {
game.setScreen(new MainMenu(game));
}
在render函數裏使用 libgdx提供的圖形接口,實現具體的和邏輯有關的繪製操作(也就是具體怎麼繪製)。
一般會對其進行封裝,比如
實現地圖繪製,會在寫一個Map類,和MapRender類。在其裏做具體的繪製操作。