修复tiled中objectgroup塞image解析失败问题

This commit is contained in:
yhh
2020-08-18 17:39:11 +08:00
parent 66ef4c6597
commit 6d4d787530
22 changed files with 658 additions and 247 deletions

View File

@@ -116,7 +116,7 @@ module es {
* @param camera
*/
public isVisibleFromCamera(camera: Camera): boolean {
this.isVisible = camera.bounds.intersects(this.bounds);
this.isVisible = camera.bounds.intersects(this.displayObject.getBounds().union(this.bounds));
return this.isVisible;
}

View File

@@ -269,10 +269,12 @@ module es {
let source = xTileset["image"];
// 如果是嵌入式TmxTileset即不是外部的source将为null
if (!source) {
if (source != undefined) {
source = map.tmxDirectory + source;
// 其他所有内容都在TSX文件中
let xDocTileset = await RES.getResByUrl(source, null, this, RES.ResourceItem.TYPE_IMAGE);
let xDocTileset = await RES.getResByUrl(source, null, this, RES.ResourceItem.TYPE_IMAGE).catch(err => {
throw new Error(err);
});
let tileset = this.loadTmxTileset(new TmxTileset(), map, xDocTileset["tileset"], firstGid);
return tileset;
@@ -297,7 +299,9 @@ module es {
let xImage = xTileset["image"];
if (xImage)
tileset.image = await this.loadTmxImage(new TmxImage(), xTileset, map.tmxDirectory);
tileset.image = await this.loadTmxImage(new TmxImage(), xTileset, map.tmxDirectory).catch(err => {
throw new Error(err);
});
tileset.terrains = [];
if (xTileset["terrains"])
@@ -305,9 +309,12 @@ module es {
tileset.terrains.push(this.parseTmxTerrain(e));
tileset.tiles = new Map<number, TmxTilesetTile>();
for (let xTile of xTileset["tiles"]) {
let tile = await this.loadTmxTilesetTile(new TmxTilesetTile(), tileset, xTile, tileset.terrains, map.tmxDirectory);
tileset.tiles.set(tile.id, tile);
for (let t in xTileset["tiles"]){
if (xTileset["tiles"].hasOwnProperty(t)){
let xTile = xTileset["tiles"][t];
let tile = await this.loadTmxTilesetTile(new TmxTilesetTile(), tileset, xTile, tileset.terrains, map.tmxDirectory);
tileset.tiles.set(tile.id == undefined ? Number(t) + 1 : tile.id, tile);
}
}
tileset.properties = this.parsePropertyDict(xTileset["properties"]);
@@ -315,7 +322,7 @@ module es {
// 缓存我们的源矩形为每个瓷砖,所以我们不必每次我们渲染计算他们。
// 如果我们有一个image这是一个普通的tileset否则它是一个image tileset
tileset.tileRegions = new Map<number, Rectangle>();
if (tileset.image && tileset.image.bitmap) {
if (tileset.image) {
let id = firstGid;
for (let y = tileset.margin; y < tileset.image.height - tileset.margin; y += tileset.tileHeight + tileset.spacing) {
let column = 0;
@@ -327,8 +334,8 @@ module es {
}
}
} else {
tileset.tiles.forEach(tile => {
tileset.tileRegions.set(firstGid + tile.id, new Rectangle(0, 0, tile.image.width, tile.image.height));
tileset.tiles.forEach((tile, key) => {
tileset.tileRegions.set(key, new Rectangle(0, 0, tile.image.width, tile.image.height));
});
}
@@ -516,18 +523,19 @@ module es {
public static async loadTmxImage(image: TmxImage, xImage: any, tmxDirectory: string) {
let xSource = xImage["image"];
if (xSource) {
if (xSource != undefined) {
image.source = tmxDirectory + xSource;
image.bitmap = new egret.SpriteSheet(await RES.getResByUrl(image.source, null, this, RES.ResourceItem.TYPE_IMAGE));
} else {
image.format = xImage["format"];
let xData = xImage["data"];
image.data = TmxUtils.decode(xData, xData["encoding"], xData["compression"]);
image.source = tmxDirectory + xImage;
}
let texture: egret.Texture = await RES.getResByUrl(image.source, null, this, RES.ResourceItem.TYPE_IMAGE).catch(err => {
throw new Error(err);
});
image.bitmap = new egret.SpriteSheet(texture);
image.trans = TmxUtils.color16ToUnit(xImage["trans"]);
image.width = xImage["imagewidth"] != undefined ? xImage["imagewidth"] : 0;
image.height = xImage["imageheight"] != undefined ? xImage["imageheight"] : 0;
image.width = xImage["imagewidth"] != undefined ? xImage["imagewidth"] : texture.textureWidth;
image.height = xImage["imageheight"] != undefined ? xImage["imageheight"] : texture.textureHeight;
return image;
}

View File

@@ -171,51 +171,7 @@ module es {
}
break;
case TmxObjectType.tile:
let tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid);
let sourceRect = tileset.tileRegions.get(obj.tile.gid);
if (obj.tile.horizontalFlip && obj.tile.verticalFlip) {
pos.x += tileset.tileHeight + (sourceRect.height * scale.y - tileset.tileHeight);
pos.y -= (sourceRect.width * scale.x - tileset.tileWidth);
}
else if (obj.tile.horizontalFlip) {
pos.x += tileset.tileWidth + (sourceRect.height * scale.y - tileset.tileHeight);
}
else if (obj.tile.verticalFlip) {
pos.y += (tileset.tileWidth - sourceRect.width * scale.x);
}
else {
pos.y += (tileset.tileHeight - sourceRect.height * scale.y);
}
if (container){
let texture: egret.Texture = tileset.image.bitmap.getTexture(`${obj.tile.gid}`);
if (!texture) {
texture = tileset.image.bitmap.createTexture(`${obj.tile.gid}`, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height);
}
tileset.image.texture = new Bitmap(texture);
container.addChild(tileset.image.texture);
if (tileset.image.texture.x != pos.x) tileset.image.texture.x = pos.x;
if (tileset.image.texture.y != pos.y) tileset.image.texture.y = pos.y;
if (obj.tile.verticalFlip && obj.tile.horizontalFlip){
tileset.image.texture.scaleX = -1;
tileset.image.texture.scaleY = -1;
}else if (obj.tile.verticalFlip){
tileset.image.texture.scaleX = scale.x;
tileset.image.texture.scaleY = -1;
}else if(obj.tile.horizontalFlip){
tileset.image.texture.scaleX = -1;
tileset.image.texture.scaleY = scale.y;
}else{
tileset.image.texture.scaleX = scale.x;
tileset.image.texture.scaleY = scale.y;
}
if (tileset.image.texture.anchorOffsetX != 0) tileset.image.texture.anchorOffsetX = 0;
if (tileset.image.texture.anchorOffsetY != 0) tileset.image.texture.anchorOffsetY = 0;
debugRender(obj, pos);
}
this.renderTilesetTile(objGroup, obj, container, pos, scale, debugRender);
break;
case TmxObjectType.ellipse:
pos = new Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale);
@@ -272,6 +228,82 @@ module es {
}
}
private static renderTilesetTile(objGroup: es.TmxObjectGroup, obj, container: egret.DisplayObjectContainer, pos, scale: es.Vector2, debugRender) {
let tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid);
let sourceRect = tileset.tileRegions.get(obj.tile.gid);
if (container) {
if (tileset.image) {
if (obj.tile.horizontalFlip && obj.tile.verticalFlip) {
pos.x += tileset.tileHeight + (sourceRect.height * scale.y - tileset.tileHeight);
pos.y -= (sourceRect.width * scale.x - tileset.tileWidth);
} else if (obj.tile.horizontalFlip) {
pos.x += tileset.tileWidth + (sourceRect.height * scale.y - tileset.tileHeight);
} else if (obj.tile.verticalFlip) {
pos.y += (tileset.tileWidth - sourceRect.width * scale.x);
} else {
pos.y += (tileset.tileHeight - sourceRect.height * scale.y);
}
let texture: egret.Texture = tileset.image.bitmap.getTexture(`${obj.tile.gid}`);
if (!texture) {
texture = tileset.image.bitmap.createTexture(`${obj.tile.gid}`, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height);
}
tileset.image.texture = new Bitmap(texture);
container.addChild(tileset.image.texture);
tileset.image.texture.x = pos.x;
tileset.image.texture.y = pos.y;
if (obj.tile.verticalFlip && obj.tile.horizontalFlip) {
tileset.image.texture.scaleX = -1;
tileset.image.texture.scaleY = -1;
} else if (obj.tile.verticalFlip) {
tileset.image.texture.scaleX = scale.x;
tileset.image.texture.scaleY = -1;
} else if (obj.tile.horizontalFlip) {
tileset.image.texture.scaleX = -1;
tileset.image.texture.scaleY = scale.y;
} else {
tileset.image.texture.scaleX = scale.x;
tileset.image.texture.scaleY = scale.y;
}
tileset.image.texture.anchorOffsetX = 0;
tileset.image.texture.anchorOffsetY = 0;
debugRender(obj, pos);
} else {
let tilesetTile = tileset.tiles.get(obj.tile.gid);
let texture: egret.Texture = tilesetTile.image.bitmap.getTexture(`${obj.tile.gid}`);
if (!texture) {
texture = tilesetTile.image.bitmap.createTexture(`${obj.tile.gid}`, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height);
}
pos.y -= obj.height;
tilesetTile.image.texture = new Bitmap(texture);
container.addChild(tilesetTile.image.texture);
tilesetTile.image.texture.width = obj.width;
tilesetTile.image.texture.height = obj.height;
tilesetTile.image.texture.x = pos.x;
tilesetTile.image.texture.y = pos.y;
if (obj.tile.verticalFlip && obj.tile.horizontalFlip) {
tilesetTile.image.texture.scaleX = -1;
tilesetTile.image.texture.scaleY = -1;
} else if (obj.tile.verticalFlip) {
tilesetTile.image.texture.scaleX = scale.x;
tilesetTile.image.texture.scaleY = -1;
} else if (obj.tile.horizontalFlip) {
tilesetTile.image.texture.scaleX = -1;
tilesetTile.image.texture.scaleY = scale.y;
} else {
tilesetTile.image.texture.scaleX = scale.x;
tilesetTile.image.texture.scaleY = scale.y;
}
tilesetTile.image.texture.anchorOffsetX = 0;
tilesetTile.image.texture.anchorOffsetY = 0;
}
}
}
public static renderGroup(group: TmxGroup, container: egret.DisplayObjectContainer, position: Vector2, scale: Vector2, layerDepth: number) {
if (!group.visible)
return;