LibGdx框架 之 tmx地图文件属性基本操作
Libgdx 相关API介绍
1.com.badlogic.gdx.maps.Map implements Disposable
Map代表了我们用地图编辑器编辑完之后的TMX文件,实际上是其子类TiledMap来具体实现。主要包含1.MapProperties
TMX文件的各种属性。2. MapLayers
,Map layers是有序的并且是可索引的,可通过index来访问, MapLayer包含MapObject
对象,可以通过方法来获取访问,Libgdx中有不同的MapObject可供使用,比如CircleMapObject, RectangleMapObject
。
方法、属性描述
layers : MapLayers 地图中所包含的图层properties :
MapProperties 地图中所包含的对象
getLayers() : MapLayers 获取地图中所包含的图层
getProperties() : MapProperties 获取地图中的对象
2.com.badlogic.gdx.maps.tiled.TiledMap extends Map
TiledMap是Libgdx中真正承载TMX地图的类,代表了tiled map,增加了tiles 和 tiledsets
3.com.badlogic.gdx.maps.tiled.TiledMapTile : interface
代表了TiledMap中每个网格(瓦片),留意其方法就可以了
方法 | 描述 |
---|---|
getId() : int | 瓦片的ID |
getTextureRegion() : TextureRegion | 瓦片使用的TextureRegion |
setTextureRegion(TextureRegion textureRegion) | 设置瓦片的纹理 |
getOffsetX() : float | 瓦片相对于x轴的位置 |
getProperties() : MapProperties | 单个瓦片的属性 |
4.com.badlogic.gdx.maps.tiled.TiledMapTileSet implements Iterable<TiledMapTile
>
TiledMapTile的实例,通常用来组成TiledMapLayer
方法、属性 | 描述 |
---|---|
name : String | 瓦片的name |
tiles : IntMap<TiledMapTile >
|
瓦片 |
getTile (int id) : TiledMapTile | 获取瓦片实例 |
iterator () : Iterator<TiledMapTile >
|
便利所有瓦片 |
removeTile (int id) | 移除指定瓦片 |
size () | 瓦片的数量 |
5.com.badlogic.gdx.maps.tiled.TiledMapTileSets implements Iterable<TiledMapTileSet
>
其实看类名就知道是TiledMapTileSet的集合类,主要是提供工具帮助访问处理TiledMapTileSet。不做过多解释,可看源码。
6.com.badlogic.gdx.maps.MapLayer
MapLayer就是我们在地图编辑器中创建的Layer(普通Layer和ObjectLayer)对应,包含了Layer对应的object和properties
// 下面列出的就是类中常用的属性,方法就是对属性的读写
private String name = ""; // 图层的名字
private float opacity = 1.0f; // 透明度
private boolean visible = true; // 是否可见
private MapObjects objects = new MapObjects(); // 包含的对象
private MapProperties properties = new MapProperties();// 包含的属性
7.com.badlogic.gdx.maps.tiled.TiledMapTileLayer extends MapLayer
TiledMap的Layer,具体的实现类
// Layer的高度和宽度
private int width;
private int height;
// 瓦片的高度和宽度
private float tileWidth;
private float tileHeight;
// 内部类,里面包含了private TiledMapTile tile
private Cell[][] cells;
8.com.badlogic.gdx.maps.MapLayers implements Iterable<MapLayer
>
可被遍历的MapLayer合集,方便访问操作MapLayer,主要是TMX文件也是很多MapLayer的集合。
方法、属性 | 描述 |
---|---|
get (int index) : MapLayer | 根据索引获取MapLayer |
get (String name) : MapLayer | 根据名字返回找到的第一个匹配MapLayer |
getIndex (String name) : int | 根据名字返回查找到的第一个图片的位置 |
getCount () : int | 获取TiledMap中Layer的数量 |
remove (int index) | 移除指定TiledMapLayer |
iterator () : Iterator<MapLayer >
|
迭代访问 |
9.com.badlogic.gdx.maps.MapObject
TiledMap里面包含的对象的基本属性,比如: name, opacity, color
private String name = "";
private float opacity = 1.0f;
private boolean visible = true;
private MapProperties properties = new MapProperties();
private Color color = Color.WHITE.cpy();
10.com.badlogic.gdx.maps.MapObjects implements Iterable<MapObject
>
MapObject的集合,不做过多解释,可自己查询源码。
11.com.badlogic.gdx.maps.MapProperties
可索引的(indexed)string值,代表了Map中元素的属性,可以被递归访问,修改,和添加属性。
方法、属性 | 描述 |
---|---|
get (int index) : MapLayer | 根据索引获取MapLayer |
get (String name) : MapLayer | 根据名字返回找到的第一个匹配MapLayer |
getIndex (String name) : int | 根据名字返回查找到的第一个图片的位置 |
getCount () : int | 获取TiledMap中Layer的数量 |
remove (int index) | 移除指定TiledMapLayer |
iterator () : Iterator<MapLayer >
|
迭代访问 |
12.com.badlogic.gdx.maps.tiled.TmxMapLoader
地图加载去,使用方法简单,可参考后面的源码
13.com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer
渲染地图, 使用方法简单,可参考后面源码
代码用例展示
1.TiledMapSample这个用例只是简单的展示加载和渲染地图,以及操作照相机,来展示地图的不同部分。
public class TiledMapSample extends ApplicationAdapter {private static final float VIRTUAL_WIDTH = 384.0f;private static final float VIRTUAL_HEIGHT = 216.0f; private static final float CAMERA_SPEED = 100.0f;private OrthographicCamera camera;
private Viewport viewport;private TiledMap map;
private TmxMapLoader loader;
private OrthogonalTiledMapRenderer renderer;private Vector2 direction;@Override
public void create() { camera = new OrthographicCamera();viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);loader = new TmxMapLoader();map = loader.load("p/platformer.tmx");renderer = new OrthogonalTiledMapRenderer(map);direction = new Vector2();
}@Override
public void dispose() {map.dispose();renderer.dispose();
}@Override
public void render() {Gdx.gl.glClearColor(0.8f, 0.8f, 0.8f, 1.0f);Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);updateCamera();renderer.setView(camera);renderer.render();
}@Override
public void resize(int width, int height) {viewport.update(width, height);
}private void updateCamera() {direction.set(0.0f, 0.0f);int mouseX = Gdx.input.getX();int mouseY = Gdx.input.getY();int width = Gdx.graphics.getWidth();int height = Gdx.graphics.getHeight();if (Gdx.input.isKeyPressed(Keys.LEFT) || (Gdx.input.isTouched() && mouseX < width * 0.25f)) {direction.x = -1;}else if (Gdx.input.isKeyPressed(Keys.RIGHT) || (Gdx.input.isTouched() && mouseX > width * 0.75f)) {direction.x = 1;}if (Gdx.input.isKeyPressed(Keys.UP) || (Gdx.input.isTouched() && mouseY < height * 0.25f)) {direction.y = 1;}else if (Gdx.input.isKeyPressed(Keys.DOWN) || (Gdx.input.isTouched() && mouseY > height * 0.75f)) {direction.y = -1;}direction.nor().scl(CAMERA_SPEED * Gdx.graphics.getDeltaTime());;camera.position.x += direction.x;camera.position.y += direction.y;TiledMapTileLayer layer = (TiledMapTileLayer)map.getLayers().get(0);float cameraMinX = viewport.getWorldWidth() * 0.5f;float cameraMinY = viewport.getWorldHeight() * 0.5f;float cameraMaxX = layer.getWidth() * layer.getTileWidth() - cameraMinX;float cameraMaxY = layer.getHeight() * layer.getTileHeight() - cameraMinY;camera.position.x = MathUtils.clamp(camera.position.x, cameraMinX, cameraMaxX);camera.position.y= MathUtils.clamp(camera.position.y, cameraMinY, cameraMaxY);camera.update();
}
}
2. TiledMapObjectsSample示例不仅加载渲染地图也解析了里面包含的对象
private static final float CAMERA_SPEED = 100.0f;private OrthographicCamera camera;
private Viewport viewport;
private SpriteBatch batch;private TiledMap map;
private TmxMapLoader loader;
TiledMapTileLayer layer;
private OrthogonalTiledMapRenderer renderer;private Vector2 direction;private Array<Sprite> enemies;
private Array<Sprite> items;
private Array<Sprite> triggers;
private Sprite player;
private TextureAtlas atlas;@Override
public void create() {camera = new OrthographicCamera();viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);batch = new SpriteBatch();loader = new TmxMapLoader();map = loader.load("p/tiled-objects.tmx");renderer = new OrthogonalTiledMapRenderer(map, batch);atlas = new TextureAtlas(Gdx.files.internal("p/sprites.atlas"));direction = new Vector2();processMapMetadata();
}@Override
public void dispose() {map.dispose();renderer.dispose();atlas.dispose();batch.dispose();
}@Override
public void render() {Gdx.gl.glClearColor(0.8f, 0.8f, 0.8f, 1.0f);Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);updateCamera();renderer.setView(camera);renderer.render();batch.begin();for (Sprite enemy : enemies) {enemy.draw(batch);}for (Sprite item : items) {item.draw(batch);}for (Sprite trigger : triggers) {trigger.draw(batch);}player.draw(batch);batch.end();
}@Override
public void resize(int width, int height) {viewport.update(width, height);
}private void updateCamera() {direction.set(0.0f, 0.0f);int mouseX = Gdx.input.getX();int mouseY = Gdx.input.getY();int width = Gdx.graphics.getWidth();int height = Gdx.graphics.getHeight();if (Gdx.input.isKeyPressed(Keys.LEFT) || (Gdx.input.isTouched() && mouseX < width * 0.25f)) {direction.x = -1;} else if (Gdx.input.isKeyPressed(Keys.RIGHT) || (Gdx.input.isTouched() && mouseX > width * 0.75f)) {direction.x = 1;}if (Gdx.input.isKeyPressed(Keys.UP) || (Gdx.input.isTouched() && mouseY < height * 0.25f)) {direction.y = 1;} else if (Gdx.input.isKeyPressed(Keys.DOWN) || (Gdx.input.isTouched() && mouseY > height * 0.75f)) {direction.y = -1;}direction.nor().scl(CAMERA_SPEED).scl(Gdx.graphics.getDeltaTime());;camera.position.x += direction.x;camera.position.y += direction.y;// 获取Map编辑器里面最底层的Layer,同时也是tml文件里面最上面的一层layerfloat cameraMinX = viewport.getWorldWidth() * 0.5f;float cameraMinY = viewport.getWorldHeight() * 0.5f;float cameraMaxX = layer.getWidth() * layer.getTileWidth() - cameraMinX;float cameraMaxY = layer.getHeight() * layer.getTileHeight() - cameraMinY;camera.position.x = MathUtils.clamp(camera.position.x, cameraMinX, cameraMaxX);camera.position.y = MathUtils.clamp(camera.position.y, cameraMinY, cameraMaxY);camera.update();
}private void processMapMetadata() {// Load entitiesSystem.out.println("Searching for game entities...\n");enemies = new Array<Sprite>();items = new Array<Sprite>();triggers = new Array<Sprite>();layer = (TiledMapTileLayer) map.getLayers().get(0);MapObjects objects = map.getLayers().get("objects").getObjects();System.out.println("width=" + layer.getWidth() +" tileWidth" + layer.getTileWidth());for (MapObject object : objects) {String name = object.getName();;String[] parts = name.split("[.]");RectangleMapObject rectangleObject = (RectangleMapObject) object;Rectangle rectangle = rectangleObject.getRectangle();System.out.println("Object found");System.out.println("- name: " + name);System.out.println("- position: (" + rectangle.x + ", " + rectangle.y + ")");System.out.println("- size: (" + rectangle.width + ", " + rectangle.height + ")");if (name.equals("enemy")) {Sprite enemy = new Sprite(atlas.findRegion("enemy"));enemy.setPosition(rectangle.x, rectangle.y);enemies.add(enemy);} else if (name.equals("player")) {player = new Sprite(atlas.findRegion("player"));player.setPosition(rectangle.x, rectangle.y);} else if (parts.length > 1 && parts[0].equals("item")) {Sprite item = new Sprite(atlas.findRegion(parts[1]));item.setPosition(rectangle.x, rectangle.y);items.add(item);} else if (parts.length > 0 && parts[0].equals("trigger")) {Sprite trigger = new Sprite(atlas.findRegion("pixel"));trigger.setColor(1.0f, 1.0f, 1.0f, 0.5f);trigger.setScale(rectangle.width, rectangle.height);trigger.setPosition(rectangle.x - rectangle.width * 0.5f, rectangle.y + rectangle.height * 0.5f);triggers.add(trigger);}}
}
}
本文摘自--> http://blog.csdn.net/zqiang_55/article/details/53304412
LibGdx框架 之 tmx地图文件属性基本操作相关推荐
- libgdx的tmx地图处理工具gdx-tiled-preprocessor.jar(TiledMapPacker)修正版
最近想做个Android的游戏,用到libgdx,现在研究地图这块,制作好地图tmx文件后需要处理后libgdx才能载入,需要用到TiledMapPacker工具,该工具被放在gdx-tiled-pr ...
- 祛除tmx地图在滚动时可能出现的黑边
Director::getInstance()->setProjection(Director::Projection::_2D); 祛除tmx地图在滚动时可能出现的黑边,可以通过以上代码添加到 ...
- (译)TMX地图格式
http://www.cnblogs.com/FireStudio/archive/2012/06/04/2534251.html 原文地址:https://github.com/bjorn/tile ...
- LGame性能改进,并增加TMX地图支持(0 2 96版)
下载地址(内含源码.示例.jar):http://loon-simple.googlecode.com/files/LGame-Android-0.2.96.7z 本次更新主要针对LGame与Andr ...
- cocos2d-x 使用tmx地图总结
首先我们需要知道,tmx地图的坐标为格子坐标,左上角为原点(0,0),而cocos里面一般使用opengl坐标系,即左下角为原点(0,0). 我们可以这样子来转换tmx地图和opengl的坐标: Po ...
- geoserver配合openlayers框架加载地图
geoserver地图服务器如果搭建成功,那么会有很多图层示例.这些图层可以用作练手示例.在实际工作中,可能需要我们自己设计地图,自己发布,然后使用. 这里以上一篇最后发布的中国地图为例,采用open ...
- 【ArcObject开发】实验:ArcObject地图开发基本操作
ArcObjects,是基于Microsoft COM技术所构建的一系列COM组件集,是在ArcGIS Desktop平台基础上的二次开发,开发语言为VBA(Vistal Basic for Appl ...
- SSM框架中实现地图查询及ECharts直方图功能
最近一个项目[SSM框架搭建后台]中需要在地图中显示检测点以及以直方图的形式展示mysql数据库中的数据. 下面是一个简单Demo. 效果如下: 后面会将代码整理放在github. jsp文件如下 ...
- 使用H-lua框架制作魔兽争霸地图(1-准备阶段)
一.下载框架 git clone https://github.com/hunzsig-warcraft3/h-lua-sdk 二.创建项目 打开终端,在sdk.exe的目录下,输入 ./sdk.ex ...
最新文章
- 微信小程序填坑之路(三):布局适配方案(rpx、px、vw、vh)
- OpenCV与FLANN的功能匹配
- 关于储存设备知识介绍汇总
- Asp.NetCore-部署到IIS
- 【渝粤教育】国家开放大学2018年春季 3818-22T燃气工程施工 参考试题
- 单向循环链表C语言实现
- MySQL在Windows和Linux减少数据库
- github上markdown文件编写笔记
- 软件需求规格说明书 模板
- Windowsmobile 的第一篇 为什么选择windows mobile 的分析
- android es2 es3,详细内幕剖析九号滑板车es2和es3有什么区别?哪个好?口碑真实揭秘...
- [科普文] 搞 Web3 要学习哪些基础知识?
- js点击使内容变成可编辑状态
- 与电容有关的几个经典电路--微分、积分、采样与电荷泵
- 亚马逊开店店铺选品技巧分析
- 计算机博弈大赛php,全国计算机博弈大赛
- 【大数据开发运维解决方案】Oracle Sql基础查询
- Effie指南|给实习记者,高效记者们常用的文字编辑类软件
- silabs系列51单片机使用printf函数
- Direct Test Mode
热门文章
- 亚马逊FBA货件标签要求及标签模板
- Android解决HAXM安装的问题
- fabric+cpabe加密的医疗数据共享代码(分级加密、多授权中心)
- valet-windows
- 个人所得税 java_java_计算个人所得税
- 小学生利用计算机资源简报,享高雅艺术,绘金色童年小学生电子小报成品,简报报刊手抄报模板,画报剪报板报样板,电脑报纸示范样例...
- 射频常用单位 dB dBm dBW/ dBi dBd dBic
- [ACNOI2022]学数学不如学构造
- 查询至少有一门课与学号为“01“的同学所学相同的同学的信息
- 如何搞定恒流电源电路设计?看懂六个提示!