地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用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 GL 总账日记账打开报错此职责无可用函数

    系统管理员下,跑请求:

  2. 【转】Java学习---JDK、JRE和JVM的关系

    [原文]https://www.toutiao.com/i6591348937267872269/ 首先是JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包 ...

  3. windows安装Anaconda3

    目录 windows安装Anaconda3 环境 安装 windows安装Anaconda3 by 铁乐与猫 环境 windows7 64位 Anaconda3 5.2.0版本 windows64位 ...

  4. VPC见解

    VPC是什么? VPC:Virtual  Private  Cloud,即虚拟私有云.讨论VPC时,我们可以从两个方面来讨论: 从服务的角度来看:VPC是一种云,但是这个云不属于我们常见的公有云.私有 ...

  5. 乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

    乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻 ...

  6. vc获取当前进程CPU使用率

    double GetCPUUserRate() { HANDLE hProcess=::GetCurrentProcess(); static DWORD s_dwTickCountOld = 0; ...

  7. 开通博客啦 Let‘s Go!

    入园两年半,在博客园学到很多知识.得到了很大帮助,今天终于开通博客啦,准备将自己所学到的有用知识分享给大家,共同学习共同进步.

  8. [Python]运算符的优先级顺序

    运算符 描述 ** 指数 (最高优先级) ~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) * / % // 乘,除,取模和取整除 + - 加法减法 >> & ...

  9. 打开word文档时提示“Microsoft Office Word已停止工作”

    我的电脑(Win10)有Office 2003和2013两个版本,可能由于之前超长待机等原因导致word 2003的文件(.doc)不能正常打开,没次都会提示“Microsoft Office Wor ...

  10. kafka服务无法启动的原因

    kafka集群中一台服务器kill掉后再启动时报错. java.io.IOException: Map failed Caused by: java.lang.OutOfMemoryError: Ma ...