我不能答覆的價值從42說話。如果有效,請回復說。我已經在遊戲中得到了這個工作,我正在寫作,問題在於你正在使用的格式。
當您創建一個TMX文件,該文件具有壓縮和gziped所需的TiledMapPlus和slick2d的數據時,您不需要使用<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,那麼即使tileset中有20個左右的圖塊,它也會爲該圖塊的GID(讀入文件時)的空值崩潰。因此,在編碼和壓縮任何2位數字後返回的內容是錯誤的。這看起來頗爲具體,因爲與obj-c一起工作的人似乎並沒有遇到同樣的問題。
任何幫助將不勝感激。
無法遵循所有這些,但我知道使用base64來壓縮某些東西是一個非常糟糕的想法。但是再一次,任何像樣的壓縮器都會接受這樣一個事實,即每個字節中的第7位和第8位始終爲0並相應地進行壓縮... – bdares
如果有任何混淆,我使用GZIP壓縮數據,然後將其轉換爲Base64編碼。它的TiledMap標準,我沒有定義它大聲笑。 – liamzebedee