12.TiledMap使用详解(一)

标签:
android开发 |
分类: libGDX开发教程 |
本文使用的libgdx是0.98版本,可能和最新版有一些不同地方。全文内容仅供参考。
for (TiledObjectGroup group : map.objectGroups) {
}
for (TiledObject object : group.objects)
{
}
name:图层名字。
上一次我们是简单的学习了一下如何创建地图,地图和绘制出地图。但是并没有介绍libgdx中是如何对TiledMap
进行封装的,今天我们就来详细的学习一下,libgdx中TiledMap的详细使用方法。
Libgdx游戏引擎(1群):187378034
Libgdx游戏引擎(2群):148848483
Libgdx游戏引擎(3群):
79168470
1. TiledObjectGroup 类
API定义:包含了TiledMap中的对象层。
成员变量:height、width、name、objets、properties。
height:对象层图块的高度。
width:对象层的图块宽度。
name:对象层图块的名字。
objects: 对象层的图块(即对象)。
properties:对象层的属性。
使用方法:一般都是通过遍历的方式取出坐标或者属性,加上一定的判断条件使用。
代码如下:
TiledObjectGroup
其实并不难理解,在上一博文中我们已经知道了对象层是做什么的,这
个TiledObjectGroup 其实就是libgdx中对于对象层的封装,方便与我们查找和使用。对象层,顾名思义,他是
用来处理对象的,TiledMap中的对象其实通俗的讲就是游戏中能“动”的事物,以超级玛丽为例,比如玛丽中的
主角、游戏中的金币、移动的敌人小乌龟、长大的蘑菇、打人的炮塔等,这些都是对象,都可以在对象层里面处
理。在上一博文中,我也已经详细的介绍了,如何拖拽出对象层。TiledObjectGroup
一般都是和TildObject连
用的,毕竟TildObject才是里面拖拽出来的对象图块。
2. TildObject 类
API定义:包含TiledMap中的对象图块。
成员变量:object中 X 坐标(int
x)、object中Y坐标(int y )、
gid(int)、name、polygon、polyline、properties、type、width、height。
height:对象层图块的高度。
width:对象层的图块宽度。
name:对象层图块的名字。
properties:对象层的属性。
int gid
:群体身份。(这个土豆也不是很清楚,求大神指教)
int x : object中的x坐标。
int y : object中的y坐标。
polygon:多边形对象层。
polyline:线性对象层。
功能用法:都是配合TiledObjectGroup使用,同样是作为遍历的对象,常用用于设置对象的出生点。
代码如下:
TildObject
是TiledObjectGroup中的对象图块,但是TildObject
作为对象,有许多属性,这些属性就是我们可
以利用来开发游戏的,比如我们可以给object设置属性,然后遍历其中的属性,创建不同的对象,根据不同的对
象向名字,然后得到object实例,从而在该实例的地方,进行相应的操作。详细的方法,在下文的代码实现中,
我会详细介绍的。
3. TiledLayer 类
API定义:包含TiledMap图层信息。
成员变量:name、二维数组tiles[][]、properties。
tiles[][]:是一个将TildMap默认分为一个二维数组,方便管理,如果该方块中有图片那么tiles[m][n]
= 1(m、n为任意常数),否则的话tiles[m][n] = 0.
tiles = map.layers.get(0).tiles;
String name = map.layers.get(0).name;
map = TiledLoader.createMap(Gdx.files.internal("data/1.tmx"));
map = TiledLoader.createMap(String
tmxdata);
使用方法:图层比较常用,这里我就拿一个实例来说明。
代码如下:
这里相信大家也能看清楚,都知道是做取出tiles和name,这里我要强调一下,这个get(n)是什么意思呢,这个n代表图层数。
如果 n
= 0 的话就代表取出“块层1”;n = 1的时候就是代表取出“块层2”依次类推。
TiledLayer
一般比较常用,图层是我们应对碰撞检测时候必须要使用到的元素,所以大家一定要
搞清楚图层的选取项和图层名字。一定要熟悉TiledMap给我们定义好的Tiled[][]数组,这个也是需要我们熟悉的。
4. TileAtlas
类
API定义:以一个tile为单位,储存tiles作为地图集(atlas),用于TileMapRender绘制。
功能用法:一般配合TileMap使用,作为地图集。
代码如下:
atlas = new TileAtlas(map, Gdx.files.internal("data/"));
成员变量:regionMaps、texture。
基本方法:
flipRegions(boolean x, boolean y)
翻转Region
getRegion(int id)
通过id获取region
TileAtlas
一般都是配合tiledmap使用的,这里不详细介绍了。
5. TiledLoader
类
API定义:从TiledMap软件中,加载一个TMX文件。
使用方法:有两种使用方法。
(1)通过Gdx获取tmx路径加载文件。
(2)通过TMX文件名加载文件。
关于 TiledLoader
其实就这么几句话,没什么好解释的,大家这么用下去就可以了。
6. TileSet
类
API定义:Tileset其实是所有tile的集合,这是tiled管理tile的一种分组方式。每个tile有一个name来代表。
使用方法:可以选择使用。
TileSet set = map.tileSets.get(i);
成员变量:firstgid 、imageName、
margin 、name、spacing
、tileHeight 、tilewidth。
firstgid:tile的全局id--firstgid。每个tile内部使用自己的local
id,而firstgid作为在多个map中区分tile的标识。
ps:由于一个tile可以被多个map引用,所以layer的data属性值使用base64编码、使用gzip压缩的一个32位整数的数
组,它代表了tile的全局id--firstgid。每个tile内部使用自己的local
id,而firstgid作为在多个map中区分tile的标识.
imageName:图块中图片名称。
margin :边距,实质上就是每个矩形图块间的间隙,在上个博文中我也介绍了边距是什么意思。
spacing
: Tile四边的边框,因为不常用,所以经常被设置为0。
tileHeight 和 tilewidth
:tile的宽和高。
7. TileMapRenderer 类
API定义:通过Sprite绘制一个地图。
参数变量:
TileMapRenderer(int[][][] map, TileAtlas atlas, int tileWidth, int tileHeight,
float unitsPerTileX, float unitsPerTileY, IntArray blendedTiles, int tilesPerBlockX,
int tilesPerBlockY, ShaderProgram shader)
(1)第一个参数:传入一个TildMap ,map,即 TMX文件作为 TiledMapRender的对象。
(2)第二个参数:TieldAtlas,图块,上文也介绍到了。
(3)第三、四个参数: tile的宽高,同样上文介绍了。
(4)第五、六个参数:X 轴和 Y 轴方向,图块的缓冲个数。
(5)第七个参数: 混合Tiles,不常用。
(5)第八、九个参数:X 轴和 Y 轴方向,一个单位渲染的图块个数。
(6)第十个参数:阴影效果。
一般参数并不全部使用,只是选择几个常用的参数使用而已,这里全部介绍一下,大家可以自定义使用。
常用方法:TileMapRenderer
中方法比较多,但是常用的不多,这里简单的介绍几个常用的方法。
getMapHeightUnits()
方法:获取地图的高度,单位是像素,宽度也是同理。
render方法:前两个参数是绘制起点,后面连个是绘制宽高,最后是绘制的图层。
render(float x, float y, float width, float height, int[] layers)
render(OrthographicCamera
cam)方法:渲染是传入相机。
8.实例分析
关于0.98版本 Tildmap的封装,这里已经进行了详细的介绍,估计大家已经能了解了这些类的具体功能与实现
了。为了方便大家理解这几个类的使用,这里我们就那一个实例来帮助大家使用TiledMap,由于上面介绍的类有
一些是负责碰撞检测的,这里先不做介绍,后面土豆会单独拿出来一节博文,专门讲解TiledMap中碰撞检测的实
现,以及一些技巧。今天我们还是拿我们的超级玛丽项目当例子。
(1)首先测试一下Tiledobjects、和TileGroup的使用方法。在项目中新建一个Mario的类,继承Actor类。我们将马里奥实例化的时候设置在(0,0)点,然后通过对object遍历的方式,将马里奥放入我们制定好的对象层的坐标中,当然了我们也可以讲马里奥实例化在object的坐标点,这个大家随意了。通过新建一个 setMario()方法来实现。
代码如下:
public void setMario() {
for(TiledObjectGroup group : map.objectGroups) {
for(TiledObject object : group.objects) {
if("mario".equals(object.name)) {
//
mario = new
Mario(object.x,
//
render.getMapHeightUnits() -
object.y - 75);
mario.x = object.x;
mario.y = render.getMapHeightUnits() - object.y - 75;
}
}
}
}
//
//
(2)为了方便检测图层名称,我们这次简单的打印一下图层的名字。
代码如下:
String name = map.layers.get(1).name;
System.out.println(name);
String name1 = map.layers.get(0).name;
System.out.println(name1);
System.out.println(name);
String
System.out.println(name1);
效果图:(大家应该知道eclipse是不支持中文的,没办法这个“块层”2个字打不出来是乱码)
(3)对比效果,如果没有用遍历的方式,我们的马里奥是出生在(0.0)点的,实现了遍历以后马里奥是出生在我们设置的对象层的位置。这里要强调一下,TiledMap的默认起点坐标是左上角为(0.0)点,而不是左下角的(0.0)点,希望大家注意,所以马里奥的Y轴坐标需要转换一下,通过过去屏幕的全部高度然后减去对象层的高度,就转化为我们要获得的人物初始的坐标了。
坐标系图:
效果图:
关于TiledmapRender 在前面也做了详细的介绍,这个在上几篇博文中也做了介绍,这里就不赘述了,关于
TiledSet 我会在碰撞检测的时候给大家做介绍。
完整代码:
(1)TiledMapTest 类代码。
package com.potato;
importcom.badlogic.gdx.ApplicationListener;
importcom.badlogic.gdx.Gdx;
importcom.badlogic.gdx.graphics.GL10;
importcom.badlogic.gdx.graphics.OrthographicCamera;
importcom.badlogic.gdx.graphics.g2d.tiled.TileAtlas;
importcom.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer;
importcom.badlogic.gdx.graphics.g2d.tiled.TiledLoader;
importcom.badlogic.gdx.graphics.g2d.tiled.TiledMap;
importcom.badlogic.gdx.graphics.g2d.tiled.TiledObject;
importcom.badlogic.gdx.graphics.g2d.tiled.TiledObjectGroup;
importcom.badlogic.gdx.scenes.scene2d.Stage;
publicclass TiledMapTest implements ApplicationListener {
TiledMap map;
TileAtlas atlas;
int tiles[][];
TileMapRenderer render;
OrthographicCamera cam;
Stage stage;
Mario mario;
@Override
public void create() {
map = TiledLoader.createMap(Gdx.files.internal("data/1.tmx"));
atlas = new TileAtlas(map, Gdx.files.internal("data/"));
render = new TileMapRenderer(map, atlas, 10, 10);
tiles = map.layers.get(0).tiles;
String name = map.layers.get(1).name;
System.out.println(name);
String name1 = map.layers.get(0).name;
System.out.println(name1);
cam = new OrthographicCamera();
cam.setToOrtho(false, 480, 320);
stage = new Stage(480, 320, false);
mario = new Mario(0, 0);
setMario();
stage.addActor(mario);
stage.addActor(mario.buttonL);
stage.addActor(mario.buttonR);
Gdx.input.setInputProcessor(stage);
}
@Override
import
import
import
import
import
import
import
import
import
import
import
public