libgdx:[33]组织资源

2024-10-31 09:19:18

关于我们要用到的资源的组织 ,一些内部类的创建和使用.

工具/原料

libgdx

eclipse

Organizing assets 组织资源

1、我们现在将要创建我们自己的Assets 类来组织和结构化我们的资源。首先在Constants 类里添加一个常量让他指向我们的texture 图集的描述性文件。

libgdx:[33]组织资源

2、Next, create a new fie for the Assets class and add the following code:下一步为Assets 类 创建一个新的文件并添加下面的代码:。。。 。。。代码参看learning libgdx game development

3、前面的代码量实在是很大,我们把它拆分开来讲解。 第一这个设计模式使用的是singleton.模式简单但是能确保只有一个类的实例存在,Singleton通过定义一个静态的构造器来阻止其他的类来实例化它,实例变量掌握这一个真实的类的实例,用publicstaticfinal修饰符来修饰只读资源,只有一个可以访问这个类的资源的方法。使我们能够在游戏代码的任何地方访问资源而不用在用到它的地方创建一个引用

4、Init()方法会在程序启动的时候被调用。它将初始化资源管理器,用来加载所有的资源。调用管理器的load()方法可以很简单的完成加载工作。有两个参数, 第一个是路径和文件名, 相应类的实例作为第二个参数。加载进程通过调用finishingLoading()开始。这是一个代码块方法,它将等到所有的资源都被加载完才结束。在那之后我们通常会打印出加载资源的数目和他们的名字来确定他们是否按我们的意愿正常的工作。

5、Assets类实现了Disposable和AssetEttorListener接口。因此我们可以在资源不再需要的时候调用manager的dispose方法卸载不需要的资源。但是在管理器调用实现的接口之前需要调用管理器的setErrorListener()method.方法来实现接口。我们现在只使用error()方法向控制台输出error 日志。你可以在这里添加一些额外的代码来处理这些错误以免程序在有错误的情况下 崩溃调.

6、下一步取出子图,通常通过调用一个findRegion()的方法来实现,用资源名作为参数。这个方法返回一个AtlasRegion类的对象包括一些子图的found和一些额外的关于它是怎么存储在图集中的信息。现在,例如我们想找到一个存储在assets/my_image.png的子图我们需要些下面的代码:Atlas.findRetion(“my_image”);

7、 注意:前缀assets/经常被省略就像其他的一些文件一样,比如 .png.但是子文件必须被指定。如果查找失败方法将返回一个null。因此一定检查好你文件名的拼写是否正确。另外一个非常重要的事实是查找子图的功能调用是一个非常昂贵的开销。因此,在起初查找到后存储结果是非常好的做法,从而避免很多性能问题。把下面的代码添加到Assets中来导入AtlasRegion 类importcom.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;

8、下面是一步一步的实现一些Assets 类的小的内部类。这些类允许我们以代码单位结构化处理我们的子图片,并永久的存储那些我们用来查找他们的引用。

9、我们将要从玩家人物开始,我们将他命名为AssetBunny类。他包括一个成员属性叫做head 它是bunny_head.png 图片的引用。查找工作将会在内部类的构造器中完成,构造器持有一个对应的atlas的引用,在这里他将找到他需要的图片.

libgdx:[33]组织资源

10、Assets 类中添加如下代码:public class AssetBunny {public final AtlasRegion head;public AssetBunny (TextureAtlas atlas) {head = atlas.findRegion("bunny_head");}}

11、下一步是 rock 岩石 对象,代表游戏的平台。它由两个文件组成 石头的边缘,和石头的中间部分,分别由两个图片提供:rock_edge.png和rock_middle.png.AssetRock.内部类中这两个图片都有自己的引用。

libgdx:[33]组织资源

12、Assets类中添加如下代码:public class AssetRock {public final AtlasRegion edge;public final AtlasRegion middle;public AssetRock (TextureAtlas atlas) {edge = atlas.findRegion("rock_edge");middle = atlas.findRegion("rock_middle");}}

13、下面是金币:gold coin. 文件名为: item_gold_coin.png内部类的名字是AssetGoldCoinAss髫潋啜缅ets类中添加如下代码:public class AssetGoldCoin {public final AtlasRegion goldCoin;public AssetGoldCoin (TextureAtlas atlas) {goldCoin = atlas.findRegion("item_gold_coin");}}

libgdx:[33]组织资源

14、Next is the feather item. Its original fiename is item_feather.png 锾攒揉敫and the innerclass is named AssetFeather.再 就是羽毛物品。文件名为item_feather.png内部类名:AssetFeather.Assets类添加如下代码:public class AssetFeather {public final AtlasRegion feather;public AssetFeather (TextureAtlas atlas) {feather = atlas.findRegion("item_feather");}}

libgdx:[33]组织资源

15、云彩由 (cloud01.png,cloud02.png, 和 cloud03.png),三个组成 一个很宽的山是由 两个部分组成(mountain_left.pngandmountain_right.png), 还有水,它延伸到游戏世界的每个地方,存在与整个游戏世界中,并覆盖在最上面。最后是一个叫做AssetLevelDecoration的内部类,它包括所有的装饰性图片,云朵山还有水,添加他们仅仅让我们看到并感受关卡信息。

16、水的图片在程序中被缩小到只有一个像素的宽度,因为图片在程序中的X轴上是重复的没有什么区别,我们可以在代码中在X轴方向上无限延伸它,对性能有没有什么影响。但是在印刷的书籍上为了让你看的更清楚我们使用了一个较宽的图片。

17、Assets 类中添加如下代码:pu水瑞侮瑜blic class AssetLevelDecoration {public final AtlasRegion cloud01;public final AtlasRegion cloud02;public final AtlasRegion cloud03;public final AtlasRegion mountainLeft;public final AtlasRegion mountainRight;public final AtlasRegion waterOverlay;public AssetLevelDecoration (TextureAtlas atlas) {cloud01 = atlas.findRegion("cloud01");cloud02 = atlas.findRegion("cloud02");cloud03 = atlas.findRegion("cloud03");mountainLeft = atlas.findRegion("mountain_left");mountainRight = atlas.findRegion("mountain_right");waterOverlay = atlas.findRegion("water_overlay");}}

18、迄今为止,我们已经创建了一个方法来从代码单元管理我们的资源,并在初始化查找他们时存储他们的引用。现在还没做的就是使用我们的新类的代码:同一个类中添加如下代码:。。。 。。。

19、现在Assets类有了每个子类的实例引用,在init()方法中我们首先通过条用管理器的get()方法得到alts。我们重复使用atlas并设置filter为TextureFilter.Linear来消render时的锯齿,我们传递两次这个参数是因为有两种情况,一个是缩小一个是放大,texture在绘制的时候可能被 放大或缩小,默认两中情况都是TextureFilter.Nearest的。

20、截屏为两种情况的对照图最终我们将创建的内部类的引用传递给texture 图集。

libgdx:[33]组织资源
猜你喜欢