Android游戏引擎libgdx使用教程12:如何使用TiledMap地图
2013-05-27 16:49
543 查看
虽说可以用Image什么的当个背景,但是要是做个RPG类的游戏就有点复杂了。为了追求效率一般可以使用libgdx的SpriteCache,但是如果习惯于TiledMap的话libgdx也是支持的。
相关的类是TiledMap,TileAtlas,TileMapRenderer,都在com.badlogic.gdx.graphics.g2d.tiled之中。
现在我们从头来看看TiledMap的使用。
1.***TiledMap。
我使用的是Tile Map editor,下载地址:http://www.mapeditor.org/
先新建一个地图,大小50*30,每个块的大小是32*32。
然后我使用的图块资源是从网上下的,具体出处不知了,对于资源奉献者表示感谢~
添加一个新图块
块的高宽都是32.边距和间距都是1px,这些数值是取决你的图块资源本身的。效果如下:
然后发挥想象吧,画一幅地图。
保存tmx文件。然后用gdx-tiled-preprocessor处理一下。
处理完成后会多三个文件,覆盖原来的同名文件:
tilest1.png文件:
终于可以开始绘制了…
而在TileMapRenderer(map, atlas, 10, 10)这句中后面两个10是缓冲的块数,可以酌情调整。我是随意写的。
我个人比较喜欢舞台,其实tiledmap一样可以在舞台中使用。
我在舞台绘制一个标签作为例子。
其实原理很简单,从Stage获取Camera,然后给Render用,最后在Stage绘制。
关键代码:
效果不是很明显,左下角有个Label。
虽说我们绘制出来了Map,但是还没有角色,而且还没有设置墙壁等障碍,接下来的几篇文章会说说这些。
写在最后:
1.做好的TMX文件一定要处理以后再用,用TiledMapPacker处理,不是TexturePacker。我起初弄混淆了,结果把这一块的代码读懂了才反应过来…
2.Stage和TiledMap混用时,一定是stage的绘制在后。
3.Stage的相机可以移动,移动时会产生地图移动效果(比如主角向前走),但是一定要更新Stage的Actors的位置。
这篇博文写了一天半,主要是我粗心把TiledMapPacker和TexturePacker搞错,仔细看了看TexturePacker,觉得TexturePacker也是很有用的东西。算法很有趣,而且还有热心网友做的一个GUI界面,用这个就不用自己辛苦拉图了。
相关的类是TiledMap,TileAtlas,TileMapRenderer,都在com.badlogic.gdx.graphics.g2d.tiled之中。
现在我们从头来看看TiledMap的使用。
1.***TiledMap。
我使用的是Tile Map editor,下载地址:http://www.mapeditor.org/
先新建一个地图,大小50*30,每个块的大小是32*32。
然后我使用的图块资源是从网上下的,具体出处不知了,对于资源奉献者表示感谢~
添加一个新图块
块的高宽都是32.边距和间距都是1px,这些数值是取决你的图块资源本身的。效果如下:
然后发挥想象吧,画一幅地图。
保存tmx文件。然后用gdx-tiled-preprocessor处理一下。
处理完成后会多三个文件,覆盖原来的同名文件:
tilest1.png文件:
终于可以开始绘制了…
map = TiledLoader.createMap(mapHandle); atlas = new TileAtlas(map, new FileHandle("map/")); tileMapRenderer = new TileMapRenderer(map, atlas, 10, 10)最后在render用tileMapRenderer.render(cam);绘制
而在TileMapRenderer(map, atlas, 10, 10)这句中后面两个10是缓冲的块数,可以酌情调整。我是随意写的。
我个人比较喜欢舞台,其实tiledmap一样可以在舞台中使用。
我在舞台绘制一个标签作为例子。
其实原理很简单,从Stage获取Camera,然后给Render用,最后在Stage绘制。
关键代码:
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); OrthographicCamera c = (OrthographicCamera) stage.getCamera(); ((Label) stage.findActor("fpsLabel")).setText("FPS: " + Gdx.graphics.getFramesPerSecond()); stage.act(Gdx.graphics.getDeltaTime()); tileMapRenderer.render(c); stage.draw();完整代码:
package com.cnblogs.htynkn.game; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.tiled.TileAtlas; import com.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer; import com.badlogic.gdx.graphics.g2d.tiled.TiledLoader; import com.badlogic.gdx.graphics.g2d.tiled.TiledMap; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; public class JavaGame implements ApplicationListener { Stage stage; float width; float height; private TiledMap map; private TileAtlas atlas; private TileMapRenderer tileMapRenderer; Vector3 camDirection = new Vector3(1, 1, 0); Vector2 maxCamPosition = new Vector2(0, 0); Image image; @Override public void create() { final String path = "map/"; final String mapname = "tilemap"; FileHandle mapHandle = Gdx.files.internal(path + mapname + ".tmx"); map = TiledLoader.createMap(mapHandle); atlas = new TileAtlas(map, new FileHandle("map/")); tileMapRenderer = new TileMapRenderer(map, atlas, 10, 10); maxCamPosition.set(tileMapRenderer.getMapWidthUnits(), tileMapRenderer .getMapHeightUnits()); width = Gdx.graphics.getWidth(); height = Gdx.graphics.getHeight(); stage = new Stage(width, height, true); Label label = new Label("FPS:", new LabelStyle(new BitmapFont(Gdx.files .internal("font/blue.fnt"), Gdx.files.internal("font/blue.png"), false), Color.BLACK), "fpsLabel"); stage.addActor(label); Gdx.input.setInputProcessor(stage); } @Override public void dispose() { // TODO Auto-generated method stub } @Override public void pause() { // TODO Auto-generated method stub } @Override public void render() { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); OrthographicCamera c = (OrthographicCamera) stage.getCamera(); ((Label) stage.findActor("fpsLabel")).setText("FPS: " + Gdx.graphics.getFramesPerSecond()); stage.act(Gdx.graphics.getDeltaTime()); tileMapRenderer.render(c); stage.draw(); } @Override public void resize(int width, int height) { // TODO Auto-generated method stub } @Override public void resume() { // TODO Auto-generated method stub } }
效果不是很明显,左下角有个Label。
虽说我们绘制出来了Map,但是还没有角色,而且还没有设置墙壁等障碍,接下来的几篇文章会说说这些。
写在最后:
1.做好的TMX文件一定要处理以后再用,用TiledMapPacker处理,不是TexturePacker。我起初弄混淆了,结果把这一块的代码读懂了才反应过来…
2.Stage和TiledMap混用时,一定是stage的绘制在后。
3.Stage的相机可以移动,移动时会产生地图移动效果(比如主角向前走),但是一定要更新Stage的Actors的位置。
这篇博文写了一天半,主要是我粗心把TiledMapPacker和TexturePacker搞错,仔细看了看TexturePacker,觉得TexturePacker也是很有用的东西。算法很有趣,而且还有热心网友做的一个GUI界面,用这个就不用自己辛苦拉图了。
相关文章推荐
- Android游戏引擎libgdx使用教程2:如何绘制图形
- Android游戏引擎libgdx使用教程11:如何使用Skin和UI配置文件
- Android游戏引擎libgdx使用教程14:TiledMap中视角完善与障碍物处理
- Android游戏引擎libgdx使用教程6:演员与演出
- Android游戏引擎libgdx使用教程3:绘制汉字与显示中文
- Android游戏引擎libgdx使用教程16:使用TexturePacker工具加快开发速度
- 【Android LibGDX游戏引擎开发教程】第09期:动画类的使用
- 【Android LibGDX游戏引擎开发教程】第06期:图形图像的绘制(下)图片整合工具的使用
- Android游戏引擎libgdx使用教程10:双舞台
- Android游戏引擎libgdx使用教程5:常用UI类与舞台
- Android游戏引擎libgdx使用教程9:libgdx中Box2d的用法
- Android游戏引擎libgdx使用教程4:舞台和演员的游戏实例
- 【Android LibGDX游戏引擎开发教程】第05期:图形图像的绘制(上)基础类的使用和详解
- Android游戏引擎libgdx使用教程7:引擎框架总观
- Android游戏引擎libgdx使用教程8:相机和观察点
- 【Android LibGDX游戏引擎开发教程】第06期:图形图像的绘制(下)图片整合工具的使用
- Android游戏引擎libgdx使用教程1:搭建libgdx环境
- Android游戏引擎libgdx使用教程1:搭建libgdx环境
- Android游戏引擎libgdx使用教程13:TiledMap中的角色和角色移动
- Android游戏引擎libgdx使用教程15:TWL布局