libgdx学习记录16——资源加载器AssetManager
AssetManager用于对游戏中的资源进行加载。当游戏中资源(图片、背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题。
主要优点:
1. 大多数资源加载器AssetLoader都是异步加载,可以避免阻塞渲染线程。
2. 通过引用计数来进行释放资源。
3. 通过一个对象来管理所有其他资源。
主要函数:
load(path,type)加载某个路径的资源文件,后面type指定所要加载的资源类型。这个函数只是将资源文件加入到资源队列中,并不会开始加载。
update()更新资源文件,正式加载。
getProgress()返回加载的进度。这个进度并不是平滑的,而是指已加载的资源个数与所要加载的资源总数之比。例如加载3个资源,则只可能为0,0.33,0.66,1这几个值。
finishedUpdate()强制进行同步加载。
利用AssetManager可以很好的做成loading界面,作为游戏启动前的画面。
具体代码:
1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.assets.AssetManager; 6 import com.badlogic.gdx.audio.Music; 7 import com.badlogic.gdx.graphics.Color; 8 import com.badlogic.gdx.graphics.GL10; 9 import com.badlogic.gdx.graphics.Texture; 10 import com.badlogic.gdx.graphics.g2d.BitmapFont; 11 import com.badlogic.gdx.graphics.g2d.BitmapFont.TextBounds; 12 import com.badlogic.gdx.graphics.g2d.SpriteBatch; 13 import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 14 import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 15 16 public class Lib016_AssetManager extends ApplicationAdapter{ 17 18 AssetManager manager; 19 SpriteBatch batch; 20 BitmapFont font; 21 Texture texture; 22 Music music; 23 24 ShapeRenderer rend; 25 boolean isPlay = false; 26 27 @Override 28 public void create() { 29 // TODO Auto-generated method stub 30 super.create(); 31 32 manager = new AssetManager(); 33 batch = new SpriteBatch(); 34 rend = new ShapeRenderer(); 35 36 manager.load( "data/pal4_2.jpg", Texture.class ); 37 manager.load( "audio/xjwq.mp3", Music.class ); 38 manager.load( "font/default.fnt", BitmapFont.class ); 39 } 40 41 @Override 42 public void render() { 43 // TODO Auto-generated method stub 44 super.render(); 45 Gdx.gl.glClearColor( 0, 1, 1, 1 ); 46 Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT ); 47 48 if( !manager.update() ){ 49 rend.setColor( Color.BLUE ); 50 rend.begin( ShapeType.Line ); 51 rend.rect( Gdx.graphics.getWidth()/4-1, (Gdx.graphics.getHeight()-20)/2-1, Gdx.graphics.getWidth()/2+2, 20+2 ); 52 rend.end(); 53 54 rend.setColor( Color.GREEN ); 55 rend.begin( ShapeType.Filled ); 56 rend.rect( Gdx.graphics.getWidth()/4, (Gdx.graphics.getHeight()-20)/2, Gdx.graphics.getWidth()/2*manager.getProgress(), 20 ); 57 rend.end(); 58 } 59 else{ 60 texture = manager.get( "data/pal4_2.jpg", Texture.class ); 61 music = manager.get( "audio/xjwq.mp3", Music.class ); 62 font = manager.get( "font/default.fnt", BitmapFont.class ); 63 64 batch.begin(); 65 batch.draw( texture, Gdx.graphics.getWidth()/2-texture.getWidth()/2, 10 ); 66 TextBounds bounds = font.getBounds( "AssetManager Test" ); 67 font.draw( batch, "AssetManager Test", Gdx.graphics.getWidth()/2-bounds.width/2 ,10+texture.getHeight()+bounds.height+5 ); 68 batch.end(); 69 70 if( !isPlay ){ 71 music.setVolume( 0.8f ); 72 music.setLooping( true ); 73 music.play(); 74 isPlay = true; 75 } 76 77 } 78 } 79 80 @Override 81 public void dispose() { 82 // TODO Auto-generated method stub 83 manager.dispose(); 84 rend.dispose(); 85 batch.dispose(); 86 super.dispose(); 87 } 88 89 }
运行结果:
加载时的画面:
加载完成后的画面:
AssetManager在libgdx中应用很广,是一个很好的资源管理工具。