LibGdx----Texture, TextureRegion, SpriteBatch

Introduction

  本章介绍2D图形相关的一些基本内容,包括如何使用Texture,TextureRegion和SpriteBatch。

Texture

  略。。

SpriteBatch

  LibGdx使用SpriteBatch来完成纹理映射并在屏幕上显示被纹理映射的四边形的所有工作。它使得在屏幕上绘制图形极为简单,并且经过优化。它在屏幕坐标系中工作,使用屏幕像素的绝对坐标。左下角是原点(0,0),X轴向右,Y轴向上。由于SpriteBatch可以同时处理多个绘制请求、使用GPU进行渲染加速并序列化请求,所以程序员只要启动它就行。

  下面的代码把一张图片绘制到屏幕上:

[java] view plaincopy

  1. public class TextureFun implements ApplicationListener {
  2. private Texture                 druidTexture;           // #1
  3. private SpriteBatch     batch;                          // #2
  4. @Override
  5. public void create() {
  6. druidTexture = new Texture(Gdx.files.internal("druid.png"));    // #3
  7. batch = new SpriteBatch();                                      // #4
  8. }
  9. @Override
  10. public void render() {
  11. batch.begin();                                  // #5
  12. batch.draw(druidTexture, 100, 100);             // #6
  13. batch.end();                                    // #7
  14. }
  15. // … rest of methods omitted … //
  16. }

1. 声明一张纹理

2. 声明用来把纹理显示到屏幕的SpriteBatch

3. 创建纹理。图片druid.png需要位于asset文件夹里,图片格式可以是jpg,png或bmp,图片宽度和高度必须是2的n次幂,如1,2,4,8,16,32,64,128...另外,宽度和高度不需要相等

4. 创建SpriteBatch

5. 调用begin()函数后,SpriteBatch开始接收请求

6. 一条绘制请求,它请求SpriteBatch把纹理绘制到(100,100)的位置。注意这个坐标是屏幕绝对坐标。

7. 告诉SpriteBatch暂时没有其他请求了,它可以开始处理刚才收到的请求了。

显示结果和坐标系统如下所示:

  你可以通过在begin()和end()函数之间添加多条draw()指令来绘制多个图形,绘制顺序和draw()的调用顺序相同,所以如果有重叠的部分,后来的图片会在覆盖在先前的图片上面。

  除了简单的draw(),SpriteBatch还有一些其他功能,如设置混合颜色、设置转换矩阵。不过转换矩阵必须在begin()之前设置。

  下面的代码启用SpriteBatch的纹理混合功能并设置混合方法。不过纹理混合在默认就是启用的。

[java] view plaincopy

  1. ...
  2. batch.enableBlending();
  3. batch.setBlendFunction(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
  4. ...

  纹理有多种不同的创建方式,都在源码的注释中有详细介绍。

  当需要使用mipmaps(多级纹理)时,Texture会在初始化时就创建它们。MipMaps是指预先计算好的,同一张图片的不同尺寸的副本,在需要缩放图片以适应四边形时,选择最恰当的那个副本,可以提高渲染效率。
  draw()函数有多种重载,各种参数的意义在源码注释中都很详细。下面是其中之一:

[java] view plaincopy

  1. public void render() {
  2. batch.begin();
  3. batch.draw(druidTexture, 100, 100);
  4. batch.draw(druidTexture, 200, 100, 32, 32, 64, 64, 1f, 2.0f, 45f, 0, 0, 64, 64, false, false);
  5. batch.end();
  6. }


  在注释中有提一些参数是Texel空间的,texel是指导图片上的一个像素,要和屏幕上的一个像素区别开。

TextureRegion

  在一个游戏里,必然有很多需要绘制的元素,如果每个元素都要转换成一张纹理,对GPU的资源消耗是很大的,因为在绘制前,GPU都要把图片载入显存并绑定到OpenGL上,然后OpenGL再绘制需要的纹理并在不同纹理间切换,而绑定和切换的代价都是很昂贵的。

  TextureRgion能解决这个问题,它从一个纹理上切割出一个区域并让SpriteBatch作用于该区域。这样,一张纹理上可以包含多个需要绘制的元素,而只有与该元素对应的那部分才会绘制出来。包含多个绘制元素的纹理也称为sprite sheet。

  下图说明一张纹理如何被分割成多个元素。这种方式能避免在不同纹理间切换的昂贵代价。纹理的大小必须是2的n次幂,但纹理区域可以随意定义。

  下面的代码创建并绘制这张纹理的四个区域,还在(0,0)位置显示了一张缩小的纹理。

[python] view plaincopy

  1. public class TextureFun implements ApplicationListener {
  2. private Texture                 texture;                        // #1
  3. private SpriteBatch             batch;
  4. private TextureRegion[]         regions = new TextureRegion[4]; // #2
  5. @Override
  6. public void create() {
  7. texture = new Texture(Gdx.files.internal("sprite_sheet.png"));
  8. batch = new SpriteBatch();
  9. regions[0] = new TextureRegion(texture, 0, 0, 64, 64);          // #3
  10. regions[1] = new TextureRegion(texture, 0.5f, 0f, 1f, 0.5f);    // #4
  11. regions[2] = new TextureRegion(texture, 0, 63, 64, 64);         // #5
  12. regions[3] = new TextureRegion(texture, 0.5f, 0.5f, 1f, 1f);    // #6
  13. }
  14. @Override
  15. public void render() {
  16. batch.begin();
  17. batch.draw(texture, 0, 0, 64, 64);                              // #7
  18. for (int i = 0; i < regions.length; i++) {
  19. batch.draw(regions[i], 75 * (i + 1), 100);              // #8
  20. }
  21. batch.end();
  22. }
  23. // … rest of methods ommited... //
  24. }

  如果要被分割的纹理区域大小相等且没有间隔,可以用一种更简单的方式来创建TextureRegion:

[java] view plaincopy

  1. TextureRegion[][] regions = TextureRegion.split(texture, 64, 64)
时间: 2024-11-10 11:20:14

LibGdx----Texture, TextureRegion, SpriteBatch的相关文章

libgdx学习记录17——照相机Camera

照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. Camera分为PerspectiveCamera(远景照相机)和OrthographicCamera(正交照相机). PerspectiveCamera为正常的照相机,当距离物体越远,则物体越小,一般在3D空间中使用. OrthographicCamera忽略了其Z轴,不管距离物体多远,其大小始终不

5、使用Libgdx设计一个简单的游戏------雨滴

(原文:http://www.libgdx.cn/topic/49/5-%E4%BD%BF%E7%94%A8libgdx%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E6%B8%B8%E6%88%8F-%E9%9B%A8%E6%BB%B4) 在深入研究Libgdx提供的API之前,我们先来创建一个简单的游戏来感受一下libgdx各个功能.这里将简单的对一些功能做介绍. 使用的技术: 文件访问 清除屏幕 渲染图片 使

Libgdx 之SpriteBatch深入分析

Libgdx共享资源 因为Libgdx可以在多平台上运行,因此理论上资源应该放在core目录下,因为Android和桌面版都包含主目录.但是Android对于如何存放这些文件有严格的规则,我们必须把资源放在固定的目录下.因此如果创建的工程需要在Android设备下运行的话,必须把资源放在Android项目自动创建的资源目录下.如果只是练习的可以放在core工程下面. SpriteBatch的使用一 从上面涂可以看出SpriteBatch继承在Disposable,因此在游戏的最后必须调用disp

libgdx学习记录19——图片动态打包PixmapPacker

libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题,这里针对的是0.9.9版本) 2. 使用TexturePacker将图片打包好然后作成一张大图添加进来. 第二种方法是常用方法,但是不太灵活,添加.删除某些图片不太方便,改动较大.这里可以考虑使用PixmapPacker将图片进行动态打包. 主要方法: pack(String name, Pixm

Android游戏框架Libgdx使用入门

转载自:http://blog.csdn.net/cping1982/article/details/6176191 Libgdx作者博客:http://www.badlogicgames.com/ Libgdx项目地址:http://code.google.com/p/libgdx/ Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能执行在Mac.Linux.Windows等系统)与Android平台(Android1.5以上就可以使用.Andro

libgdx学习记录11——平铺地图TiledMap

地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件. 编辑好后,可通过TmxMapLoader来读取地图文件.可通过一个正交相机OthographicCamera和正交地图渲染器OrthogonalTiledMapRenderer来进行显示. 实例如下: 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.ba

libgdx学习记录5——演员Actor

Actor也是libgdx中非常重要的一个元素,一般与stage配合一起使用.Actor能够设置大小,位置,旋转和动画等. 我们自定义的Actor一般需要继承于Actor,并且重写其中的act和draw方法. 自定义的actor是一个图片. 1 class MyActor extends Actor{ 2 TextureRegion region; 3 4 public MyActor(){ 5 Texture texture = new Texture( Gdx.files.internal(

libGDX开发教程(五)--优美字体的使用

http://blog.sina.com.cn/s/blog_dbc528b10101hppg.html 做Android开的同学经常会纠结怎么能使用一些漂亮的字体获取用户的芳心,如果你想实现这个目的,那么TTF字库就是必不可少的了.什么是TTF字库呢?可能许多不熟悉TTF字库的同学一看这么生疏的名字就被吓到了,不要担心,其实他并不可怕.所谓的TTF其实就是一种格式,就是类似这样,如“123.ttf”和 “123.txt”是一样的,“.txt”文档是保存文字的,而TTF就是保存字体的,就相当于H

libgdx学习记录1——图片显示

libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在assets文件下,表示是Gdx的内部文件. gl1.x使用的图片的宽高必须是2的整次幂,而在gl2.0以后的版本则没有此限制. 使用的版本为libgx 0.9.9. 代码如下: package com.fxb.bird; import com.badlogic.gdx.ApplicationAdap