AndEngine游戏编程学习(二) TMX地图

来源:互联网 发布:一个淘宝详情页多少钱 编辑:程序博客网 时间:2024/05/24 06:44

这次来学习下AndEninge里TMX地图的用法。以为很简单,结果还是折腾了我好久 好久 怨念啊。

(一) Tiled的使用

免费的TMX制作工具有不少,找了半天和看了不少人的推荐 ,选择了Tiled  下载地址 :www.mapeditor.org

下载安装后就可以使用了,我看了下 示例里面需要两个文件 一个tmx文件 ,还有个 tsx文件 。tmx文件里保存的是地图数据,地图矩阵就在里面,但打开显示的是乱码。

tsx文件里保存的是图元的一些信息文件,两个文件也可以合成一个tmx文件。这两个文件要分别导出,tsx文件由右下角图快模块 导出。

(二)Tiled画图示例

代码非常非常简单,就是显示张地图,关键是前面tmx和tsx两文件配置花了我不少时间。显示一层图像根据实例做出来了,要注意把地图属性改为 base64  zlib 或glib。

但一般游戏地图不会只有一层,都会有好几层,比如背景层,实体层。我就开始尝试下显示多层的图片。先用Tiled画了张图,分为两层。如图 

实体层:

背景层:

以为可以和单层的地图一样的,结果出错了。空指针错误 出错位置

AndEngine(5846): at org.andengine.extension.tmx.TMXLayer.addTileByGlobalTileID(TMXLayer.java:274)

看了半天源码没找出原因,只好求助google,发现出这问题的不少,要改源码 ,解决办法如下:

https://github.com/winniehell/AndEngineTMXTiledMapExtension/commit/

3d481f7d8d3903bc2b0d8a2a295e4e2c610a7544;尝试着改了下。运行时通过了,原因还不甚了了,希望懂了的可以不吝赐教,我也在慢慢看。

结合图:

(三) 写了结合了camera的移动和虚拟方向盘控制精灵移动的小例子,自娱自乐。

效果图

源码如下:

package com.example.tmxgame1;import org.andengine.engine.camera.BoundCamera;import org.andengine.engine.camera.hud.controls.AnalogOnScreenControl;import org.andengine.engine.camera.hud.controls.BaseOnScreenControl;import org.andengine.engine.camera.hud.controls.AnalogOnScreenControl.IAnalogOnScreenControlListener;import org.andengine.engine.handler.IUpdateHandler;import org.andengine.engine.handler.physics.PhysicsHandler;import org.andengine.engine.options.EngineOptions;import org.andengine.engine.options.ScreenOrientation;import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;import org.andengine.entity.scene.Scene;import org.andengine.entity.sprite.AnimatedSprite;import org.andengine.extension.tmx.TMXLoader;import org.andengine.extension.tmx.TMXTiledMap;import org.andengine.extension.tmx.util.exception.TMXLoadException;import org.andengine.opengl.texture.TextureOptions;import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;import org.andengine.opengl.texture.region.ITextureRegion;import org.andengine.opengl.texture.region.TiledTextureRegion;import org.andengine.ui.activity.SimpleBaseGameActivity;import android.opengl.GLES20;public class MainActivity extends SimpleBaseGameActivity {private static final int CAMERA_WIDTH = 800;private static final int CAMERA_HEIGHT = 480;private TMXTiledMap tiledMap;private BitmapTextureAtlas playerTextureAtlas;private TiledTextureRegion playerRegion;Scene scene;AnimatedSprite player;// 枚举方向private Direction direction = Direction.unmove;private BoundCamera mCamera;private BitmapTextureAtlas mOnScreenControlTexture;private ITextureRegion mOnScreenControlBaseTextureRegion;private ITextureRegion mOnScreenControlKnobTextureRegion;private PhysicsHandler physicsHandler;@Overridepublic EngineOptions onCreateEngineOptions() {mCamera = new BoundCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED,new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);}@Overrideprotected void onCreateResources() {playerTextureAtlas = new BitmapTextureAtlas(this.mEngine.getTextureManager(), 128, 256);playerRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(playerTextureAtlas, this.getAssets(),"player.png", 0, 0, 3, 4);playerTextureAtlas.load();this.mOnScreenControlTexture = new BitmapTextureAtlas(this.getTextureManager(), 256, 128, TextureOptions.BILINEAR);this.mOnScreenControlBaseTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mOnScreenControlTexture, this,"onscreen_control_base.png", 0, 0);this.mOnScreenControlKnobTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mOnScreenControlTexture, this,"onscreen_control_knob.png", 128, 0);this.mOnScreenControlTexture.load();}@Overrideprotected Scene onCreateScene() {scene = new Scene();loadTMXMap();loadPlayer();loadControl();return scene;}private void loadControl() {// AndEngine中的控制方向的窗口final AnalogOnScreenControl analogOnScreenControl = new AnalogOnScreenControl(40, CAMERA_HEIGHT- this.mOnScreenControlBaseTextureRegion.getHeight()- 30, this.mCamera,this.mOnScreenControlBaseTextureRegion,this.mOnScreenControlKnobTextureRegion, 0.1f, 200,this.getVertexBufferObjectManager(),new IAnalogOnScreenControlListener() {@Overridepublic void onControlChange(final BaseOnScreenControl pBaseOnScreenControl,final float pValueX, final float pValueY) {if (physicsHandler != null) {physicsHandler.setVelocity(pValueX * 100,pValueY * 100);}// 简单判断下方向if (pValueX > 0.5f) {direction = Direction.right;} else if (pValueX < -0.5f) {direction = Direction.left;} else if (pValueY > 0.5f) {direction = Direction.down;} else if (pValueY < -0.5f) {direction = Direction.up;} else {direction = Direction.unmove;}}@Overridepublic void onControlClick(final AnalogOnScreenControl pAnalogOnScreenControl) {}});analogOnScreenControl.getControlBase().setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);analogOnScreenControl.getControlBase().setAlpha(0.5f);analogOnScreenControl.getControlBase().setScaleCenter(0, 128);analogOnScreenControl.getControlBase().setScale(1.25f);analogOnScreenControl.getControlKnob().setScale(1.25f);analogOnScreenControl.refreshControlKnobPosition();scene.setChildScene(analogOnScreenControl);}private void loadPlayer() {float centerX = (CAMERA_WIDTH - playerRegion.getTextureX()) / 2;float centerY = (CAMERA_HEIGHT - playerRegion.getTextureY()) / 2;player = new AnimatedSprite(centerX, centerY, playerRegion,this.getVertexBufferObjectManager());this.mCamera.setChaseEntity(player);physicsHandler = new PhysicsHandler(player);scene.registerUpdateHandler(physicsHandler);scene.attachChild(player);scene.registerUpdateHandler(new IUpdateHandler() {@Overridepublic void reset() {}@Overridepublic void onUpdate(float pSecondsElapsed) {switch (direction) {case right:player.animate(new long[] { 200, 200, 200 }, 3, 5, true);break;case left:player.animate(new long[] { 200, 200, 200 }, 9, 11, true);break;case up:player.animate(new long[] { 200, 200, 200 }, 0, 2, true);break;case down:player.animate(new long[] { 200, 200, 200 }, 6, 8, true);break;default:player.stopAnimation();break;}}});}private void loadTMXMap() {TMXLoader loader = new TMXLoader(this.getAssets(),this.mEngine.getTextureManager(),this.getVertexBufferObjectManager());try {tiledMap = loader.loadFromAsset("map.tmx");} catch (TMXLoadException e) {e.printStackTrace();}scene.attachChild(tiledMap.getTMXLayers().get(0));scene.attachChild(tiledMap.getTMXLayers().get(1));this.mCamera.setBounds(0, 0, tiledMap.getTMXLayers().get(0).getWidth(),tiledMap.getTMXLayers().get(0).getHeight());this.mCamera.setBoundsEnabled(true);}}




原创粉丝点击