libGDX系列-libGDX 入门精要

by AlexQ (email alexq_andr@163.com)

image

导语
1. What's libGDX
2. Standing on the Shoulders of Giants
3. Core

What's libGDX

一个作为引擎和游戏基础的高性能,跨平台的游戏开发框架。这个框架允许我们我们专注于基础而不是游戏引擎的新的特性。它具有很棒的灵活性。

  • libGDX是一个跨平台的开发框架。它目前支持的平台有Windows、Linux、Mac OS X、Android、黑莓、iOS和HTML5。
  • libGDX允许你将代码不经任何修改的部署到多个平台,而不是修改你的代码适应不同的平台或者直接编译到HTML5。你可以在一个桌面开发环境中迅速部署你的代码。你可以使用所有的Java生态系统中的开发工具。
  • libgdx可以在底层进行操作。可以让你直接访问文件系统,输入设备,输出设备,音频设备和通过统一的OpenGL ES接口访问OpenGL。
  • 基于这些底层的操作,libgdx建立了强大的API帮助你完成常见的开发任务。比如渲染精灵,绘制文本,构建用户界面,播放声音效果和音乐流,线性代数和三角计算,解析JSON和XML数据等。
  • 在必要时,libGDX可以通过本地代码追求更好的性能。所有这些功能隐藏在Java API函数中,所以你不用为为不同平台交叉编译本地代码而担心。libGDX的很多部分可以运行在已知的平台中,所以你不用担心。
  • libGDX旨在成为一个框架而不是一个引擎,世上没有一劳永逸的事。相反,Libgdx强大的抽象可以让你编写出你想要的游戏或者应用。

Standing on the Shoulders of Giants

libGDX 基于如此多的第三方库:

  • OpenGL (跨编程语言、跨平台的编程接口规格的专业的图形程序接口)
  • FreeType (完全免费(开源)的、高质量的且可移植的字体引擎)
  • mpg123 (快速的、可移植的 MPEG 播放器和解码器)
  • xiph.org (开放的编解码器)
  • soundtouch (开源的音频处理库,主要实现包含变速、变调、变速同时变调等三个 功能模块)
  • box2d (用于模拟2D刚体物体的引擎)
  • LWJGL (为开发者提供简单易用的API来访问OpenGL (Open Graphics Library)与OpenAL (Open Audio Library) 同时也提供操作控制器(Gamepads, Steering wheel和操纵杆)的API)
  • OpenAL (自由软件界的跨平台音效API)
  • KissFFT (名鼎鼎的kiss fft算法,对浮点运算的优化,以及针对定点运算的优化)

HelloWorld

执行步骤:

  1. 下载gdx-setup.jar
    图片名称

  2. 启动gdx-setup.jar
    图片名称

  3. Android需要配置SDK,执行“Generate”
    图片名称

  4. AndroidStudio Open 文件夹
    图片名称

  5. Run
    图片名称

Code预览:


public class AndroidLauncher extends AndroidApplication {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
initialize(new MyGdxGame(), config);
}
}



public class MyGdxGame extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
}
@Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
}


Core

libGDX 图形绘制

主要学习四个类:SpriteBatch、Texture 、TextureRegion 、 Sprite
1. Texture 类
* 定义:图片从原始格式解码并上传到GPU就被称为纹理。

* 功能:其实就是承装获取到目标图片的容器。

* helloworld中有加载图片的事例:

    <code><pre>
        new Texture("badlogic.jpg");
    </code></pre>   
2. SpriteBatch 类
* 定义:SpriteBatch用于绘制二维矩形参考纹理(区域)。SpriteBatch类可用于批量绘图命令和优化处理的GPU。

* 功能:SpriteBatch可以把许多相同纹理一起描述并一起送入GPU,同时赋予纹理和坐标以便每个图形的绘制。-------------SpriteBatch可以理解为画笔。
* helloworld中有加载图片的事例:
    <code><pre>
        SpriteBatch batch;
        ...
        public void render () {
            batch.begin();
            batch.draw(img, 0, 0);
            batch.end();
        }
    </code></pre>   
3. TextureRegion 类
* API定义:定义了一个矩形区域的纹理。使用的坐标系统与x轴指向右,Y轴向下在左上角的起源。

* 功能用途:实际操作中我们也经常使用图片的一部分,或者将多个图片资源集合在一个图片文件中。而要显示图片的一部分就可以使用TextureRegion类。
4. Sprite 类
* API定义:持有的几何形状,颜色,和纹理信息使用加载绘制2D精灵。一个精灵有定位和给定的宽度和高度尺寸。
* 功能用途:TextureRegion的加强版,比TextureRegion多了一些功能,如:可以指定位置、颜色、旋转等。

    **其实Sprite的功能就是以上的集合。但是Sprite更方便,它用一个对象描述了一切,但是同时加入了很多TextureRegion和Texture没有的东西,如位置、颜色、旋转.**

libGDX 舞台和演员

1. 舞台 Stage类
  • 定义:包含拥有层次结构的一个二维场景,场景中有许多演员。处理视图和分配输入事件。舞台负责操作视角,和处理分配输入事件。

  • 功能:一个Stage可以充满整个屏幕。设置视角(一般是浮点型和布尔类型),同时设置使用的相机,调配 Actor、Group 与 Screen 之间的关系转换(包括坐标)。一个Stage必须负责接收输入事件,同时将它分配给演员。这通常是通过Stage的gdx.input.setinputprocessor来实现。一个inputmultiplexer可用来处理输入事件的不同阶段,即之前或之后。如果一个演员从输入的方法中处理一个事件而返回TRUE,那么Stage的输入方法也会返回true,导致随后的inputprocessors不接收事件。

  • 使用方法:Stage(float width, float height, boolean keepAspectRatio, SpriteBatch batch)

    (1)第一个参数:设置舞台的宽度。

    (2)第二个参数:设置舞台的高度。

    (3)第三个参数:是负责是否让舞台铺满屏幕,如果这个值是ture的话,舞台的尺寸就是你设置的大小。如果是false的话,就铺满屏幕。

    (4)第四个参数:就是传入你所声明的Spirtibatch。

2. 演员 Actor类
  • 定义:在二维场景图中,一个演员拥有位置,矩形的大小,起点,规模,旋转,和颜色等属性。演员的位置是相对于演员的父母,它的起点是相对位置,同时可用于缩放和旋转。一个演员也有一个行动,可以加入监听来实现演员接收事件通知。

  • 功能:演员类是一个项目中的基本元素,libgdx中演员封装了许多有用的方法,比较常用的有draw、addlistrener、fire、addaction等等。

3. 舞台和演员的概念很好的抽象了游戏中的元素概念,实现了同一场景不同演员随意配置切换,以及同一演员出现在不同场景。

libGDX 音效

1. Audio 接口

支持格式:mp3、ogg、wav等。


public interface Audio {
public Sound newSound(FileHandle fileHandle);
public Music newMusic(FileHandle file);
public AudioDevice newAudioDevice(boolean isMono);
}

2. Sound 接口
  • Sound(声音)类旨在播放声音效果
  • 定义:短音频的剪辑,可以实现多次播放。它是完全加载到内存的,并且只负责加载小的音频文件。当使用音频结束后,调用dispose方法来销毁。
  • 支持格式:支持wav格式,不支持ogg格式。


Sound sound = Gdx.audio.newSound(Gdx.files.internal("sound.wav"));
sound.setLooping(true);
sound.play();
sound.setVolume(15);

3. Music 类
  • 定义:一段长音频的剪辑,可以在实现多次播放。它是部分被装载到内存的,并且只负责加载大的音频文件。当该音频使用结束后,调用dispose方法来销毁。
  • 支持格式:支持MP3 OGG WAV等格式。


Music music = Gdx.audio.newMusic(Gdx.files.internal("xxx.ogg"));
music.setLooping(true);
music.setVolume(15);
music.play();

libGDX 资源加载器

AssetManager 类 负责加载类似于 textures, bitmapfonts, tile maps, sounds, music 等类型的文件。
API

(1)clear() 方法:清空和删除所有已加载资源和预加载队列。

(2)containsAsset(T asset) :返回的是一个布尔类型,检测是否加载了否个资源。

(3)finishLoading() : 所有资源加载完成后,结束加载资源,也可以手动设置加载到某一项结束加载。

(3)getAssetFileName(T asset) :获取资源名字,得到的是一个String类型的文件。

(4)getLoadedAssets() :获取已经加载的资源数量。

(5)getProgress() :获取加载进度,返回一个0 - 1之间的小数,这个一般可以用作制作进度条。

(6)isLoaded(java.lang.String fileName) :返回的是一个布尔类型,检测你传入的文件是否已经被加载了,一般使用的if判断语句中。

(7)load(java.lang.String fileName, java.lang.Class type) :将已传入的文件名和类型加入到预加载队列,为了防止名字和类型重复,这里需要将名字和类型都传入,常用。

(8)setLoader(java.lang.Class type, AssetLoader loader) :设置加载器,其实AssetManager类中包装了需要Assetloader对象,这样才能完成不同类型的文件的加载,当然AssetManager也可以加入加载器。

(9)unload(java.lang.String fileName) :卸载资源,如果某个资源不使用了,就可以卸载该资源,这样有利于游戏流畅性。

(10)update():加载资源,实际上Load方法其实只是将预加载的资源加载到了预加载队列,实质上并没有加载资源,使用update()方法才会加载资源,调用该方法才能,使不断加载那写储存在预加载对了中的资源。

功能优点:(官方翻译)

(1)加载大部分资源采用异步加载的方式,这样就能在加载的同时不阻塞渲染进程.

(2)实现了引用计数,当A和B都依赖C素材的时候,C只有在A,B都销毁了才会销毁.这也意味着即使一个资源加载了很多次,在内存中也之后一份.

(3)使用一个单一管理器来实现管理所有素材.

(4)可以实现加载素材时占用的系统内存。

libGDX Particle (粒子效果&粒子编辑器)

关于这个例子编辑器,个人推荐看看我下面提到的视频,里面有专门讲粒子编辑器使用的课程,比较直观。

图片名称

官方网站上对软件中的各个参数的解释如下:

  • Delay: 当粒子系统开始后,发射器等待多少时间开始发射
  • Duration:发射器生存跨度,也就是粒子效果持续的的时间,注意这个时间和粒子生存时间不同
  • Count: 顾名思义,同一时间可出现的粒子个数,有一个上限一下下限。
  • Emission: 每秒钟发射多少个粒子,这个参数带了一张图表,图表中间写着duration,代表图表X 轴表示发射器生存时间,意思是说发射器的生存时间内,该图表控制各个时间点粒子每秒钟发射多少个,左边的上下两个文本框用于控制生成初始值时的范围,左边的'>'字符用于输入另外一个数值,比如说下面那个”>“, 发射器会在这两个值中间选择一下随机值作为上限值,Relative,如果选中,表示图表中的值是相对值,相对于初始值。否则是个绝对值.
  • Life: 一个粒子的生存时间,
  • Life Offset: 决定粒子在显示之前已经用掉它生命多少值 ,这样可以实现让一个粒子在它生命50%时再显现
  • X Offset and Y Offset: 粒子出现在位置相对中心位置的像素偏移
  • Spawn: 用于产生粒子的发射器的形状
  • Spawn Width and Spawn Height: 发射器的形状的宽,高
  • Size: 粒子的大小
  • Velocity:
  • Angle:
  • Rotation:
    这个几值用于控制粒子的运动轨迹:

  • Wind and Gravity: 烟为生存时间内在X轴和Y轴上每秒种的像素偏移值

  • Tint: 粒子的颜色,可以在粒子生存期内变化任意多个颜色

  • Transparency:粒子的透明度


    推荐

  • 书目
    libGDX游戏开发入门指南
    image

  1. 网址
* [libGDX官网](https://libgdx.badlogicgames.com/index.html)

* [#Testin杯#Mkey libgdx教程](http://www.apkbus.com/android-57355-1-1.html)
    **文章中大量引用了此博文中的翻译内容**

* [奋斗小土豆丶的博客](http://blog.sina.com.cn/s/articlelist_2483934474_1_1.html)
  1. 视频教程 libGDX开发教程-奋斗小土豆

2015-12-15 21:132245