Android遊戲開發學習筆記(一)

開始學習Android遊戲開發,這一系列文章實際是我的學習筆記,希望和大家一起成長,如果有理解不對的地方,希望被指出。


這個筆記不限於移動設備上的遊戲開發,其實遊戲開發很多內容是跨平臺的,好多代碼可以公用,只是Backend不同而已。我們理解了一種平臺上的框架的原理,再學習其他框架就很簡單了。


開發語言,我選用Java,因爲Java的全面向對象的語言特性,能更好的支持設計模式,更符合人的思維習慣,而且,在現今,Java的效率已經不是太大的問題。


遊戲框架,我選用libgdx 入手,

也有其他框架可供選擇,

比如:

Android平臺上的AndEngine。

起初應用於Iphone設計的Cocos2D。



我選用了libgdx, 是因爲其支持桌面端的遊戲開發,我可以直接在Desktop上學習和測試,這樣效率更高。

libgdx是基於JAVA實現的,其也由少量的C++原生代碼。最爲一般開發者,只需要關注Java部分就可以了。

而且libgdx的代碼的可讀性,架構設計的清晰度都非常高。是學習遊戲框架用的理想選擇。


 public enum ApplicationType

{

 Android, Desktop, Applet, WebGL

}

從代碼看出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的代碼挺簡單的,就幾百個文件,一般人只要用功,完全有可能吃透。


這個是程序的入口點。

package com.badlogic.gdx.helloworld;

import com.badlogic.gdx.backends.jogl.JoglApplication;

public class HelloWorldDesktop

{

 public static void main (String[] argv)

{

        new JoglApplication(new HelloWorld(), "Hello World", 480, 320, false);
}
}


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接口。


框架的程序類有JoglApplication,LwjglApplication,AngleApplication,GwtApplication,AndroidApplication五種。


程序類的構造函數有兩種,一種是簡單的直接傳入窗口的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類。在其裏做具體的繪製操作。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章