Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 750|回复: 0

Android游戏框架 Libgdx 使用入门(一) - Android学习

[复制链接]

该用户从未签到

发表于 2011-10-27 08:14:42 | 显示全部楼层 |阅读模式
       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的具体实现,开始讲解如何正确使用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类将基本图元制成更加复杂的高级图元展示出来。

       具体可见Libgdx作者提供的returntomarchfeld示例,基本效果如下图所示:

  PS:如果对此类认识不足,可以去玩玩模拟人生,下个修改器尝试编辑角色或物品造型后就懂了……

  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代码:

// Libgdx的Texture与Sprite使用
public class Main extends AndroidApplication {
class TestSprite implements ApplicationListener {
// 准备绘图用SpriteBatch
SpriteBatch spriteBatch;
// 准备游戏精灵
Sprite sprite;
// 准备图片加载用Texture
Texture texture;
public void create() {
// 构建SpriteBatch
spriteBatch = new SpriteBatch();
// 构建Texture,图像宽与高大小都必须为2的整数次幂,否则提示异常
// PS:在Android环境使用Libgdx的internal加载时必须文件必须位于assets目录下
texture = new Texture(Gdx.files.internal( "mySprite.png" ));
// 以指定Texture构建Sprite
sprite = new Sprite(texture);

系列之Android游戏框架 Libgdx 使用入门(二)的帖子链接http://www.eoeandroid.com/thread-101155-1-1.html
系列之Android游戏框架 Libgdx 使用入门(三)的帖子链接http://www.eoeandroid.com/thread-103317-1-1.html
系列之Android游戏框架 Libgdx 使用入门(四)的帖子链接http://www.eoeandroid.com/thread-103319-1-1.html
系列之Android游戏框架 Libgdx 使用入门(五)的帖子链接http://www.eoeandroid.com/thread-103323-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 21:06 , Processed in 0.360062 second(s), 50 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表