package com.badlogic.gdx.graphics.g2d.tiled;
文件TileAtlas:
当 libgdx使用tiled Map时,由于原方法获取图块是通过配置的图片packfile来获取的,用于我找不到生成图片packfile的工具,所以打算修改这个方法,直接不需要packfile就可以操作(一个方法优化可以少生成一个packfile文件),以下是原始方法:
public TileAtlas (TiledMap map, FileHandle inputDir) {
// TODO: Create a constructor that doesn't take a tmx map,
for (TileSet set : map.tileSets) {
FileHandle packfile = getRelativeFileHandle(inputDir, removeExtension(set.imageName) + " packfile");
TextureAtlas textureAtlas = new TextureAtlas(packfile, packfile.parent(), false);
List<AtlasRegion> atlasRegions = textureAtlas.findRegions(removeExtension(removePath(set.imageName)));
for (AtlasRegion reg : atlasRegions) {
regionsMap.put(reg.index + set.firstgid, reg);
if (!textures.contains(reg.getTexture())) {
textures.add(reg.getTexture());
}
}
}
}
修改为:通过算数来算出值,而不是通过packfile文件读取,package file读取可能会产生很多问题。
public TileAtlas (TiledMap map, FileHandle inputDir) {
for (TileSet set : map.tileSets) {
if(set.imageName==null){
continue;
}
FileHandle imageFile = getRelativeFileHandle(inputDir, (set.imageName) );
List<AtlasRegion> atlasRegions=new ArrayList<AtlasRegion>();
Texture texture = new Texture(imageFile);
for(int j=0;j<texture.getHeight()/set.tileHeight;j++){
int wn=texture.getWidth()/set.tileWidth;
for(int i=0;i<wn;i++){
AtlasRegion atlasRegion= new AtlasRegion(texture,i*set.tileWidth,j*set.tileHeight,set.tileWidth,set.tileHeight);
atlasRegion.index=j*wn+i;
atlasRegions.add(atlasRegion);
}
}
for (AtlasRegion reg : atlasRegions) {
regionsMap.put(reg.index + set.firstgid, reg);
if (!textures.contains(reg.getTexture())) {
textures.add(reg.getTexture());
}
}
}
}
我这里有一个demo,截图如下
代码如下:
package com.zx;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.tiled.TileAtlas;
import com.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer;
import com.badlogic.gdx.graphics.g2d.tiled.TileSet;
import com.badlogic.gdx.graphics.g2d.tiled.TiledLoader;
import com.badlogic.gdx.graphics.g2d.tiled.TiledMap;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
public class JavaGame implements ApplicationListener {
Stage stage;
float width;
float height;
private TiledMap map;
private TileAtlas atlas;
private TileMapRenderer tileMapRenderer;
Vector3 camDirection = new Vector3(1, 1, 0);
Vector2 maxCamPosition = new Vector2(0, 0);
Image image;
@Override
public void create() {
FileHandle mapHandle = Gdx.files.internal("map/ff.tmx");
System.out.println("MapHandle is -->"+mapHandle);
map = TiledLoader.createMap(mapHandle);
System.out.println("Map is -->"+map);
FileHandle packages=Gdx.files.internal("map");
System.out.println("Package fileHandle-->"+packages);
atlas = new CustomerTiledAlisa(map, packages);
tileMapRenderer = new TileMapRenderer(map, atlas, 10, 10);
System.out.println("TileMapRenderer--->"+tileMapRenderer);
maxCamPosition.set(tileMapRenderer.getMapWidthUnits(), tileMapRenderer .getMapHeightUnits());
width = Gdx.graphics.getWidth();
height = Gdx.graphics.getHeight();
stage = new Stage(width, height, true);
System.out.printf("Stage->(%f,%f)",width,height);
Label label = new Label("FPS:", new LabelStyle(new BitmapFont(Gdx.files
.internal("zh-cn.fnt"),
Gdx.files.internal("zh-cn.png"), false), Color.BLACK),
"fpsLabel");
System.out.println("Label--->"+label.toString());
stage.addActor(label);
Gdx.input.setInputProcessor(stage);
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render() {
System.out.println("start to render map");
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
OrthographicCamera c = (OrthographicCamera) stage.getCamera();
System.out.println("获取相机->"+c.toString());
((Label) stage.findActor("fpsLabel")).setText("FPS: "
+ Gdx.graphics.getFramesPerSecond());
stage.act(Gdx.graphics.getDeltaTime());
System.out.println("延迟时间-->"+Gdx.graphics.getDeltaTime());
System.out.println("Render(height,width)"+tileMapRenderer.getMapHeightUnits()+","+tileMapRenderer.getMapWidthUnits()+",Map->"+tileMapRenderer.getMap().tileSets);
tileMapRenderer.render(c);
stage.draw();
}
@Override
public void resize(int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
private static class CustomerTiledAlisa extends TileAtlas{
private static FileHandle getRelativeFileHandle (FileHandle path, String relativePath) {
if (relativePath.trim().length() == 0) {
return path;
}
FileHandle child = path;
StringTokenizer tokenizer = new StringTokenizer(relativePath, "\\/");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (token.equals("..")) {
child = child.parent();
} else {
child = child.child(token);
}
}
return child;
}
public CustomerTiledAlisa (TiledMap map, FileHandle inputDir) {
for (TileSet set : map.tileSets) {
if(set.imageName==null){
continue;
}
FileHandle imageFile = getRelativeFileHandle(inputDir, (set.imageName) );
List<AtlasRegion> atlasRegions=new ArrayList<AtlasRegion>();
Texture texture = new Texture(imageFile);
for(int j=0;j<texture.getHeight()/set.tileHeight;j++){
int wn=texture.getWidth()/set.tileWidth;
for(int i=0;i<wn;i++){
AtlasRegion atlasRegion= new AtlasRegion(texture,i*set.tileWidth,j*set.tileHeight,set.tileWidth,set.tileHeight);
atlasRegion.index=j*wn+i;
atlasRegions.add(atlasRegion);
}
}
for (AtlasRegion reg : atlasRegions) {
regionsMap.put(reg.index + set.firstgid, reg);
if (!textures.contains(reg.getTexture())) {
textures.add(reg.getTexture());
}
}
System.out.println("textuare is ->"+textures);
}
}
}
}
相关推荐
接着,我们将用到TileMap和TileMapRenderer。LibGDX 提供了TiledMap类,它支持TMX格式的地图文件,这种格式允许我们在地图编辑器(如Tiled)中设计复杂的地图结构,包括不同的图层、对象和属性。加载TiledMap后,...
2. **Map Rendering**:在Libgdx中,我们使用`TmxMapLoader`加载TMX地图,然后通过`OrthogonalTiledMapRenderer`类进行渲染。这个渲染器可以处理不同层的透明度、顺序以及缩放,使地图在游戏世界中平滑移动。 3. **...
LibGDX 提供了TiledMap类,使开发者能够方便地创建、加载和渲染游戏地图。 **1. Tiled Map Editor** 首先,我们需要一个工具来设计地图。Tiled Map Editor是一款流行的免费工具,它可以用来创建Tiled Maps,这些...
Tilemap,顾名思义,是用一系列的矩形“瓷砖”(Tiles)按照特定的排列方式构成的地图。这种方法广泛应用于2D游戏,因为它们可以轻松地创建出各种地形,如草地、森林、城市等,并且可以高效地渲染和更新。 在...
9. **TiledMapRenderer与TileMap**: 对于复杂的UI背景,LibGDX提供了`TiledMap`和`TiledMapRenderer`,支持导入Tiled编辑器创建的TMX地图,实现多层、可滚动的背景。 10. **动画与时间线**: `Animation`类用于创建...
在Libgdx中,我们使用TiledMapTileSet来存储和管理这些TileSet,每个Tile都有一个唯一的ID,便于在地图上进行绘制。 接下来,我们关注地图的渲染。Libgdx提供了 OrthogonalTiledMapRenderer 和 ...
Tiled-Qt支持多种地图格式,如TMX(Tiled Map eXtended)和TMX JSON,这些格式被广泛应用于各种游戏引擎和库,如LibGDX、Panda3D和Godot。通过TMX格式,开发者可以创建不同类型的层,包括图像层、对象层和地形层,...
Tiled使用TMX(Tiled Map XML)格式存储地图数据,包括图块集(Tilesets)、图层(Layers)和对象组(Object Groups)。TMX文件包含了地图的元数据,如图块大小、地图尺寸、图层顺序等,而GID(全局图块ID)则关联了...
我们可以使用TileMap(瓷砖地图)的概念,将地图划分为多个小块,每个块代表一种地形或障碍物。通过读取关卡文件(可能为XML或JSON格式),动态加载和渲染地图。 4. **动画和图形**:游戏中的角色和环境需要动态...
在游戏开发领域,TileMap(瓷砖地图)是一种常见的场景构建技术,它允许开发者通过组合小块图像(称为“瓷砖”)来创建复杂的游戏世界。在这个名为"TileMapExample"的项目中,我们看到一个使用Java编程语言实现的...
例如,`Map`类可以有一个二维的`Tile[][]`数组,每个`Tile`对象包含地形属性(如是否可通行)。 3. **游戏循环**:所有游戏都基于某种形式的主循环,负责处理输入、更新游戏状态和渲染画面。在Java中,我们可以使用...
gdxRPG2可能使用TileMap系统来构建这些环境,允许玩家在不同的区域之间移动。 3. **战斗系统**:RPG游戏中的战斗通常涉及策略和决策,gdxRPG2可能包含回合制或实时战斗机制,支持角色间的互动和战斗动画。 4. **...
7. **文件I/O操作**:可能涉及到加载和保存tile地图的数据结构。 通过分析和实践这个示例,开发者可以深入理解嵌入式Java环境下的图形处理和动画实现,这对于从事嵌入式系统的GUI开发或2D游戏制作来说是非常有价值...