`
kingj
  • 浏览: 425778 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

libgdx系列之-加载tileMap地图

 
阅读更多

Android libgdx tiled 使用tiledMapEditor编辑二维地图
2011-12-20 18:04

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);
            }
        }
    }
}
 
  • 大小: 15 KB
分享到:
评论

相关推荐

    Libgdx专题系列 斜45°地图

    接着,我们将用到TileMap和TileMapRenderer。LibGDX 提供了TiledMap类,它支持TMX格式的地图文件,这种格式允许我们在地图编辑器(如Tiled)中设计复杂的地图结构,包括不同的图层、对象和属性。加载TiledMap后,...

    Libgdx专题系列 地图移动

    2. **Map Rendering**:在Libgdx中,我们使用`TmxMapLoader`加载TMX地图,然后通过`OrthogonalTiledMapRenderer`类进行渲染。这个渲染器可以处理不同层的透明度、顺序以及缩放,使地图在游戏世界中平滑移动。 3. **...

    libgdx 游戏地图的制作

    LibGDX 提供了TiledMap类,使开发者能够方便地创建、加载和渲染游戏地图。 **1. Tiled Map Editor** 首先,我们需要一个工具来设计地图。Tiled Map Editor是一款流行的免费工具,它可以用来创建Tiled Maps,这些...

    platforms:基于 tilemap 的游戏的副项目

    Tilemap,顾名思义,是用一系列的矩形“瓷砖”(Tiles)按照特定的排列方式构成的地图。这种方法广泛应用于2D游戏,因为它们可以轻松地创建出各种地形,如草地、森林、城市等,并且可以高效地渲染和更新。 在...

    libgdx 常见UI

    9. **TiledMapRenderer与TileMap**: 对于复杂的UI背景,LibGDX提供了`TiledMap`和`TiledMapRenderer`,支持导入Tiled编辑器创建的TMX地图,实现多层、可滚动的背景。 10. **动画与时间线**: `Animation`类用于创建...

    Libgdx第二篇第一节

    在Libgdx中,我们使用TiledMapTileSet来存储和管理这些TileSet,每个Tile都有一个唯一的ID,便于在地图上进行绘制。 接下来,我们关注地图的渲染。Libgdx提供了 OrthogonalTiledMapRenderer 和 ...

    tiled-qt游戏地图编译器

    Tiled-Qt支持多种地图格式,如TMX(Tiled Map eXtended)和TMX JSON,这些格式被广泛应用于各种游戏引擎和库,如LibGDX、Panda3D和Godot。通过TMX格式,开发者可以创建不同类型的层,包括图像层、对象层和地形层,...

    android RPG地图绘制

    Tiled使用TMX(Tiled Map XML)格式存储地图数据,包括图块集(Tilesets)、图层(Layers)和对象组(Object Groups)。TMX文件包含了地图的元数据,如图块大小、地图尺寸、图层顺序等,而GID(全局图块ID)则关联了...

    一个类似超级玛丽的Java游戏

    我们可以使用TileMap(瓷砖地图)的概念,将地图划分为多个小块,每个块代表一种地形或障碍物。通过读取关卡文件(可能为XML或JSON格式),动态加载和渲染地图。 4. **动画和图形**:游戏中的角色和环境需要动态...

    TileMapExample:以程序生成具有 Simplex 噪声层的瓦片地图的示例

    在游戏开发领域,TileMap(瓷砖地图)是一种常见的场景构建技术,它允许开发者通过组合小块图像(称为“瓷砖”)来创建复杂的游戏世界。在这个名为"TileMapExample"的项目中,我们看到一个使用Java编程语言实现的...

    java游戏简单实现

    例如,`Map`类可以有一个二维的`Tile[][]`数组,每个`Tile`对象包含地形属性(如是否可通行)。 3. **游戏循环**:所有游戏都基于某种形式的主循环,负责处理输入、更新游戏状态和渲染画面。在Java中,我们可以使用...

    gdxRPG2

    gdxRPG2可能使用TileMap系统来构建这些环境,允许玩家在不同的区域之间移动。 3. **战斗系统**:RPG游戏中的战斗通常涉及策略和决策,gdxRPG2可能包含回合制或实时战斗机制,支持角色间的互动和战斗动画。 4. **...

    ExampleTiledLayerAnimated.zip_嵌入式/单片机/硬件编程_Java_

    7. **文件I/O操作**:可能涉及到加载和保存tile地图的数据结构。 通过分析和实践这个示例,开发者可以深入理解嵌入式Java环境下的图形处理和动画实现,这对于从事嵌入式系统的GUI开发或2D游戏制作来说是非常有价值...

Global site tag (gtag.js) - Google Analytics