#28 修复解析properties

This commit is contained in:
yhh
2020-08-14 11:44:20 +08:00
parent a2a73562a0
commit 15f6b06348
15 changed files with 1681 additions and 195 deletions

View File

@@ -101,8 +101,8 @@ module es {
} else {
for (let i = 0; i < this.tiledMap.layers.length; i++) {
if (this.tiledMap.layers[i].visible && this.layerIndicesToRender.contains(i))
TiledRendering.renderLayer(this.tiledMap.layers[i] as TmxLayer, this.displayObject as egret.DisplayObjectContainer, Vector2.add(this.entity.transform.position, this._localOffset),
this.transform.scale, this.renderLayer);
TiledRendering.renderLayerRenderCamera(this.tiledMap.layers[i] as TmxLayer, this.displayObject as egret.DisplayObjectContainer, Vector2.add(this.entity.transform.position, this._localOffset),
this.transform.scale, this.renderLayer, camera.bounds);
}
}
}

View File

@@ -40,10 +40,8 @@ module es {
// }
export class TmxImage {
public bitmap: egret.Bitmap;
public get texture(): egret.Texture{
return this.bitmap.texture;
}
public texture: egret.Bitmap;
public bitmap: egret.SpriteSheet;
public source: string;
public format: string;
public data: any;
@@ -53,7 +51,7 @@ module es {
public dispose(){
if (this.bitmap){
this.texture.dispose();
this.bitmap.dispose();
this.bitmap = null;
}
}

View File

@@ -249,12 +249,14 @@ module es {
return null;
let dict = new Map<string, string>();
for (let p of prop["property"]) {
for (let p of prop) {
let pname = p["name"];
let valueAttr = p["value"];
let pval = valueAttr ? valueAttr : p;
dict.set(pname, pval);
if (p["type"] == "color")
dict.set(pname, TmxUtils.color16ToUnit(valueAttr).toString());
else
dict.set(pname, valueAttr);
}
return dict;
}
@@ -316,9 +318,9 @@ module es {
tileset.tileRegions = new Map<number, Rectangle>();
if (tileset.image && tileset.image.bitmap) {
let id = firstGid;
for (let y = tileset.margin; y < tileset.image.bitmap.height - tileset.margin; y += tileset.tileHeight + tileset.spacing) {
for (let y = tileset.margin; y < tileset.image.height - tileset.margin; y += tileset.tileHeight + tileset.spacing) {
let column = 0;
for (let x = tileset.margin; x < tileset.image.bitmap.width - tileset.margin; x += tileset.tileWidth + tileset.spacing) {
for (let x = tileset.margin; x < tileset.image.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 +329,7 @@ module es {
}
} else {
tileset.tiles.forEach(tile => {
tileset.tileRegions.set(firstGid + tile.id, new Rectangle(0, 0, tile.image.bitmap.width, tile.image.bitmap.height));
tileset.tileRegions.set(firstGid + tile.id, new Rectangle(0, 0, tile.image.width, tile.image.height));
});
}
@@ -515,7 +517,7 @@ module es {
let xSource = xImage["image"];
if (xSource) {
image.source = "resource/assets/" + xSource;
image.bitmap = new Bitmap(await RES.getResByUrl(image.source, null, this, RES.ResourceItem.TYPE_IMAGE));
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"];
@@ -523,8 +525,8 @@ module es {
}
image.trans = TmxUtils.color16ToUnit(xImage["trans"]);
image.width = xImage["width"] != undefined ? xImage["width"] : 0;
image.height = xImage["height"] != undefined ? xImage["height"] : 0;
image.width = xImage["imagewidth"] != undefined ? xImage["imagewidth"] : 0;
image.height = xImage["imageheight"] != undefined ? xImage["imageheight"] : 0;
return image;
}

View File

@@ -1,4 +1,6 @@
module es {
import Bitmap = egret.Bitmap;
export class TiledRendering {
public static renderMap(map: TmxMap, container: egret.DisplayObjectContainer, position: Vector2, scale: Vector2, layerDepth: number) {
map.layers.forEach(layer => {
@@ -21,7 +23,7 @@ module es {
let tileWidth = layer.map.tileWidth * scale.x;
let tileHeight = layer.map.tileHeight * scale.y;
let color = DrawUtils.getColorMatrix(0x000000);
let color = DrawUtils.getColorMatrix(0xFFFFFF);
for (let i = 0; i < layer.tiles.length; i++) {
let tile = layer.tiles[i];
if (!tile)
@@ -31,20 +33,67 @@ module es {
}
}
public static renderLayerRenderCamera(layer: ITmxLayer, container: egret.DisplayObjectContainer, position: Vector2, scale: Vector2, layerDepth: number, camerClipBounds: Rectangle){
if (layer instanceof TmxLayer && layer.visible) {
this.renderLayerCamera(layer, container, position, scale, layerDepth, camerClipBounds);
} else if (layer instanceof TmxImageLayer && layer.visible) {
this.renderImageLayer(layer, container, position, scale, layerDepth);
} else if (layer instanceof TmxGroup && layer.visible) {
this.renderGroup(layer, container, position, scale, layerDepth);
} else if (layer instanceof TmxObjectGroup && layer.visible) {
this.renderObjectGroup(layer, container, position, scale, layerDepth);
}
}
public static renderLayerCamera(layer: TmxLayer, container: egret.DisplayObjectContainer, position: Vector2, scale: Vector2, layerDepth: number, camerClipBounds: Rectangle){
if (!layer.visible)
return;
position = position.add(layer.offset);
camerClipBounds.location = camerClipBounds.location.subtract(position);
let tileWidth = layer.map.tileWidth * scale.x;
let tileHeight = layer.map.tileHeight * scale.y;
let minX, minY, maxX, maxY = 0;
if (layer.map.requiresLargeTileCulling){
minX = layer.map.worldToTilePositionX(camerClipBounds.left - (layer.map.maxTileWidth * scale.x - tileWidth));
minY = layer.map.worldToTilePositionY(camerClipBounds.top - (layer.map.maxTileHeight * scale.y - tileHeight));
maxX = layer.map.worldToTilePositionX(camerClipBounds.right + (layer.map.maxTileWidth * scale.x - tileWidth));
maxY = layer.map.worldToTilePositionY(camerClipBounds.bottom + (layer.map.maxTileHeight * scale.y - tileHeight));
}else{
minX = layer.map.worldToTilePositionX(camerClipBounds.left);
minY = layer.map.worldToTilePositionY(camerClipBounds.top);
maxX = layer.map.worldToTilePositionX(camerClipBounds.right);
maxY = layer.map.worldToTilePositionY(camerClipBounds.bottom);
}
let color = DrawUtils.getColorMatrix(0xFFFFFF);
for (let y = minY; y <= maxY; y ++){
for (let x = minX; x <= maxX; x ++){
let tile = layer.getTile(x, y);
if (tile)
this.renderTile(tile, container, position, scale, tileWidth, tileHeight, color, layerDepth);
}
}
}
public static renderImageLayer(layer: TmxImageLayer, container: egret.DisplayObjectContainer, position: Vector2, scale: Vector2, layerDepth: number) {
if (!layer.visible)
return;
let color = DrawUtils.getColorMatrix(0x000000);
let color = DrawUtils.getColorMatrix(0xFFFFFF);
let pos = Vector2.add(position, new Vector2(layer.offsetX, layer.offsetY).multiply(scale));
if (!layer.image.bitmap.parent)
container.addChild(layer.image.bitmap);
layer.image.bitmap.x = pos.x;
layer.image.bitmap.y = pos.y;
layer.image.bitmap.scaleX = scale.x;
layer.image.bitmap.scaleY = scale.y;
layer.image.bitmap.filters = [color];
if (!layer.image.texture.parent)
container.addChild(layer.image.texture);
layer.image.texture.x = pos.x;
layer.image.texture.y = pos.y;
layer.image.texture.scaleX = scale.x;
layer.image.texture.scaleY = scale.y;
layer.image.texture.filters = [color];
}
public static renderObjectGroup(objGroup: TmxObjectGroup, container: egret.DisplayObjectContainer, position: Vector2, scale: Vector2, layerDepth: number) {
@@ -57,7 +106,7 @@ module es {
continue;
// 如果我们不调试渲染,我们只渲染平铺块和文本类型
if (!Core.debugRenderEndabled){
if (!Core.debugRenderEndabled) {
if (obj.objectType != TmxObjectType.tile && obj.objectType != TmxObjectType.text)
continue;
}
@@ -86,14 +135,14 @@ module es {
let sourceRect = tileset.tileRegions[obj.tile.gid];
pos.y -= obj.tile.tilesetTile.image.height;
if (!obj.tile.tilesetTile.image.bitmap)
container.addChild(obj.tile.tilesetTile.image.bitmap);
obj.tile.tilesetTile.image.bitmap.x = pos.x;
obj.tile.tilesetTile.image.bitmap.y = pos.y;
obj.tile.tilesetTile.image.bitmap.filters = [];
obj.tile.tilesetTile.image.bitmap.rotation = 0;
obj.tile.tilesetTile.image.bitmap.scaleX = scale.x;
obj.tile.tilesetTile.image.bitmap.scaleY = scale.y;
if (!obj.tile.tilesetTile.image.texture)
container.addChild(obj.tile.tilesetTile.image.texture);
obj.tile.tilesetTile.image.texture.x = pos.x;
obj.tile.tilesetTile.image.texture.y = pos.y;
obj.tile.tilesetTile.image.texture.filters = [];
obj.tile.tilesetTile.image.texture.rotation = 0;
obj.tile.tilesetTile.image.texture.scaleX = scale.x;
obj.tile.tilesetTile.image.texture.scaleY = scale.y;
break;
case TmxObjectType.ellipse:
pos = new Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale);
@@ -115,7 +164,7 @@ module es {
Vector2.zero, 1);
break;
default:
if (Core.debugRenderEndabled){
if (Core.debugRenderEndabled) {
if (!obj.textField.parent)
container.addChild(obj.textField);
DrawUtils.drawString(obj.textField, `${obj.name}(${obj.type})`, Vector2.subtract(pos, new Vector2(0, 15)), 0xffffff, 0, Vector2.zero, 1);
@@ -166,18 +215,18 @@ module es {
if (tile.diagonalFlip) {
if (tile.horizontalFlip && tile.verticalFlip) {
rotation = MathHelper.PiOver2;
rotation = MathHelper.toDegrees(MathHelper.PiOver2);
tx += tileHeight + (sourceRect.height * scale.y - tileHeight);
ty -= (sourceRect.width * scale.x - tileWidth);
} else if (tile.horizontalFlip) {
rotation = -MathHelper.PiOver2;
rotation = MathHelper.toDegrees(-MathHelper.PiOver2);
ty += tileHeight;
} else if (tile.verticalFlip) {
rotation = MathHelper.PiOver2;
rotation = MathHelper.toDegrees(MathHelper.PiOver2);
tx += tileWidth + (sourceRect.height * scale.y - tileHeight);
ty += (tileWidth - sourceRect.width * scale.x);
} else {
rotation = -MathHelper.PiOver2;
rotation = MathHelper.toDegrees(-MathHelper.PiOver2);
ty += tileHeight;
}
}
@@ -187,26 +236,34 @@ module es {
ty += (tileHeight - sourceRect.height * scale.y);
let pos = new Vector2(tx, ty).add(position);
if (tile.tileset.image) {
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){
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];
if (tile.tileset.image) {
if (!tile.tileset.image.bitmap.getTexture(gid.toString())) {
tile.tileset.image.texture = new Bitmap(tile.tileset.image.bitmap.createTexture(gid.toString(), sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height));
container.addChild(tile.tileset.image.texture);
}
tile.tileset.image.texture.x = pos.x;
tile.tileset.image.texture.y = pos.y;
tile.tileset.image.texture.scaleX = scale.x;
tile.tileset.image.texture.scaleY = scale.y;
tile.tileset.image.texture.rotation = rotation;
tile.tileset.image.texture.anchorOffsetX = 0;
tile.tileset.image.texture.anchorOffsetY = 0;
tile.tileset.image.texture.filters = [color];
} else {
if (tilesetTile.image.texture) {
if (!tilesetTile.image.bitmap.getTexture(gid.toString())) {
tilesetTile.image.texture = new Bitmap(tilesetTile.image.bitmap.createTexture(gid.toString(), sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height));
container.addChild(tilesetTile.image.texture);
}
tilesetTile.image.texture.x = pos.x;
tilesetTile.image.texture.y = pos.y;
tilesetTile.image.texture.scaleX = scale.x;
tilesetTile.image.texture.scaleY = scale.y;
tilesetTile.image.texture.rotation = rotation;
tilesetTile.image.texture.anchorOffsetX = 0;
tilesetTile.image.texture.anchorOffsetY = 0;
tilesetTile.image.texture.filters = [color];
}
}
}

View File

@@ -41,7 +41,7 @@ module es {
*/
static color16ToUnit($color:string): number {
if (!$color)
return 0x000000;
return 0xFFFFFF;
var colorStr: string = "0x" + $color.slice(1);
return parseInt(colorStr, 16);
}