`
mmdev
  • 浏览: 13470199 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android游戏框架Libgdx使用入门

 
阅读更多


Libgdx作者博客:http://www.badlogicgames.com/

Libgdx项目地址:http://code.google.com/p/libgdx/

Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能运行在Mac、Linux、Windows等系统)与Android平台(Android1.5以上即可使用,Android2.1以上可满功率发挥),

Libgdx由audio、files、graphics、math、physics、scenes、utils这些主要类库所组成,它们分别对应了Libgdx中的音频操作,文件读取,2D/3D渲染,Libgdx绘图相关运算,Box2D封装,2D/3D游戏组件(3D部分目前无组件),以及Libgdx内置工具类。

Libgdx主要构成如下所示(Libgdx作者wiki提供):

00

下面开始,我将就Libgdx的具体实现,开始讲解如何正确使用Libgdx类库。

不过在正式开始之前,我们首先还得讲讲Gdx类。


关于Libgdx中的Gdx类:


单从表面上看,Gdx类占用空间不足2KB,甚至不具备一行可以被直接执行的函数,并没什么重要好说。

然而,真实的Gdx却是Libgdx类库运行的核心所在,没有它你将寸步难行,不单运行Graphics、Input、Files、Audio、AndroidApplication等Libgdx关键部分所必需的实例会在Libgdx初始化时注入Gdx中对应的graphics、input、files、audio、app等静态变量里面,就连Libgdx对OpenGL接口(或OpenGLES,视Libgdx运行平台而定,以下统称OpenGL)的GL10、GL11、GL20、GLCommon等封装类也会在Graphics实例化时分别注入到gl10、gl11、gl20、gl这四个同样位于Gdx的静态变量当中(在Graphics中也会继续保留它们的引用,因此无论你执行Gdx.graphics.getGL10还是Gdx.gl10,其实都在调用同一个静态变量)。事实上,如果你想不使用Gdx而正常运行Libgdx,那么除了重构源码,就再没有任何办法可想了。

PS:如果你不清楚自己究竟在什么环境使用Libgdx,其实也不必强分gl10或gl11,大可以通过Gdx.gl方式调用Libgdx中对于OpenGL接口的默认封装(执行某些非多版本共有接口时,依旧需要使用对应版本专属gl)。

想要使用Libgdx,却不明白Gdx是干什么用的,那么一切就都是空谈。

下面开始,我将具体讲解Libgdx中的图像处理与游戏组件部分:


关于Libgdx的图像处理部分:


Mesh:


本质上讲,Libgdx中所有可见的3D物体首先都是一个Mesh(网格,或者说三维网格形式的高级图元)。Mesh是如何生成的呢?众所周知,数学上讲的立体几何由点、线、面三部分组成,无论多么复杂的图像也可以分解为无数细小的这三部分,或者说可以由非常基础的N个这三部分所组合而成;到了3D游戏开发时,当我们要构建复杂的3D图像,首先会以一系列有序的vertices(顶点)构成这些具体的点、线、三角要素,即构成绘图基本图元(Primitives),再将基本图元组合成更完整的高级图元也就是具体3D对象。因此,如果对Mesh概念进行简单的理解,其实它就是一个象征完整图像的基本图元集合体,Libgdx先让我们把一个个细分的vertices组成基本图元,再由Mesh类将基本图元制成更加复杂的高级图元展示出来。

具体可见Libgdx作者提供的returntomarchfeld示例,基本效果如下图所示:

00

(勿看FPS,一切信真机)

PS:如果对此类认识不足,可以去玩玩模拟人生,下个修改器尝试编辑角色或物品造型后就懂了……


Texture:


Libgdx所提供的游戏纹理用类,其实质可理解为保存在显存中的Image,它以贴图的方式通过OpenGL将图片显示到游戏界面之上。Libgdx的纹理可以直接从指定文件路径加载,也可以通过它提供的Pixmap类凭空创建(它的Texture(int width, int height, Format format)构造内部直接调用了Pixmap,不是必须在外部生成Pixmap后注入)。另外在加载Texture时,个人建议通过Libgdx提供的TextureDict.loadTexture函数调用,该方法内部提供了Texture缓存管理,能够避免无意义的资源重复加载。此外,Texture通常会与TextureRegion类配套使用,利用TextureRegion包装Texture后,再利用SpriteBatch进行绘制,可以很方便的修订Texture为我们需要的显示范围。还有,Libgdx中Sprite类为TextureRegion子类,因此能够将Sprite当作TextureRegion来使用,只是Sprite类比TextureRegion有所扩展。不过Libgdx的SpriteCache类并没有继承Sprite或TextureRegion,所以起不到TextureRegion的作用,只能构建一组静态贴图集合罢了,特此说明。


Pixmap:


Libgdx所提供的像素级图像渲染用类,由于Libgdx目前以JNI方式自带图像解码器,所以我们可以直接将Pixmap理解为一个Android中Bitmap的替代者,两者间实现细节虽有差别,但具体作用却大同小异。Pixmap支持Alpha、LuminanceAlpha、RGB565、RGBA4444、RGB888、RGBA8888等五种图像彩色模式,支持png、jpg、bmp等三种图像文件的读取和加载。一般来说,Pixmap必须和Texture混用才能真正显示画面。不过在事实上,Libgdx的Texture里已经内置有Pixmap了。



BitmapFont:


Libgdx所提供的OpenGL文字用类,构造BitmapFont时需要一个描述文字构成的fnt文件,和一个提供文字图片的png文件(PS:在Libgdx的com.badlogic.gdx.utils包下有提供内置字库,目前仅支持英文、数字和常见符号),同SpriteBatch相配合时能够完成一些基础的文字绘图。值得一提的是,我们也可以使用BitmapFontCache类将BitmapFont包装成了一个静态的Font实例,以避免大量贴图时产生的不必要损耗。

00


SpriteBatch:


Libgdx所提供的纹理渲染器,本质上是OpenGL的简易封装体,具体实现上与XNA中的SpriteBatch类非常近似,每次调用SpriteBatch类都必须以begin函数开头,以end函数结尾。由于Libgdx中SpriteBatch提供的功能还非常有限,所以在完全不懂OpenGL的前提下使用其进行游戏开发或许有一定难度。

ShaderProgram:


Libgdx所提供的着色器,在Android环境使用时需要GLES2.0或以上版本才能完整支持的高级渲染功能之一,内部封装着GLES2.0专用的顶点着色与片断着色Shader Model,它的本质作用是对3D对象表面进行渲染处理,此物性能基本取决于GPU(除了Google Nexus系列手机暂未见能完全跑出速度的机型)。


FrameBuffer:

Libgdx所提供的帧缓冲器,在Android环境使用时需要GLES2.0或以上版本才能完整支持的高级渲染功能之一,也就是常说的FrameBuffer Object(FBO)功能封装(用过JavaSE或JavaME开发游戏的朋友,绘图时大概都接触过双缓存这个概念,虽然有所差别,不过将FrameBuffer理解成起近似作用也未尝不可)此物性能彻底取决于GPU(除了Google Nexus系列手机暂未见能完全跑出速度的机型)。


关于Libgdx的游戏组件部分:

在最近更新的Libgdx中,与游戏显示相关度最高的包总共有两个,一个是graphics包,其中包含着Libgdx为进行OpenGL渲染所提供的功能实现,而另一个,就是下面介绍的scenes包,这里包含着Libgdx所提供的可以直接使用到游戏中的游戏组件,共分scenes2d以及scenes3d两大部分(3D部分暂无内容)。其中2D部分的核心在于Actor类,Libgdx所有2D组件使用都围绕着Actor展开。

对于Libgdx中游戏组件使用的简单关系说明:

AndroidApplication (Activity的子类,只有启动类继承了AndroidApplication并执行才能启动Libgdx类库)

|

ApplicationListener (仅可在初始化时注入ApplicationListener,此后除非替换Activity否则无法切换ApplicationListener) - Game (ApplicationListener的libgdx抽象实现,其中Screen可切换)

|

Screen (基本函数与ApplicationListener近乎一致,唯一差别在于可以通过Game类用setScreen函数进行切换,如不使用Game类则可无视它的存在)

|

Stage (游戏场景用类,用以管理添加其中的具体Actor,管理Actor的手段在于内置的Group类)

|

Group (本身为Actor的具体实现,能够处理注入其中的Actor,也能以递归方式管理注入其中的其它Group)

|

Actor (游戏用演员或者说角色,与Action类组合使用时可以产生不同种类的“动画行为”,Action部分的具体实现基本与Cocos2D一致)

|

Image、Button、Label等 (细分Actor的具体实现,以重载方式响应事件,除Group外相互间不能组合叠加,事件能否传递取决于上级组件是否设置了相关监听)


就目前来说,Libgdx可用的游戏组件相对比较稀少,部分功能或者需要用户自行实现。不过最近有一位网名moritz的手机游戏“半全职”开发者(因为他自己说手机游戏并不是他唯一的收入来源)已经加入Libgdx项目,未来将重点改进Libgdx的scene2d部分,鉴于Libgdx作者为此特意写了一篇名为“welcome moritz”的博文,moritz此人应该是有一定能力的家伙,对于Lingdx未来表现大约还是值得期待的(话说,莫非moritz只对改造Libgdx的2D模块有兴趣?Libgdx作者博文中提到目前moritz开发的3D游戏没有使用Libgdx——那啥,先把3D组件部分做出来吧,现在是NULL啊……)。

在Libgdx的SVN,也有一些具体的游戏示例,大家可以下载后亲身体验其效果。

00


PS:为体现Libgdx最新特性,上述示例使用的Libgdx是2月1日从Libgdx SVN下载的版本(2011年1月28日更新版),请自行下载相关类库,以保证所用版本维持在最新。

附录,使用Libgdx时的几点注意事项:


1、Libgdx使用笛卡尔坐标系(初始坐标为左下0,0),而JavaSE、JavaME以及标准Android系统(还有LGame引擎)使用的是屏幕坐标系(初始坐标为左上0,0),程序员在使用时必须分清差别,以免不知道如何定位(通常笛卡尔系Y轴由下向上延伸,屏幕系Y轴由上向下延伸)。

2、在Android环境使用Libgdx的Gdx.files.internal方法时(即FileHandle类以FileType.Internal模式工作),要读取的文件必须置于Assets文件夹下才能读取,在Linux、Mac、Windows环境下则可以置于除jar内部外的任何可读取位置。

3、Libgdx以native方式自带图像解码器,通过其提供的Pixmap可以对指定图像进行像素级渲染操作,从而不依赖Android的Bitmap加载处理图像,不过目前只支持png、jpg、bmp三种图片格式。

4、Libgdx要求在游戏中使用的图片宽与高皆为2的整数次幂,否则会产生一个Gdx异常并禁止加载行为(texture width and height must be powers of two)。

5、Libgdx以ApplicationListener作为游戏的基础界面容器,其作用近似LGame中的Screen,但并不完全一致,因为Libgdx并没有提供可以直接切换ApplicationListener的函数。目前最新版本的Libgdx中提供了Game类(ApplicationListener子类,本身为抽象类)和一个供Game类调用的Screen类用以解决此问题。具体的Libgdx切换游戏画面方法是,先用继承Game类的游戏窗体进行initialize让基础画面显示,再让具体的细分游戏模块继承Screen类进行不同游戏画面的具体绘图,而后Game类通过setScreen方法进行画面切换。

6、Libgdx的图像加载处理(以及部分渲染),音频播放和自带的Box2D封装皆通过JNI方式实现,因此必须在libs文件夹下添加armeabi(或高版本Android系统支持的armeabi-v7a)文件夹以及相关so文件Android版Libgdx才能正常运行。

7、千万不要以模拟器上的Libgdx运行速度判定其性能,否则很容易产生误判(也不建议用性能不好的真机运行)

————————————————————

如果有人关心这些Android游戏框架的话,小弟会按照某国际友人写的Android的15款开源框架那篇英文文章里介绍过的框架一一写出基础使用入门(这里吐句槽,洋人怎么也玩山寨啊,而且是先翻译再山寨~~~),没人关心就算了……

分享到:
评论

相关推荐

    Android游戏框架AndEngine使用入门最新版本

    本文档主要讲述的是Android游戏框架AndEngine使用入门;AndEngine是一款以OpenGLES方式进行画面渲染的2D游戏引擎,可以运行在支持Android 1.6及以上版本的系统当中。应该说,相较前文介绍的Libgdx引擎,AndEngine...

    Android游戏框架AndEngine使用入门

    ### Android游戏框架AndEngine使用入门 #### 一、AndEngine引擎概述 AndEngine是一个用于开发Android平台2D游戏的游戏框架,它使用OpenGL ES来进行图形渲染,支持Android 1.6及以上的版本。相比于其他游戏引擎如...

    android游戏引擎libGDX 实例和源码gdx-helloworld-0.9.1,很不错的,强烈推荐

    在本实例中,"gdx-helloworld-0.9.1"是一个基于LibGDX的游戏入门项目,非常适合初学者学习和理解LibGDX的基本用法。 LibGDX的核心组件包括以下几个部分: 1. **Backend**:LibGDX提供了不同平台的后端支持,如...

    使用LibGDX开发一个完整游戏 教程全集

    LibGDX是一个强大的开源游戏开发框架,专为创建跨平台的游戏而设计,支持Windows、Linux、Mac OS X、Android、iOS以及HTML5等平台。这个教程全集将带你逐步了解如何利用LibGDX来开发一个完整的游戏。 首先,让我们...

    libgdx游戏引擎开发指南

    libgdx是一个开源的Java游戏开发框架,它允许开发者创建可以在多个平台(包括Android、iOS、Windows、Mac OS X以及Linux)上运行的2D和3D游戏。libgdx提供了丰富的API来处理图形、音频、输入、物理和网络通信等方面...

    braingdx,:视频游戏:基于libgdx的游戏jam框架。.zip

    3. 快速原型开发:braingdx降低了游戏开发的入门门槛,使得开发者可以在短时间内创建出基本的游戏框架,适合游戏jam这类时间紧迫的活动。 4. 简化的输入处理:braingdx提供了简洁的API来处理用户输入,包括键盘、...

    LibGDX Game Development Essentials

    本书“LibGDX Game Development Essentials”致力于为读者提供LibGDX游戏开发框架的核心知识,引导读者了解并掌握如何使用LibGDX来制作游戏。LibGDX是一个开放源码的Java游戏开发框架,它为游戏开发者提供了跨平台...

    AndroidGame初学者游戏开发框架

    对于初学者,以下是一些推荐的Android游戏框架: 1. Unity:一款跨平台的3D游戏引擎,支持C#编程,提供强大的可视化编辑器。 2. Unreal Engine:专业级的3D引擎,以C++为基础,适合开发高质量图形的游戏。 3. Godot...

    android游戏开发入门级经典实例

    在Android游戏开发领域,入门级的经典实例是学习者掌握基础知识和技能的重要途径。"android游戏开发入门级经典实例"这个主题旨在为初学者提供简单易懂的游戏开发实践,帮助他们快速进入Android游戏开发的世界。虽然...

    Android 游戏开发入门随书光盘的代码

    【Android游戏开发入门】是一个适合初学者的编程学习资源,主要涵盖了使用Android平台进行游戏开发的基础知识和实践操作。这个随书光盘的代码包含了多个示例项目,可以帮助读者更直观地理解Android游戏开发的核心...

    Android.游戏开发入门

    3. **Android游戏框架**:Android SDK提供了许多游戏开发的工具和库,例如SurfaceView和Canvas用于绘制游戏画面,AudioTrack和MediaPlayer处理音频。还有一些第三方框架如LibGDX,它简化了游戏开发过程,提供跨平台...

    基于Java开发的libGDX游戏框架开发的2D横版Android跑酷游戏..zip

    用java写的项目,免费分享给大家,比较适合新手入门学习,欢迎下载使用。用java写的项目,免费分享给大家,比较适合新手入门学习,欢迎下载使用。用java写的项目,免费分享给大家,比较适合新手入门学习,欢迎下载...

    Libgdx开发教程

    Libgdx是一个功能强大的跨平台游戏开发框架,支持Windows、Linux和Android等操作系统,主要使用Java语言编写,同时也融入了部分C/C++代码以优化性能密集型任务,如物理引擎和音频处理。这一设计使得开发者能够在桌面...

    Android游戏开发PDF

    本文将深入探讨Android游戏开发的基础知识,帮助初学者入门并理解这一领域的核心概念。 一、Android游戏开发环境搭建 要开始Android游戏开发,首先需要安装Android Studio,它是Google官方提供的集成开发环境(IDE...

    Android入门游戏开发

    对于入门开发者,可以使用一些游戏框架简化开发过程,如LibGDX、Cocos2d-x或Unity。这些框架提供了许多预设功能,如动画、碰撞检测和音频管理,让开发者更专注于游戏逻辑。 5. **游戏逻辑与编程**: 游戏的核心...

    android应用及游戏开发入门教程代码(2)

    Android游戏开发通常会用到libGDX、Unity3D等框架。 6. **Android SDK和API**:SDK提供了开发Android应用所需的所有工具和库,而API则定义了可以调用的函数和类。熟悉不同版本的Android API差异,可以帮助你确保...

    Android 4 游戏编程入门经典(英文完整版)

    《Android 4 游戏编程入门经典》作为一本关于移动游戏开发的教程书籍,它涵盖了成为一名专业Android游戏开发者的必要知识。本书的主要内容分为几个部分,包括但不限于Android开发工具的设置和使用、2D游戏编程、...

    android游戏开发源码

    4. **Android游戏框架**:有许多专门为Android游戏设计的框架,例如libGDX、Unity、Cocos2d-x等。这些框架提供了游戏图形渲染、物理引擎、音频处理等功能,大大简化了游戏开发过程。 5. **OpenSudoku-android**:这...

    libgdx demo

    LibGDX 是一款强大的开源跨平台游戏开发框架,它允许开发者使用 Java 语言编写游戏,并将其部署到多种设备上,包括 Android、iOS、Windows、Mac 和 Linux。本项目是基于 LibGDX 的一个基础演示(Demo),旨在帮助...

Global site tag (gtag.js) - Google Analytics