Android 游戏框架之Libgdx由浅入深

转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=5345&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

 

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提供):

下面开始,我将就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类将基本图元制成更加复杂的高级图元展示出来。

  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的作用,只能构建一组静态贴图集合罢了,特此说明。java代码:

  1. // Libgdx的Texture与Sprite使用
  2. public class Main extends AndroidApplication {
  3. class TestSprite implements ApplicationListener {
  4. // 准备绘图用SpriteBatch

  5. SpriteBatch spriteBatch;
  6. // 准备游戏精灵
  7. Sprite sprite;
  8. // 准备图片加载用Texture
  9. Texture texture;

  10. public void create() {
  11. // 构建SpriteBatch
  12. spriteBatch = new SpriteBatch();
  13. // 构建Texture,图像宽与高大小都必须为2的整数次幂,否则提示异常
  14. // PS:在Android环境使用Libgdx的internal加载时必须文件必须位于assets目录下
  15. texture = new Texture(Gdx.files.internal( "mySprite.png" ));
  16. // 以指定Texture构建Sprite
  17. sprite = new Sprite(texture);
  18. // 定位到100, 180(Libgdx使用标准笛卡尔坐标系,自左下0,0开始)
  19. sprite.setPosition(100 , 180 );
  20. }

  21. public void render() {
  22. // 清屏
  23. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  24. // 初始化绘图调用
  25. spriteBatch.begin();
  26. // 绘制精灵到游戏屏幕
  27. sprite.draw(spriteBatch);
  28. // 结束绘图调用
  29. spriteBatch.end();
  30. }

  31. public void dispose() {
  32. // 释放占用的资源
  33. spriteBatch.dispose();
  34. texture.dispose();
  35. }

  36. public void resume() {
  37. }

  38. public void pause() {
  39. }

  40. public void resize( int width, int height) {
  41. }

  42. }

  43. public void onCreate(Bundle bundle) {
  44. super .onCreate(bundle);
  45. // 初始化游戏屏幕,并设置是否支持GLES 2.0,如果您对向下兼容没什么需要选择true即可(2.1以上),否则选择false。
  46. initialize(new TestSprite(), true );
  47. }

  48. }
复制代码

java代码:

  1. // Libgdx的Texture与Sprite使用
  2. public class Main extends AndroidApplication {
  3. class TestSprite implements ApplicationListener {
  4. // 准备绘图用SpriteBatch
  5. SpriteBatch spriteBatch;
  6. // 准备游戏精灵
  7. Sprite sprite;
  8. // 准备图片加载用Texture
  9. Texture texture;
  10. public void create() {
  11. // 构建SpriteBatch
  12. spriteBatch = new SpriteBatch();
  13. // 构建Texture,图像宽与高大小都必须为2的整数次幂,否则提示异常
  14. // PS:在Android环境使用Libgdx的internal加载时必须文件必须位于assets目录下
  15. texture = new Texture(Gdx.files.internal("mySprite.png"));
  16. // 以指定Texture构建Sprite sprite = new Sprite(texture);
  17. // 定位到100, 180(Libgdx使用标准笛卡尔坐标系,自左下0,0开始) sprite.setPosition(100, 180);
  18. }
  19. public void render() {
  20. // 清屏
  21. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  22. // 初始化绘图调用
  23. spriteBatch.begin();
  24. //绘制精灵到游戏屏幕
  25. sprite.draw(spriteBatch);
  26. // 结束绘图调用
  27. spriteBatch.end();
  28. }
  29. public void dispose() {
  30. // 释放占用的资源
  31. spriteBatch.dispose();
  32. texture.dispose();
  33. }
  34. public void resume() { }
  35. public void pause() { }
  36. public void resize(int width, int height) { }
  37. }
  38. public void onCreate(Bundle bundle) {
  39. super.onCreate(bundle);
  40. // 初始化游戏屏幕,并设置是否支持GLES 2.0,如果您对向下兼容没什么需要选择true即可(2.1以上),否则选择false。
  41. initialize(new TestSprite(), true);
  42. }

  43. }
复制代码

Pixmap:

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

java代码:

  1. // Libgdx的Pixmap使用

  2. public class Main extends AndroidApplication {
  3. class TestPixmap implements ApplicationListener {
  4. // 准备绘图用SpriteBatch
  5. SpriteBatch spriteBatch;
  6. // Pixmap是Libgdx提供的针对opengl像素操作的上级封装,它可以凭空构建一个像素贴图,
  7. // 但是它的现实必须通过Texture。
  8. Pixmap pixmap;
  9. // 准备Texture
  10. Texture texture;

  11. public void create() {
  12. // 构建SpriteBatch
  13. spriteBatch = new SpriteBatch();
  14. // 构建Pixmap(在Android环境使用internal加载模式时,文件必须放置于assets文件夹下)
  15. pixmap = new Pixmap(Gdx.files.internal( "myPixmap.png" ));
  16. // 绘制一个蓝方块到Ball图像之上
  17. pixmap.setColor(Color.BLUE.r, Color.BLUE.g, Color.BLUE.b,Color.BLUE.a);
  18. pixmap.drawRectangle(15 , 15 , 40 , 40 );
  19. // 以指定Pixmap构建Texture
  20. texture = new Texture(pixmap);
  21. // 注入Texture后的pixmap已经没用,可以注销
  22. pixmap.dispose();
  23. }

  24. public void dispose() {
  25. spriteBatch.dispose();
  26. texture.dispose();
  27. }

  28. public void pause() {
  29. }

  30. public void render() {
  31. // 清屏
  32. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  33. // 初始化绘图调用
  34. spriteBatch.begin();
  35. // 绘制精灵到游戏屏幕
  36. spriteBatch.draw(texture, 100 , 180 );
  37. // 结束绘图调用
  38. spriteBatch.end();
  39. }

  40. public void resize( int width, int height) {
  41. }

  42. public void resume() {
  43. }

  44. }

  45. public void onCreate(Bundle bundle) {
  46. super .onCreate(bundle);
  47. // 初始化游戏屏幕,并设置是否支持GLES 2.0,如果您对向下兼容没什么需要选择true即可(2.1以上),否则选择false。

  48. initialize(new TestPixmap(), true );
  49. }
  50. }
复制代码


java代码:

  1. // Libgdx的Pixmap使用
  2. public class Main extends AndroidApplication {
  3. class TestPixmap implements ApplicationListener {
  4. // 准备绘图用SpriteBatch SpriteBatch spriteBatch;
  5. // Pixmap是Libgdx提供的针对opengl像素操作的上级封装,它可以凭空构建一个像素贴图,
  6. // 但是它的现实必须通过Texture。
  7. Pixmap pixmap;
  8. // 准备Texture
  9. Texture texture; public void create() {
  10. // 构建SpriteBatch
  11. spriteBatch = new SpriteBatch();
  12. // 构建Pixmap(在Android环境使用internal加载模式时,文件必须放置于assets文件夹下)
  13. pixmap = new Pixmap(Gdx.files.internal("myPixmap.png"));
  14. // 绘制一个蓝方块到Ball图像之上
  15. pixmap.setColor(Color.BLUE.r, Color.BLUE.g, Color.BLUE.b, Color.BLUE.a);
  16. pixmap.drawRectangle(15, 15, 40, 40);
  17. // 以指定Pixmap构建Texture
  18. texture = new Texture(pixmap);
  19. // 注入Texture后的pixmap已经没用,可以注销
  20. pixmap.dispose();
  21. }
  22. public void dispose() {
  23. spriteBatch.dispose();
  24. texture.dispose();
  25. }
  26. public void pause() { }
  27. public void render() {
  28. // 清屏
  29. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  30. // 初始化绘图调用
  31. spriteBatch.begin();
  32. // 绘制精灵到游戏屏幕
  33. spriteBatch.draw(texture, 100, 180);
  34. // 结束绘图调用
  35. spriteBatch.end();
  36. }
  37. public void resize(int width, int height) { }
  38. public void resume() { }
  39. }
  40. public void onCreate(Bundle bundle) {
  41. super.onCreate(bundle);
  42. // 初始化游戏屏幕,并设置是否支持GLES 2.0,如果您对向下兼容没什么需要选择true即可(2.1以上),否则选择false。
  43. initialize(new TestPixmap(), true);
  44. }

  45. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值