AndEngine游戏编程学习(二) TMX地图
来源:互联网 发布:一个淘宝详情页多少钱 编辑:程序博客网 时间:2024/05/24 06:44
(一) 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);}}
- AndEngine游戏编程学习(二) TMX地图
- AndEngine 中TMX地图编辑器
- AndEngine游戏编程学习(一)
- 游戏引擎Andengine总结(二):AndEngine引擎运行原理
- AndEngine游戏开发系列教程(二)
- andengine编程之sprite(二)
- andengine编程之sprite(二)
- android游戏引擎andengine学习系列二:简单的例子
- AndEngine引擎的学习笔记(二)
- AndEngine之DEMO学习(二)RectangleExample
- AndEngine学习笔记(二)
- [AndEngine] Collision within TMX objects
- (译)TMX地图格式(转载)
- 【Android】基于andengine游戏引擎的简单游戏实现(模拟控制器、tiledmap地图)
- 游戏引擎AndEngine总结(七):用AndEngine简单实现根据二维数组生成地图(Mappy原理)
- Android游戏开发的入门学习(andEngine引擎)
- cocos2d-x学习笔记(15)--地图的使用1(TMX)
- TMX地图格式
- SQL Error (1130): Host '192.168.1.100' is not allowed to connect to this MySQL server
- Ubuntu下网络连接图标丢失后获得方法
- 对动态规划的一些看法
- CodeForces 1B Spreadsheet
- Ubuntu中Lamp的一些配置
- AndEngine游戏编程学习(二) TMX地图
- Ubuntu下Lamp服务器的性能优化
- c++文件操作
- Linux(ubuntu)用户权限管理--赋予用户sudo权限
- Ubuntu输入法的安装
- POJ 1325 Machine Schedule
- mac上apache的rewrite生效
- 通过源码学算法--AdaBoost (CART) -- 楔子
- Ubuntu下安装CoreSeek