Android应用libGDX引擎系列(二)-libGDX 入门精要

by AlexQ (email alexq_andr@163.com

image
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中有加载图片的事例:

    ```
        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:粒子的透明度

推荐

  1. 书目
    libGDX游戏开发入门指南


    image
  2. 网址

  3. 视频教程
    libGDX开发教程-奋斗小土豆


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容