LevelLoaderExample
学习笔记有点乱,看到哪就记到哪。
今天看的是AndEngineExample中的LevelLoaderExample,当然前面也看了很多个Example,对整个框架的结构还是比较了解,
一般新建一个游戏类,都要去继承BaseGameActivity,然后实现里面的四个方法,分别为:onLoadEngine(),onLoadResources(),onLoadScene(),onLoadComplete();
onLoadEngine()即加载引擎,一般在里面初始化Engine;
onLoadResources()即加载游戏资源,包括游戏精灵用到的纹理了;
onLoadScene()即加载游戏场景,场景在学习OpenGL时,很常用,这个概念不难理解,就和电影中的场景差不多;
onLoadComplete()即加载游戏完成之后所要执行的内容。
今天看的是LeveLoaderExample,所以就要对立面我不懂的,或者认为应该记录的,总结一下:
1、关于Example中的level文件夹下面的example.lvl文件的理解,首先,它就属于游戏开发过程中的地图,我几乎没有开发过游戏,所以不太懂,就是为了贴图用的,和数组贴图差不多,至于它是用什么工具生成的,暂时还不了解。它的格式应该属于固定的
<level>
<entity x="208" y="32" width="16" height="16" type="box"/>
</level>
当然,他有固定的XML格式,那就有固定的解析方式,它的解析方式如下:
final LevelLoader levelLoader = new LevelLoader();此段代码用来初始化即将使用的LevelLoader类,类里面有个重要的方法,应该说是在LevelLoaderExample中的方法,我也不知道它重不重要。呵呵……分别是a、
levelLoader.registerEntityLoader(LevelConstants.TAG_LEVEL, new IEntityLoader() {
@Override
public void onLoadEntity(final String pEntityName, final Attributes pAttributes) {
final int width = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_LEVEL_ATTRIBUTE_WIDTH);
final int height = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_LEVEL_ATTRIBUTE_HEIGHT);
Toast.makeText(LevelLoaderExample.this, "Loaded level with width=" + width + " and height=" + height + ".", Toast.LENGTH_LONG).show();
}
});
b、
levelLoader.registerEntityLoader(TAG_ENTITY, new IEntityLoader() {
@Override
public void onLoadEntity(final String pEntityName, final Attributes pAttributes) {
final int x = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_X);
final int y = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_Y);
final int width = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_WIDTH);
final int height = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_HEIGHT);
final String type = SAXUtils.getAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_TYPE);
LevelLoaderExample.this.addFace(scene, x, y, width, height, type);
}
});
两个方法的参数不一样,第一个是加载父标签<level>的属性,本代码中并没有后续的执行过程,第二个是加载<entity>的标签中的属性,当然,该方法后面有后续行为,就是
LevelLoaderExample.this.addFace(scene, x, y, width, height, type);将解析出来的每个Entity(每个实体、节点)加载到Scene场景中去。
addFace这个方法是作者自定义的方法,里面主要是加载不同类型(刚才解析出来的Type)的精灵,这些精灵是之前已经声明好的,精灵类的声明,要注意TiledTextureRegion
的构造,
this.mCircleFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "face_circle_tiled.png", 0, 32, 2, 1); // 64x32
参数中的0,32对应的是TextRegion中的位置,而不是整个屏幕的位置。
当然,它和一般XML文件解析框架差不多,具体点,我觉得应该是Dom解析。
执行顺序大概是这样子的:
levelLoader.loadLevelFromAsset(this, "example.lvl");-->a-->b
遗留的问题:关于Texture的定义参数中,非要是2的幂,这一点不太懂,估计要看源码才能懂。
简单的笔记做完了,仅供自己查阅补漏。