libgdx的tmx地圖處理工具gdx-tiled-preprocessor.jar(TiledMapPacker)修正版


最近想做個Android的游戲,用到libgdx,現在研究地圖這塊,制作好地圖tmx文件后需要處理后libgdx才能載入,需要用到TiledMapPacker工具,該工具被放在gdx-tiled-preprocessor.jar里,這破玩意可愁死我了,一路嘗試下來各種各種報錯神馬的諸如:


Failed to load Main-Class manifest attribute

 

Exception in thread "main" com.badlogic.gdx.utils.GdxRuntimeException: Creating window failed
at com.badlogic.gdx.backends.jogl.JoglApplication.<init>(JoglApplication.java:86)
at com.badlogic.gdx.tiledmappacker.TiledMapPacker.main(TiledMapPacker.java:329)
at com.skyd.tiledmappacker.TiledMapPackerTool.main(TiledMapPackerTool.java:15)
Caused by: java.lang.reflect.InvocationTargetException
at java.awt.EventQueue.invokeAndWait(Unknown Source)
at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)
at com.badlogic.gdx.backends.jogl.JoglApplication.<init>(JoglApplication.java:80)
... 2 more
Caused by: java.lang.UnsatisfiedLinkError: no gdx64 in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.badlogic.gdx.utils.GdxNativesLoader.load(GdxNativesLoader.java:118)
at com.badlogic.gdx.backends.jogl.JoglNativesLoader.load(JoglNativesLoader.java:29)
at com.badlogic.gdx.backends.jogl.JoglApplication.initialize(JoglApplication.java:111)
at com.badlogic.gdx.backends.jogl.JoglApplication$1.run(JoglApplication.java:82)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

 

Exception in thread "main" java.lang.NullPointerException
at com.badlogic.gdx.tiledmappacker.TiledMapPacker.processMap(TiledMapPac
ker.java:92)
at com.skyd.tiledmappacker.Main.main(Main.java:38)

 

到最后看網上別人也無解,說這玩意全是錯誤,都是用單獨的圖塊文件通過TexturePacker拼起來后得到整圖及packfile文件,然后再拿進地圖編輯器編輯以輸出tmx文件,感覺切成小圖再重新拼合挺麻煩的,就嘗試修正這個工具:

image

我新建了這個項目,引入了相關的jar和gdx-tiled-preprocessor.jar的源碼,在新建的Main類中的主函數里仿照原先TiledMapPacker類的主函數的調用方式調用TiledMapPacker類的功能,但是去掉了新建窗口的那部分代碼:

image

我真不知道這操蛋的窗口建起來是搞毛用的,里面屁也不執行,還是死活都會報錯,娘的,這是Main類的代碼:

package com.skyd.tiledmappacker;
import java.io.File;
import java.io.IOException;
import com.badlogic.gdx.tiledmappacker.TiledMapPacker;
import com.badlogic.gdx.tools.imagepacker.TexturePacker.Settings;
public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File tmxFile, inputDir, outputDir;
		Settings settings = new Settings();
		// Note: the settings below are now default...
		settings.padding = 2;
		settings.duplicatePadding = true;
		
		TiledMapPacker packer = new TiledMapPacker();
		if (args.length != 2) {
			System.out.println("Usage: INPUTDIR OUTPUTDIR");
			System.exit(0);
		}
		inputDir = new File(args[0]);
		outputDir = new File(args[1]);
		
		System.out.println("待處理目錄:"+inputDir+" "+inputDir.getAbsolutePath());
		System.out.println("待處理目錄:"+outputDir+" "+outputDir.getAbsolutePath());
		if (!inputDir.exists()) {
			throw new RuntimeException("Input directory does not exist");
		}
		try {
			packer.processMap(inputDir, outputDir, settings);
		} catch (IOException e) {
			throw new RuntimeException("Error processing map: " + e.getMessage());
		}
	}
}

修好了窗口問題,執行起來還是有BUG,執行到TiledMapPacker類的processMap方法里就會報錯,要修改其源碼,將其中創建FileHandle的方式全部由“Gdx.files.absolute(XXX.getAbsolutePath())”改為“new FileHandle(XXX.getAbsolutePath())”形式,改好后的代碼:

 

	public void processMap (File inputDir, File outputDir, Settings settings) throws IOException {
		FileHandle inputDirHandle = new FileHandle(inputDir.getAbsolutePath());
		File[] files = inputDir.listFiles(new TmxFilter());
		for (File file : files) {
			System.out.println("待處理文件:"+file+" "+file.getAbsolutePath());
			map = TiledLoader.createMap(new FileHandle(file.getAbsolutePath()));
			for (TileSet set : map.tileSets) {
				if (!processedTileSets.contains(set.imageName)) {
					processedTileSets.add(set.imageName);
					packTileSet(set, inputDirHandle, outputDir, settings);
				}
			}
			writeUpdatedTMX(outputDir, map.tmxFile);
		}
	}

 

然后導出為Runnable JAR file:

SNAGHTML1f2bb657

SNAGHTML1f2cbb27

注意入口選擇Main類。

 

修正好之后的測試環境:

image

在in目錄里放置素材圖片和地圖編輯器生成的tmx文件:

image

命令行執行:

D:\test>java -jar TiledMapPacker.jar in out

SNAGHTML1f30d2bc

out目錄將得到處理后的文件:

image

至此就搞定了,可以在libgdx里進行渲染了。

 

image

修正后的TiledMapPacker.jar下載:http://vdisk.weibo.com/s/4jXW0

 

參考文檔:

http://www.cnblogs.com/htynkn/archive/2012/01/12/libgdx_12.html

http://blog.csdn.net/cng1991/article/details/7288234

https://code.google.com/p/libgdx/wiki/TiledMaps

http://dpk.net/2011/05/01/libgdx-box2d-tiled-maps-full-working-example-part-1/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM