地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件。

编辑好后,可通过TmxMapLoader来读取地图文件。可通过一个正交相机OthographicCamera和正交地图渲染器OrthogonalTiledMapRenderer来进行显示。

实例如下:

 package com.fxb.newtest;

 import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.maps.MapLayer;
import com.badlogic.gdx.maps.objects.RectangleMapObject;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TiledMapTileLayer;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image; public class Lib010_TiledMap extends ApplicationAdapter{ TiledMap map;
OrthogonalTiledMapRenderer renderer;
OrthographicCamera camera;
TextureRegion regionPurple;
TextureRegion regionBlue;
TextureRegion regionGreen; TiledMapTileLayer layer1; Stage stage;
Image imgGreen; enum StateX{ move_still, move_right, move_left };
enum StateY{ move_still, move_up, move_down }; StateX stateX = StateX.move_still;
StateY stateY = StateY.move_still; float clicktimeX = ;
float clicktimeY = ;
float currentTime = ; @Override
public void create() {
// TODO Auto-generated method stub map = new TmxMapLoader().load( "map1/test1.tmx" );
renderer = new OrthogonalTiledMapRenderer( map );
stage = new Stage( Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false, renderer.getSpriteBatch() ); regionPurple = new TextureRegion( new Texture( Gdx.files.internal( "map1/bullet_purple_32.png" ) ) );
regionBlue = new TextureRegion( new Texture( Gdx.files.internal( "map1/bullet_blue_32.png" ) ) );
regionGreen = new TextureRegion( new Texture( Gdx.files.internal( "map1/bullet_green_32.png" ) ) ); camera = new OrthographicCamera( *, * );
//camera.setToOrtho( false, 32*30, 32*12 );
camera.position.set( */, */, );
camera.update(); layer1 = (TiledMapTileLayer)map.getLayers().get();
MapLayer layer2 = map.getLayers().get(); System.out.println( layer1.getName()+"\n"+layer2.getName() ); int count = layer2.getObjects().getCount();
System.out.println(count);
for( int i=; i<count; ++i ){
RectangleMapObject obj = (RectangleMapObject)layer2.getObjects().get(i);
String strName = obj.getName(); if( strName != null ){
System.out.print( strName+"\t" );
if( obj.getProperties() != null ){
if( obj.getProperties().get("level")!=null ){
String strProperty = obj.getProperties().get("level").toString();
System.out.println( strProperty ); float x = obj.getRectangle().getX();
float y = obj.getRectangle().getY();
//System.out.println( x/32+","+y/32 );
Image tempImg = new Image( regionPurple );
tempImg.setSize( , );
tempImg.setPosition( x, y );
stage.addActor( tempImg );
}
else if( obj.getProperties().get("time")!=null ){
float x = obj.getRectangle().getX();
float y = obj.getRectangle().getY();
//System.out.println( x/32+","+y/32 );
Image tempImg = new Image( regionBlue );
tempImg.setSize( , );
tempImg.setPosition( x, y );
stage.addActor( tempImg );
} } }
} imgGreen = new Image( regionGreen );
imgGreen.setSize( , );
stage.addActor( imgGreen );
imgGreen.setPosition( , ); stage.addListener(new InputListener(){
@Override
public boolean keyDown(InputEvent event, int keycode) {
// TODO Auto-generated method stub
if( keycode == Input.Keys.UP ){
//imgGreen.translate( 0, 32 );
stateY = StateY.move_up;
MoveY();
clicktimeY = currentTime;
//state = State.move_still;
}
else if( keycode == Input.Keys.DOWN ){
//imgGreen.translate( 0, -32 );
stateY = StateY.move_down;
MoveY();
clicktimeY = currentTime;
//state = State.move_still;
} if( keycode == Input.Keys.LEFT ){
//imgGreen.translate( -32, 0 );
stateX = StateX.move_left;
MoveX();
clicktimeX = currentTime;
//state = State.move_still;
}
else if( keycode == Input.Keys.RIGHT ){
//imgGreen.translate( 32, 0 );
stateX = StateX.move_right;
MoveX();
clicktimeX = currentTime;
//state = State.move_still;
}
return true;
} @Override
public boolean keyUp(InputEvent event, int keycode) {
// TODO Auto-generated method stub
if( keycode == Input.Keys.UP ){
//imgGreen.translate( 0, 32 );
stateY = StateY.move_still;
}
else if( keycode == Input.Keys.DOWN ){
//imgGreen.translate( 0, -32 );
stateY = StateY.move_still;
} if( keycode == Input.Keys.LEFT ){
//imgGreen.translate( -32, 0 );
stateX = StateX.move_still;
}
else if( keycode == Input.Keys.RIGHT ){
//imgGreen.translate( 32, 0 );
stateX = StateX.move_still;
}
return true;
} }); Gdx.input.setInputProcessor( stage );
} public void MoveX(){
float x0 = imgGreen.getX();
float y0 = imgGreen.getY();
int x1 = , y1 = ;
int x2 = , y2 = ;
int x3 = , y3 = ; float speed = ; switch( stateX ){
case move_right:
imgGreen.translate( speed, );
x1 = (int)( (imgGreen.getX()+)/ );
x2 = x3 = x1; y1 = (int)( (imgGreen.getY()+)/ );
y2 = (int)( (imgGreen.getY()+)/ );
y3 = (int)( (imgGreen.getY()+)/ );
break;
case move_left:
imgGreen.translate( -speed, );
x1 = (int)( (imgGreen.getX()+)/ );
x2 = x3 = x1; y1 = (int)( (imgGreen.getY()+)/ );
y2 = (int)( (imgGreen.getY()+)/ );
y3 = (int)( (imgGreen.getY()+)/ );
break;
default:
break;
}
if( layer1.getCell( x1, y1 )!=null || layer1.getCell( x2, y2 )!=null || layer1.getCell( x3, y3 )!=null ){
imgGreen.setPosition( x0, y0 );
} } public void MoveY(){
float x0 = imgGreen.getX();
float y0 = imgGreen.getY();
int x1 = , y1 = ;
int x2 = , y2 = ;
int x3 = , y3 = ; float speed = ;
switch( stateY ){
case move_up:
imgGreen.translate( , speed );
x1 = (int)( (imgGreen.getX()+)/ );
x2 = (int)( (imgGreen.getX()+)/ );
x3 = (int)( (imgGreen.getX()+)/ ); y1 = (int)( (imgGreen.getTop()-)/ );
y2 = y3 = y1;
//x2 = x3 = x1;
break;
case move_down:
imgGreen.translate( , -speed );
x1 = (int)( (imgGreen.getX()+)/ );
x2 = (int)( (imgGreen.getX()+)/ );
x3 = (int)( (imgGreen.getX()+)/ ); y1 = (int)( (imgGreen.getY()+)/ );
y2 = y3 = y1;
break;
default:
break;
} if( layer1.getCell( x1, y1 )!=null || layer1.getCell( x2, y2 )!=null || layer1.getCell( x3, y3 )!=null ){
imgGreen.setPosition( x0, y0 );
}
} @Override
public void render() {
// TODO Auto-generated method stub
Gdx.gl.glClearColor( 0.5f, 0.5f, 0.5f, );
Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT ); renderer.setView(camera);
renderer.render(); currentTime += Gdx.graphics.getDeltaTime();
if( currentTime - clicktimeX > 0.15f ){
MoveX();
}
if( currentTime - clicktimeY > 0.15f ){
MoveY();
} stage.act();
stage.draw();
} @Override
public void dispose() {
// TODO Auto-generated method stub
super.dispose();
} }

运行结果:

地图是自己随便编辑的。有两个图层,一个背景层,一个对象层。对象层可通过getCell()函数获取地图单元。

通过layer.getMapObject()可获取对应的对象。

MapObject可通过getProperties().get("level")这种形式获取对象的键值,以便在程序中使用。

要获取object的x,y坐标以及长宽时,需将MapObject转化为RectangleMapObject,然后获取其Rectangle就行了。

另外,地图中涉及碰撞检测,一般在控制物体(一般是玩家)的边缘设置2-3个检测点,最好不要设置在两边,而是靠近边缘的点。

大概就这么多了,比较粗糙,记录而已。。

libgdx学习记录11——平铺地图TiledMap的更多相关文章

  1. 一次国际化记录以及平铺JSON数据

    ​ 写这个方法的原因是因为我们需要改版国际化,因为相同的项目有其他分支做过国际化,但是主版本没有进行过国际化,目前需要修改主版本的国际化,但是因为国际化的方式做了结构上的调整所以写了这个工具方法方便去 ...

  2. libgdx学习记录2——文字显示BitmapFont

    libgdx对中文支持不是太好,主要通过Hireo和ttf字库两种方式实现.本文简单介绍最基本的bitmapfont的用法. 代码如下: package com.fxb.newtest; import ...

  3. libgdx学习记录3——动画Animation

    libgdx动画采用Animation实现,即通过帧动画实现. 代码如下: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAd ...

  4. libgdx学习记录26——Polygon多边形碰撞检测

    libgdx中Math封装了Polygon这个类,它是由多个定点进行描述实现的,在进行物体间的碰撞时,物体轮廓有时候是不规则的,这时候可以用一个多边形勾勒出其大概的轮廓,对其进行模拟. Polygon ...

  5. libgdx学习记录22——3d物体创建

    libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...

  6. libgdx学习记录20——多线程MultiThread资源处理

    在libgdx中,一般的逻辑流程都在rende()函数中执行,这个函数是由opengl的渲染线程调用的,一般的图形显示和逻辑处理都在这个线程中. 一般情形下,在这个线程中处理就行了.但是当某些逻辑处理 ...

  7. libgdx学习记录19——图片动态打包PixmapPacker

    libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题 ...

  8. libgdx学习记录18——Box2d物理引擎

    libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...

  9. libgdx学习记录17——照相机Camera

    照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. C ...

随机推荐

  1. guider – 全系统Linux性能分析器

    Guider是一个免费且开源的,功能强大的全系统性能分析工具,主要以Python for Linux 操作系统编写. 它旨在衡量系统资源使用量并跟踪系统行为,从而使其可以有效分析系统性能问题或进行性能 ...

  2. 关于QT的QCombox的掉坑出坑

    最近项目中开发在用到QCombox,然而在开发中,踩到了一个坑,花了一个晚上,一直在想,好在最后找到问题所在了. 这是业务的流程.直接说重点:QCombox在下拉窗更新数据的时候,会默认把下拉窗的第一 ...

  3. MySQL主从复制异步原理以及搭建

    MySQL主从复制的原理: 1.首先,MySQL主库在事务提交时会把数据变更作为时间events记录在二进制日志文件binlog中:MySQL主库上的sync_binlog参数控制Binlog日志以什 ...

  4. SHGetFileInfo 报错 异常 问题

    查看代码是否使用了 ::CoInitializeEx(NULL, COINIT_MULTITHREADED); 如果是,换成在每个线程调用 ::CoInitialize(NULL); 真够蛋疼的,查了 ...

  5. mac系统默认python3.6

    1. 终端打开.bash_profile文件 终端输入:open ~/.bash_profile   2. 打开.bash_profile文件后在内容最后添加  alias python=" ...

  6. kudu基础入门

    1.kudu介绍 1.1 背景介绍 在KUDU之前,大数据主要以两种方式存储: (1)静态数据: 以 HDFS 引擎作为存储引擎,适用于高吞吐量的离线大数据分析场景.这类存储的局限性是数据无法进行随机 ...

  7. node学习笔记_03 express框架

    express api地址:http://www.expressjs.com.cn/starter/static-files.html 一.安装依赖 npm i --save express npm ...

  8. python 爬取全量百度POI

    在网上找了很多关于爬取百度POI的文章,但是对“全量”的做法并没有得到最终的解决方案,自己写了一个,但还是不能实现全量POI抓取,能够达到至少50%的信息抓取.注意:这里所指“全量”是能够达到100% ...

  9. JQuery 为radio赋值问题

    今天用jquery 为radio赋值,从百度查了一下方法: $("input[name='radioName'][value=2]").attr("checked&quo ...

  10. Android开发之jdk安装及环境变量配置

    然后开始配置环境变量,JAVA_HOME,Path和classpath三部分: (1)在变量名输入框中写入“JAVA_HOME”,在变量值输入框中写入“C:\Program Files\Java\jd ...