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类。在其里做具体的绘制操作。





你可能感兴趣的:(java,游戏,框架,android,applet,tortoiseSVN)