私は四〇から二からの回答の値に話すカント:あなたは適切な方法を見つけることができない場合、あなた自身の使用のApache Commonsのコーデックを設定することは非常に簡単です。それがうまくいけば、そう答えてください。私はこれをゲームImの書き込みで動作させています。問題は使用している形式です。
TiledMapPlusとslick2dに必要なデータが圧縮され、gzipedになっているTMXファイルを作成すると、一般的な非圧縮ファイルのような<tiled>
タグは使用されません。そのカウンターは直感的ですが、それはどのように動作します。
<data>
タグでデータを作成するには、32ビット整数を使用して各gidの文字列/ストリームを作成し、それをUTF-8に変換してから圧縮してエンコードする必要があります。ここで
は、私は、Web上のどこかに見つかった例です。
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が1000などの32ビット文字列で表されていることがわかります。これらは、組み込みのタイルセットファイルに直接関連付けられます。私はこの技術をGID 9(9000として表示)を上回るように使うことができるという点で問題を抱えています。これはByteStream自体と関係があると私は信じています。私が1100と入力すると、タイルセットにタイルが20個ほどあるにもかかわらず、そのタイルのGIDのヌル値としてクラッシュします(ファイルを読み込んだとき)。したがって、任意の2桁の数字のエンコーディングと圧縮の後に何が返されるかに問題があります。これはobj-cの仕事をしている人々がこれと同じ問題を抱えているように見えるので、Java固有のようです。
ご協力いただければ幸いです。
そのすべてを追うことはできませんでしたが、圧縮したいものにbase64を使用することは、かなり悪い考えです。しかし、もう一度、まともなコンプレッサーは、バイトの7番目と8番目のビットが常に0であり、それに応じて圧縮するという事実を拾い上げるでしょう... – bdares
その混乱があれば、私はGZIPを使用してデータを圧縮してからBase64。そのTiledMap標準、私はそれを笑って定義しませんでした。 – liamzebedee