地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用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. Oracle EBS INV 更新物料慢

    失效 ICX SELECT FA.APPLICATION_SHORT_NAME, FA.APPLICATION_ID, PI.STATUS, PI.PRODUCT_VERSION, PI.PATCH_ ...

  2. fedora27安装后的配置工作(持续更新)

    换源 没什么可说的,安装后更换国内软件源是必须做的事,推荐更换阿里的镜像源.换源教程 添加epel源 EPEL (Extra Packages for Enterprise Linux)是基于Fedo ...

  3. 读高性能JavaScript编程 第三章

    第三章  DOM Scripting  最小化 DOM 访问,在 JavaScript 端做尽可能多的事情. 在反复访问的地方使用局部变量存放 DOM 引用. 小心地处理 HTML 集合,因为他们表现 ...

  4. C++第六次作业

    前言 拿到作业的时候,整个人都不好了,虽然之前和同学说以后一起写游戏,画界面,然而现在的自己对界面的知识一窍不通,虽然同学分享了一些资料,但是通过这次作业,发现自己火候还是不够-- 问题描述及仓库地址 ...

  5. kudu基础入门

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

  6. kdTree相关原理及c++实现

    kdTree概念 kd-tree或者k维树是计算机科学中使用的一种数据结构,用来组织表示k维空间中点的集合.它是一种带有其他约束条件的二分查找树.Kd-tree对于区间和近邻搜索十分有用.一般位于三维 ...

  7. 不要以为字段以transient修饰的话就一定不会被序列化

    1: 先阅读这边文章:http://www.importnew.com/21517.html 2:被transient修饰真的会被序列化吗? 反例:java.util.ArrayList中底层存储数组 ...

  8. 2.3.1 TextView(文本框)详解

    http://www.runoob.com/w3cnote/android-tutorial-textview.html 1.基础属性详解: 通过下面这个简单的界面,我们来了解几个最基本的属性: 布局 ...

  9. linux 的常用命令---------第七阶段

       LVM 逻辑卷管理器  -----其作用为 :在线扩容 卷组 vG  (也叫LVM卷组) ------------------→     在此卷组vG上建立  :       逻辑卷组 LV ( ...

  10. scrapy模拟登陆的几种方法

    方法一: 方法二: 方法三: