- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
import * as fileUtil from "../../utils/file.js";
import { ua } from "../../system/platform.js";
import level from "../../level/level.js";
import * as TMXUtils from "../../level/tiled/TMXUtils.js";
import { tmxList } from "../cache.js";
import { nocache, withCredentials } from "../settings.js";
/**
* parse/preload a TMX file
* @param {loader.Asset} data - asset data
* @param {Function} [onload] - function to be called when the asset is loaded
* @param {Function} [onerror] - function to be called in case of error
* @returns {number} the amount of corresponding resource parsed/preloaded
* @ignore
*/
export function preloadTMX(tmxData, onload, onerror) {
/**
* @ignore
*/
function addToTMXList(data) {
// set the TMX content
tmxList[tmxData.name] = data;
// add the tmx to the level manager
if (tmxData.type === "tmx") {
level.add(tmxData.type, tmxData.name);
}
}
//if the data is in the tmxData object, don't get it via a XMLHTTPRequest
if (tmxData.data) {
addToTMXList(tmxData.data);
if (typeof onload === "function") {
onload();
}
return;
}
let xmlhttp = new XMLHttpRequest();
// check the data format ('tmx', 'json')
let format = fileUtil.getExtension(tmxData.src);
if (xmlhttp.overrideMimeType) {
if (format === "json") {
xmlhttp.overrideMimeType("application/json");
}
else {
xmlhttp.overrideMimeType("text/xml");
}
}
xmlhttp.open("GET", tmxData.src + nocache, true);
xmlhttp.withCredentials = withCredentials;
// set the callbacks
xmlhttp.ontimeout = onerror;
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState === 4) {
// status = 0 when file protocol is used, or cross-domain origin,
// (With Chrome use "--allow-file-access-from-files --disable-web-security")
if ((xmlhttp.status === 200) || ((xmlhttp.status === 0) && xmlhttp.responseText)) {
let result = null;
// parse response
switch (format) {
case "xml":
case "tmx":
case "tsx": {
// ie9 does not fully implement the responseXML
if (ua.match(/msie/i) || !xmlhttp.responseXML) {
if (globalThis.DOMParser) {
// manually create the XML DOM
result = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");
} else {
throw new Error("XML file format loading not supported, use the JSON file format instead");
}
}
else {
result = xmlhttp.responseXML;
}
// converts to a JS object
const data = TMXUtils.parse(result);
switch (format) {
case "tmx":
result = data.map;
break;
case "tsx":
result = data.tilesets[0];
break;
}
break;
}
case "json":
case "tmj":
case "tsj":
result = JSON.parse(xmlhttp.responseText);
break;
default:
throw new Error("TMX file format " + format + " not supported !");
}
//set the TMX content
addToTMXList(result);
// fire the callback
if (typeof onload === "function") {
onload();
}
}
else if (typeof onerror === "function") {
onerror(tmxData.name);
}
}
};
// send the request
xmlhttp.send();
return 1;
}