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 ...
随机推荐
- SQL Server 中为何拥有db_owner权限的账号删除不掉数据库
今天在公司的SQL Server服务器上,使用了一个只有public和dbcreator角色的账号"user1"在SMSS中去删除一个数据库,但是死活报错说没有权限,报错如下: D ...
- python自学——文件处理(截取文件内容)
#截断文件内容使用的函数为truncate()来截断文件中的内容# 注意当truncate()括号内没有定义对象时则会删除文件内容:当括号内为指定某个条件时文件会截取从0到指定位置的内容f=open( ...
- Django之cookie&session
cookie Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息 ...
- SQL server 数据库基本插入、删除命令
一.实验素材: 附加学生信息表(student) 二.实验要求: 1. 查询student表中所有学生的信息 select * from student 2. 查询student表中“姓名”“ ...
- 复杂json的解析:jsonobject与jsonArray的使用
String parameter = { success : 0, errorMsg : "错误消息", data : { total : "总记录数", ro ...
- MongoDB中_class字段的作用
我们知道,如果你用Java的Sping Data 框架映射Pojo为MongoDB数据时,数据库中会自动给你添加一个_class字段,那这个字段是干嘛用的呢?我们可以不可以不要这个字段呢? 直接上结论 ...
- 禁止选择DIV内的文本(css,js写法)
css:<span style="font-family:SimSun;font-size:18px;">/* 禁止选择div内的文字 */ #hall_body { ...
- 1008. [HNOI2008]越狱【快速幂】
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果 相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 I ...
- Git branch -r 无法获取远程分支,ui可以看见分支但是git 命令无法查看解决方案
zhc@hongchangfirst$ git checkout -b hongchangfirst origin/hongchangfirst 出现: fatal: Cannot update pa ...
- php 微信公众号接入支付宝支付
真是无力吐槽这个需求了,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内置浏览器,强制性打开web浏览器完成 ...