#28 tileset 渲染

This commit is contained in:
YHH
2020-08-14 08:54:27 +08:00
parent 9111b69cee
commit a2a73562a0
8 changed files with 130 additions and 106 deletions

View File

@@ -20,7 +20,13 @@ class ObjectUtils {
public static elements(p: {}){
let c = [];
for (let i in p){
c.push(p[i]);
if (Array.isArray(p[i])){
for (let v of p[i]){
c.push(v);
}
}else{
c.push(p[i]);
}
}
return c;

View File

@@ -59,11 +59,11 @@ module es {
*/
public static async parseLayers(container: any, xEle: any, map: TmxMap, width: number, height: number) {
for (let e of ObjectUtils.elements(xEle).where(x => {
return x.name == "layer" || x.name == "objectgroup" || x.name == "imagelayer" || x.name == "group"
return x.type == "tilelayer" || x.name == "objectgroup" || x.name == "imagelayer" || x.name == "group"
})) {
let layer: ITmxLayer;
switch (e.name) {
case "layer":
switch (e.type) {
case "tilelayer":
let tileLayer = this.loadTmxLayer(new TmxLayer(), map, e, width, height);
layer = tileLayer;
@@ -148,11 +148,11 @@ module es {
layer.height = xLayer["height"];
let xData = xLayer["data"];
let encoding = xData["encoding"];
let encoding = xData["encoding"] != undefined ? xData["encoding"] : "csv";
layer.tiles = new Array<TmxLayerTile>(width * height);
if (encoding == "base64") {
let br = TmxUtils.decode(xData, encoding, xData["compression"]);
let br = TmxUtils.decode(xData.toString(), encoding, xData["compression"]);
let index = 0;
for (let j = 0; j < height; j++) {
for (let i = 0; i < width; i++) {
@@ -161,9 +161,9 @@ module es {
}
}
} else if (encoding == "csv") {
let csvData = TmxUtils.decode(xData, encoding, xData["compression"]);
// let csvData = TmxUtils.decode(xData.toString(), encoding, xData["compression"]);
let k = 0;
for (let s of csvData) {
for (let s of xData) {
let gid = s;
let x = k % width;
let y = k / width;
@@ -314,11 +314,11 @@ module es {
// 缓存我们的源矩形为每个瓷砖,所以我们不必每次我们渲染计算他们。
// 如果我们有一个image这是一个普通的tileset否则它是一个image tileset
tileset.tileRegions = new Map<number, Rectangle>();
if (tileset.image) {
if (tileset.image && tileset.image.bitmap) {
let id = firstGid;
for (let y = tileset.margin; y < tileset.image.height - tileset.margin; y += tileset.tileHeight + tileset.spacing) {
for (let y = tileset.margin; y < tileset.image.bitmap.height - tileset.margin; y += tileset.tileHeight + tileset.spacing) {
let column = 0;
for (let x = tileset.margin; x < tileset.image.width - tileset.margin; x += tileset.tileWidth + tileset.spacing) {
for (let x = tileset.margin; x < tileset.image.bitmap.width - tileset.margin; x += tileset.tileWidth + tileset.spacing) {
tileset.tileRegions.set(id++, new Rectangle(x, y, tileset.tileWidth, tileset.tileHeight));
if (++column >= tileset.columns)
@@ -327,7 +327,7 @@ module es {
}
} else {
tileset.tiles.forEach(tile => {
tileset.tileRegions.set(firstGid + tile.id, new Rectangle(0, 0, tile.image.width, tile.image.height));
tileset.tileRegions.set(firstGid + tile.id, new Rectangle(0, 0, tile.image.bitmap.width, tile.image.bitmap.height));
});
}

View File

@@ -188,23 +188,26 @@ module es {
let pos = new Vector2(tx, ty).add(position);
if (tile.tileset.image) {
if (!tile.tilesetTile.image.bitmap.parent)
container.addChild(tile.tilesetTile.image.bitmap);
tile.tilesetTile.image.bitmap.x = pos.x;
tile.tilesetTile.image.bitmap.y = pos.y;
tile.tilesetTile.image.bitmap.scaleX = scale.x;
tile.tilesetTile.image.bitmap.scaleY = scale.y;
tile.tilesetTile.image.bitmap.rotation = rotation;
tile.tilesetTile.image.bitmap.filters = [color];
if (!tile.tileset.image.bitmap.parent)
container.addChild(tile.tileset.image.bitmap);
tile.tileset.image.bitmap.x = pos.x;
tile.tileset.image.bitmap.y = pos.y;
tile.tileset.image.bitmap.scaleX = scale.x;
tile.tileset.image.bitmap.scaleY = scale.y;
tile.tileset.image.bitmap.rotation = rotation;
tile.tileset.image.bitmap.filters = [color];
} else {
if (!tilesetTile.image.bitmap)
container.addChild(tilesetTile.image.bitmap);
tilesetTile.image.bitmap.x = pos.x;
tilesetTile.image.bitmap.y = pos.y;
tilesetTile.image.bitmap.scaleX = scale.x;
tilesetTile.image.bitmap.scaleY = scale.y;
tilesetTile.image.bitmap.rotation = rotation;
tilesetTile.image.bitmap.filters = [color];
if (tilesetTile.image.bitmap){
if (!tilesetTile.image.bitmap.parent)
container.addChild(tilesetTile.image.bitmap);
tilesetTile.image.bitmap.x = pos.x;
tilesetTile.image.bitmap.y = pos.y;
tilesetTile.image.bitmap.scaleX = scale.x;
tilesetTile.image.bitmap.scaleY = scale.y;
tilesetTile.image.bitmap.rotation = rotation;
tilesetTile.image.bitmap.filters = [color];
}
}
}
}

View File

@@ -12,19 +12,18 @@ module es {
static decode(data: any, encoding: any, compression: string): Array<number> {
compression = compression || "none";
encoding = encoding || "none";
var text:string=data.children[0].text;
switch (encoding) {
case "base64":
var decoded = Base64Utils.decodeBase64AsArray(text, 4);
return (compression === "none") ? decoded : Base64Utils.decompress(text, decoded, compression);
var decoded = Base64Utils.decodeBase64AsArray(data, 4);
return (compression === "none") ? decoded : Base64Utils.decompress(data, decoded, compression);
case "csv":
return Base64Utils.decodeCSV(text);
return Base64Utils.decodeCSV(data);
case "none":
var datas: Array<number> = [];
for (var i: number = 0; i < data.children.length; i++) {
datas[i] = +data.children[i].attributes.gid;
for (var i: number = 0; i < data.length; i++) {
datas[i] = +data[i].gid;
}
return datas;