我无法说出四十二个答案的价值。如果它有效,请回复这样说。我已经在我正在编写的游戏中得到了这个工作,问题出在你使用的格式上。
当您创建一个 TMX 文件时,按照 TiledMapPlus 和 slick2d 的要求压缩和 gzip 压缩了数据,您不要<tiled>
像一般的非压缩文件那样使用标签。它与直觉相反,但这就是它的工作原理。
要在<data>
标签中创建数据,您需要使用 32 位整数创建每个 gid 的字符串/流,然后将其转换为 UTF-8,然后对其进行压缩和编码。
这是我在网上某处找到的一个示例:
Element data = doc.createElement("data");
data.setAttribute("encoding", "base64");
data.setAttribute("compression", "gzip");
String bytestring = new String();
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
switch(this.data[x][y]){
case 0: bytestring += "1000";
break;
case 1: bytestring += "2000";
break;
case 2: bytestring += "3000";
break;
case 3: bytestring += "4000";
break;
case 4: bytestring += "5000";
break;
case 5: bytestring += "6000";
break;
case 6: bytestring += "7000";
break;
case 7: bytestring += "8000";
break;
case 8: bytestring += "9000";
break;
}
}
}
Text value = doc.createTextNode(compress(bytestring));
data.appendChild(value);
压缩和编码是这样完成的:
private static String compress(String str){
byte byteAry[] = null;
try{
byteAry = str.getBytes("UTF-8");
}catch( UnsupportedEncodingException e){
System.out.println("Unsupported character set");
}
for(int i = 0; i < byteAry.length; i++) {
if(byteAry[i] == 48)
byteAry[i] = 0;
if(byteAry[i] == 49)
byteAry[i] = 1;
if(byteAry[i] == 50)
byteAry[i] = 2;
if(byteAry[i] == 51)
byteAry[i] = 3;
if(byteAry[i] == 52)
byteAry[i] = 4;
if(byteAry[i] == 53)
byteAry[i] = 5;
if(byteAry[i] == 54)
byteAry[i] = 6;
if(byteAry[i] == 55)
byteAry[i] = 7;
if(byteAry[i] == 56)
byteAry[i] = 8;
if(byteAry[i] == 57)
byteAry[i] = 9;
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try {
OutputStream deflater = new GZIPOutputStream(buffer);
deflater.write(byteAry);
deflater.close();
}catch (IOException e) {
throw new IllegalStateException(e);
}
String results = Base64.encodeBase64String(buffer.toByteArray());
return results;
}
现在这是一个高度相关的更高级的问题。在上面的示例中,您可以看到每个 GID 都由 32 位字符串表示,例如 1000。这些直接与包含的tileset 文件相关联。我有一个问题,我似乎可以使用这种技术来超过 GID 9(显示为 9000)。我相信这与 ByteStream 本身有关。如果我输入 1100 它会作为该图块的 GID 的空值(在读取文件时)崩溃,即使该图块集中有 20 个左右的图块。因此,在对任何 2 位数字进行编码和压缩后返回的内容有问题。这似乎是特定于 java 的,因为使用 obj-c 工作的人似乎没有遇到同样的问题。
任何帮助将不胜感激。