多语言展示
当前在线:1466今日阅读:26今日分享:39

libgdx:[20]示例程序的代码

这一部分详细的介绍示例程序的代码部分
工具/原料

libgdx

The demo application – time for code 示例程序-代码时间

这一部分我们将更加仔细的查看demo项目的真实的代码。然后我们将对代码进行一些简单的改进,并将用到调试器。

Inspecting an example code of the demo application 检测demo程序的示例代码
1

让我们看一下demo项目的 MyDemo.java代码.下面的代码列表展示了类的定义public class MyDemo implements ApplicationListener {// ...}

2

正如你所看到的 MyDemo 类实现了ApplicationListener 接口.在我们继续实现更多的接口细节前,我们需要花一些时间在这个类的其余部分上.You will find a defiition of four member variables, each with a class provided by Libgdx.你将会发现四个 成员属性,每个属性都是一个Libgdx提供的类.private OrthographicCamera camera;private SpriteBatch batch;private Texture texture;private Sprite sprite;

3

这里给你提供一个前面代码中的类的简单介绍  给你后面马上要接触到的代码打下一个基础的知识背景。camera变量是orthographiccamera类型的类。我们将使用正交相机展示我们的2D场景。相机是在游戏中有一定的宽度和高度的游戏场景的玩家的视角。也被叫做viwePort到下面的网址查阅相关的详细文章,(Orthographic vs. Perspective)/iphonedevelopment.blogspot.de/2009/04/opengl-es-from-ground-up-part-3.html.Batch 类是sprite batch类的实例,这个就是 你把你的所有的绘图命令发送给libgdx的途径,用这个类的功能是绘制图片 往往在很多情况下表现出非常优越的性能。 texture 变量是Texture类型类的实例. 它是一个实际图片的引用 texture数据在运行时存储在 内存中。

4

sprite 变量是Sprite类型类的实例. 它是 合成的数据类型 它包括很多 特性来表现2d空间的一个有确切坐标位置的绘制实体, 宽度和高度。 它通常能够被选装或者被 scaled(有鳞状斑点 羽化). 实际上他包含一个Texture Region类的引用,Texture Region类是一个用来截取一个texture的某一部分的一种常用方式。现在我们对所涉及的数据类型有了一个基本的认识, 我们可以提前了解一下ApplicationListener 接口的详细信息。在MyDemo类中的代码唯一包含的方法是create(), render(),  and dispose().剩下的方法体都是空的 ,这样很好。

The create() method - create()方法
1

create() 方法这个方法包含为启动应用程序而准备的 初始化代码

2

首先,图形模块,查询返回显示屏幕的宽度和高度,(例如,一个桌面窗口或Android手机屏幕)为相机视图,算出一个适当的宽度和高度。然后一个spritebatch 的实例被创建出来,一便在相机中使图片能够被渲染出来,并能被用户看到。下一步是通过使用 文件模块 得到 一个载入纹理文件 处理数据/ libgdx.png。加载的图片如下截图所示:

3

就像我们所看到的这个图片中有很多空白的部分,为了能够只显示图片中有用的部分,去掉那些空白的部分,一个 texture region 的实例被创建出来了。这个region 引用前面的那个texture 的全部信息,它按照像素信息从(0,0)点到(512,275)裁剪出一个区域。这两个点描绘出一个长方形,这个长方形从图片的左上角开始,宽度和高度分别是512和275 像素。最后呢 sprite 利用前面创建好的 texture region的信息,被创建出来。Sprite的 大小被设置成原来实际大小的90%Sprite 的起点被设置成 图片大小的一半 ,从而将起点设置到图片的中心。最终,位置设置为精灵的宽度和高度 负半 使精灵移动到场景的中心。 Libgdx用的是左下角作为原点的坐标系,这就意味着X轴指向右边  Y轴指向上。

The render() method - render() 方法
1

这个方法包含在屏幕上创建场景的代码。@Overridepublic void render() {Gdx.gl.glClearColor(1, 1, 1, 1);Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT)batch.setProjectionMatrix(camera.combined);batch.begin();sprite.draw(batch);batch.end();}

2

开始的两行代码调用 open gl 的比较简单的方法来设置一个简单的实心的颜色块做为屏幕的背景,同时执行清屏命令。下一步是 把sprite batch 的投影矩阵和相机的 矩阵 组合到一起,现在你并不需要理解其中的具体含义。它只是意味着下面的所有的绘图命令都要遵循正投影规则。或者简单的说就是在给定的camera的坐标和 区域内的2D空间内绘制图形。Begin 方法和 end 方法必须要成对出现 并且不能嵌套使用 ,否则就会出现错误。The actual drawing of the sprite is accomplishedby calling the draw()  method of the sprite to draw and pass the instance of thesprite batch.实际的对sprite的绘制是通过调用sprite的draw()方法并将sprite batch 的实例传递给draw()方法来完成的。

The dispose() method -dispose()方法
1

这是地方,你应该清理和释放所有仍在使用的应用程序的资源:@Overridepublic void dispose() {batch.dispose();texture.dispose();}

2

这里有一个叫做 disposable 的接口被每一个libgdx 的类继承,它用来分配资源并通过条用简单的 dispose()方法分配资源。在前面的代码中这个被用来清空sprite batch 和texture的资源。下面是demo 项目中的MyDemo.java 的源代码文件:

3

package com.packtpub.libgdx.demo;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.graphics.GL10;import com.badlogic.gdx.graphics.OrthographicCamera;import com.badlogic.gdx.graphics.Textureimport com.badlogic.gdx.graphics.Texture.TextureFilter;import com.badlogic.gdx.graphics.g2d.Sprite;import com.badlogic.gdx.graphics.g2d.SpriteBatch;import com.badlogic.gdx.graphics.g2d.TextureRegion;public class MyDemo implements ApplicationListener {private OrthographicCamera camera;private SpriteBatch batch;private Texture texture;private Sprite sprite;@Overridepublic void create() {float w = Gdx.graphics.getWidth();float h = Gdx.graphics.getHeight();camera = new OrthographicCamera(1, h / w);batch = new SpriteBatch();texture = new Texture(Gdx.files.internal("data/libgdx.png"));texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);TextureRegion region =new TextureRegion(texture, 0, 0, 512, 275);sprite = new Sprite(region);sprite.setSize(0.9f,0.9f * sprite.getHeight() / sprite.getWidth());sprite.setOrigin(sprite.getWidth() / 2,sprite.getHeight() / 2);sprite.setPosition(-sprite.getWidth() / 2,-sprite.getHeight() / 2);}@Overridepublic void dispose() {batch.dispose();texture.dispose();}@Overridepublic void render() {Gdx.gl.glClearColor(1, 1, 1, 1);Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);batch.setProjectionMatrix(camera.combined);batch.begin();sprite.draw(batch);batch.end();}@Overridepublic void resize(int width, int height) {}@Overridepublic void pause() {}@Overridepublic void resume() {}}

推荐信息