四十二からの答えの価値について話すことはできません。うまくいった場合は、そう言って返信してください。私が書いているゲームでこれが機能するようになりましたが、問題は使用している形式にあります。
TiledMapPlus および slick2d に必要なように、データが圧縮および gzip された 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 の null 値としてクラッシュします。そのため、2 桁の数字のエンコードと圧縮の後に返される内容に問題があります。これは、obj-c を使用している人々がこれと同じ問題に遭遇していないように見えるため、かなり Java 固有のようです。
どんな助けでも大歓迎です。