libgdx学习记录11——平铺地图TiledMap
地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用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的更多相关文章
- 一次国际化记录以及平铺JSON数据
写这个方法的原因是因为我们需要改版国际化,因为相同的项目有其他分支做过国际化,但是主版本没有进行过国际化,目前需要修改主版本的国际化,但是因为国际化的方式做了结构上的调整所以写了这个工具方法方便去 ...
- libgdx学习记录2——文字显示BitmapFont
libgdx对中文支持不是太好,主要通过Hireo和ttf字库两种方式实现.本文简单介绍最基本的bitmapfont的用法. 代码如下: package com.fxb.newtest; import ...
- libgdx学习记录3——动画Animation
libgdx动画采用Animation实现,即通过帧动画实现. 代码如下: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAd ...
- libgdx学习记录26——Polygon多边形碰撞检测
libgdx中Math封装了Polygon这个类,它是由多个定点进行描述实现的,在进行物体间的碰撞时,物体轮廓有时候是不规则的,这时候可以用一个多边形勾勒出其大概的轮廓,对其进行模拟. Polygon ...
- libgdx学习记录22——3d物体创建
libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...
- libgdx学习记录20——多线程MultiThread资源处理
在libgdx中,一般的逻辑流程都在rende()函数中执行,这个函数是由opengl的渲染线程调用的,一般的图形显示和逻辑处理都在这个线程中. 一般情形下,在这个线程中处理就行了.但是当某些逻辑处理 ...
- libgdx学习记录19——图片动态打包PixmapPacker
libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题 ...
- libgdx学习记录18——Box2d物理引擎
libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...
- libgdx学习记录17——照相机Camera
照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. C ...
随机推荐
- FAST特征点检测算法
一 原始方法 简介 在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者. 从最早期的Mo ...
- CPU IO MEM NETWork 监控命令
性能优化中CPU.内存.磁盘IO.网络性能的依赖(上) 性能优化中CPU.内存.磁盘IO.网络性能的依赖(下)
- js实现双向链表
1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...
- crm lookup
1. 大家都知道CRM 里面的Lookup 保存了相关实体的GUID,让我们深入的了解一下CRM Lookup.当我们在2个实体间建立关系的时候,CRM自动生成了一些attributes来保存相关实体 ...
- Win7下设置护眼的电脑豆沙绿界面
控制面板\所有控制面板项\个性化\窗口颜色和外观 "色调"(Hue)设为85,"饱和度"(Sat)设为90,"亮度" (Lum)设为205. ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第四周编程作业(多分类与神经网络)
多分类问题——识别手写体数字0-9 一.逻辑回归解决多分类问题 1.图片像素为20*20,X的属性数目为400,输出层神经元个数为10,分别代表1-10(把0映射为10). 通过以下代码先形式化展示数 ...
- mac系统默认python3.6
1. 终端打开.bash_profile文件 终端输入:open ~/.bash_profile 2. 打开.bash_profile文件后在内容最后添加 alias python=" ...
- Alpha冲刺报告(6/12)(麻瓜制造者)
今日已完成 邓弘立: 看github上的开源库 确定了几个对UI改进有帮助的第三方库 符天愉: 部署了用户修改信息,修改头像的接口,并且完成两个接口的api文档,复习了PHP的无限分类来实现商品的发布 ...
- React-Native开发笔记 持续更新
1.css单位转换px2dp 在做页面开发的时候习惯了用rem去做css单位,处理各种尺寸数据,到了React-Native里面做app开发时,rem就不好用了,这个时候就需要转换成另外一个单位,基本 ...
- post-message-stream的学习-metamask
kumavis/post-message-stream post-message-stream Sets up a duplex object stream over window.postMessa ...