by AlexQ (email alexq_andr@163.com)
导语
- What's libGDX
- Standing on the Shoulders of Giants
- 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
执行步骤:
-
下载gdx-setup.jar
-
启动gdx-setup.jar
-
Android需要配置SDK,执行“Generate”
-
AndroidStudio Open 文件夹
-
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中有加载图片的事例:
```
new Texture("badlogic.jpg");
```
2. SpriteBatch 类
* 定义:SpriteBatch用于绘制二维矩形参考纹理(区域)。SpriteBatch类可用于批量绘图命令和优化处理的GPU。
* 功能:SpriteBatch可以把许多相同纹理一起描述并一起送入GPU,同时赋予纹理和坐标以便每个图形的绘制。-------------SpriteBatch可以理解为画笔。
* helloworld中有加载图片的事例:
```
SpriteBatch batch;
...
public void render () {
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
```
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游戏开发入门指南
-
网址
#Testin杯#Mkey libgdx教程
文章中大量引用了此博文中的翻译内容
视频教程
libGDX开发教程-奋斗小土豆