#28 支持objectgroup的tile类型

This commit is contained in:
YHH
2020-08-15 18:16:59 +08:00
parent 5dc7a72310
commit f0b2d5b9b8
9 changed files with 169 additions and 77 deletions
+4 -1
View File
@@ -1792,7 +1792,10 @@ declare module es {
static loadTmxText(text: TmxText, xText: any): TmxText; static loadTmxText(text: TmxText, xText: any): TmxText;
static loadTmxAlignment(alignment: TmxAlignment, xText: any): TmxAlignment; static loadTmxAlignment(alignment: TmxAlignment, xText: any): TmxAlignment;
static parsePoints(xPoints: any): any[]; static parsePoints(xPoints: any): any[];
static parsePoint(s: string): Vector2; static parsePoint(pt: {
x: number;
y: number;
}): Vector2;
static parseTmxTerrain(xTerrain: any): TmxTerrain; static parseTmxTerrain(xTerrain: any): TmxTerrain;
static parseTmxTileOffset(xTileOffset: any): TmxTileOffset; static parseTmxTileOffset(xTileOffset: any): TmxTileOffset;
static loadTmxImage(image: TmxImage, xImage: any): Promise<TmxImage>; static loadTmxImage(image: TmxImage, xImage: any): Promise<TmxImage>;
+53 -23
View File
@@ -7865,7 +7865,7 @@ var es;
switch (_c.label) { switch (_c.label) {
case 0: case 0:
_i = 0, _a = ObjectUtils.elements(xEle).where(function (x) { _i = 0, _a = ObjectUtils.elements(xEle).where(function (x) {
return x.type == "tilelayer" || x.name == "objectgroup" || x.name == "imagelayer" || x.name == "group"; return x.type == "tilelayer" || x.type == "objectgroup" || x.type == "imagelayer" || x.type == "group";
}); });
_c.label = 1; _c.label = 1;
case 1: case 1:
@@ -8232,9 +8232,9 @@ var es;
drawOrderDict.set("index", es.DrawOrderType.TopDown); drawOrderDict.set("index", es.DrawOrderType.TopDown);
var drawOrderValue = xObjectGroup["draworder"]; var drawOrderValue = xObjectGroup["draworder"];
if (drawOrderValue) if (drawOrderValue)
group.drawOrder = drawOrderDict[drawOrderValue]; group.drawOrder = drawOrderDict.get(drawOrderValue);
group.objects = []; group.objects = [];
for (var _i = 0, _a = xObjectGroup["object"]; _i < _a.length; _i++) { for (var _i = 0, _a = xObjectGroup["objects"]; _i < _a.length; _i++) {
var e = _a[_i]; var e = _a[_i];
group.objects.push(this.loadTmxObject(new es.TmxObject(), map, e)); group.objects.push(this.loadTmxObject(new es.TmxObject(), map, e));
} }
@@ -8312,21 +8312,16 @@ var es;
return alignment; return alignment;
}; };
TiledMapLoader.parsePoints = function (xPoints) { TiledMapLoader.parsePoints = function (xPoints) {
var pointString = xPoints["points"];
var pointStringPair = pointString.split(' ');
var points = []; var points = [];
var index = 0; var index = 0;
for (var _i = 0, pointStringPair_1 = pointStringPair; _i < pointStringPair_1.length; _i++) { for (var _i = 0, xPoints_1 = xPoints; _i < xPoints_1.length; _i++) {
var s = pointStringPair_1[_i]; var s = xPoints_1[_i];
points[index++] = this.parsePoint(s); points[index++] = this.parsePoint(s);
} }
return points; return points;
}; };
TiledMapLoader.parsePoint = function (s) { TiledMapLoader.parsePoint = function (pt) {
var pt = s.split(','); return new es.Vector2(pt.x, pt.y);
var x = Number(pt[0]);
var y = Number(pt[1]);
return new es.Vector2(x, y);
}; };
TiledMapLoader.parseTmxTerrain = function (xTerrain) { TiledMapLoader.parseTmxTerrain = function (xTerrain) {
var terrain = new es.TmxTerrain(); var terrain = new es.TmxTerrain();
@@ -8500,16 +8495,52 @@ var es;
break; break;
case es.TmxObjectType.tile: case es.TmxObjectType.tile:
var tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid); var tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid);
var sourceRect = tileset.tileRegions[obj.tile.gid]; var sourceRect = tileset.tileRegions.get(obj.tile.gid);
pos.y -= obj.tile.tilesetTile.image.height; if (obj.tile.horizontalFlip && obj.tile.verticalFlip) {
if (!obj.tile.tilesetTile.image.texture) pos.x += tileset.tileHeight + (sourceRect.height * scale.y - tileset.tileHeight);
container.addChild(obj.tile.tilesetTile.image.texture); pos.y -= (sourceRect.width * scale.x - tileset.tileWidth);
obj.tile.tilesetTile.image.texture.x = pos.x; }
obj.tile.tilesetTile.image.texture.y = pos.y; else if (obj.tile.horizontalFlip) {
obj.tile.tilesetTile.image.texture.filters = []; pos.x += tileset.tileWidth + (sourceRect.height * scale.y - tileset.tileHeight);
obj.tile.tilesetTile.image.texture.rotation = 0; }
obj.tile.tilesetTile.image.texture.scaleX = scale.x; else if (obj.tile.verticalFlip) {
obj.tile.tilesetTile.image.texture.scaleY = scale.y; pos.y += (tileset.tileWidth - sourceRect.width * scale.x);
}
else {
pos.y += (tileset.tileHeight - sourceRect.height * scale.y);
}
if (container) {
var 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;
}
break; break;
case es.TmxObjectType.ellipse: case es.TmxObjectType.ellipse:
pos = new es.Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale); pos = new es.Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale);
@@ -8580,7 +8611,6 @@ var es;
} }
else { else {
ty += tileHeight; ty += tileHeight;
// ty += (tileHeight - sourceRect.height * scale.y);
} }
var pos = new es.Vector2(tx, ty).add(position); var pos = new es.Vector2(tx, ty).add(position);
if (tile.tileset.image) { if (tile.tileset.image) {
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -12,15 +12,15 @@ module scene {
public async onStart() { public async onStart() {
let mapData = await es.TiledMapLoader.loadTmxMap(new es.TmxMap(), "orthogonal-outside_json"); let mapData = await es.TiledMapLoader.loadTmxMap(new es.TmxMap(), "orthogonal-outside_json");
let map = this.createEntity("map"); let map = this.createEntity("map");
map.addComponent(new es.TiledMapRenderer(mapData)); let tiledMap = map.addComponent(new es.TiledMapRenderer(mapData)).setRenderLayer(1);
console.log(mapData); console.log(mapData);
let sprite = new es.Sprite(RES.getRes("checkbox_select_disabled_png")); let sprite = new es.Sprite(RES.getRes("checkbox_select_disabled_png"));
this.createEntityAsync("bg").then(bg => { this.createEntityAsync("bg").then(bg => {
bg.addComponent(new component.PlayerController()); bg.addComponent(new component.PlayerController());
bg.addComponent(new es.Mover()); bg.addComponent(new es.Mover());
let spriteRenderer = bg.addComponent(new es.ScrollingSpriteRenderer(sprite)); let spriteRenderer = bg.addComponent(new es.ScrollingSpriteRenderer(sprite)).setRenderLayer(0);
spriteRenderer.scrollX = -30; // spriteRenderer.scrollX = -30;
// bg.addComponent(new es.BoxCollider()); // bg.addComponent(new es.BoxCollider());
this.camera.follow(bg, es.CameraStyle.lockOn); this.camera.follow(bg, es.CameraStyle.lockOn);
+4 -1
View File
@@ -1792,7 +1792,10 @@ declare module es {
static loadTmxText(text: TmxText, xText: any): TmxText; static loadTmxText(text: TmxText, xText: any): TmxText;
static loadTmxAlignment(alignment: TmxAlignment, xText: any): TmxAlignment; static loadTmxAlignment(alignment: TmxAlignment, xText: any): TmxAlignment;
static parsePoints(xPoints: any): any[]; static parsePoints(xPoints: any): any[];
static parsePoint(s: string): Vector2; static parsePoint(pt: {
x: number;
y: number;
}): Vector2;
static parseTmxTerrain(xTerrain: any): TmxTerrain; static parseTmxTerrain(xTerrain: any): TmxTerrain;
static parseTmxTileOffset(xTileOffset: any): TmxTileOffset; static parseTmxTileOffset(xTileOffset: any): TmxTileOffset;
static loadTmxImage(image: TmxImage, xImage: any): Promise<TmxImage>; static loadTmxImage(image: TmxImage, xImage: any): Promise<TmxImage>;
+55 -24
View File
@@ -7865,7 +7865,7 @@ var es;
switch (_c.label) { switch (_c.label) {
case 0: case 0:
_i = 0, _a = ObjectUtils.elements(xEle).where(function (x) { _i = 0, _a = ObjectUtils.elements(xEle).where(function (x) {
return x.type == "tilelayer" || x.name == "objectgroup" || x.name == "imagelayer" || x.name == "group"; return x.type == "tilelayer" || x.type == "objectgroup" || x.type == "imagelayer" || x.type == "group";
}); });
_c.label = 1; _c.label = 1;
case 1: case 1:
@@ -8232,9 +8232,9 @@ var es;
drawOrderDict.set("index", es.DrawOrderType.TopDown); drawOrderDict.set("index", es.DrawOrderType.TopDown);
var drawOrderValue = xObjectGroup["draworder"]; var drawOrderValue = xObjectGroup["draworder"];
if (drawOrderValue) if (drawOrderValue)
group.drawOrder = drawOrderDict[drawOrderValue]; group.drawOrder = drawOrderDict.get(drawOrderValue);
group.objects = []; group.objects = [];
for (var _i = 0, _a = xObjectGroup["object"]; _i < _a.length; _i++) { for (var _i = 0, _a = xObjectGroup["objects"]; _i < _a.length; _i++) {
var e = _a[_i]; var e = _a[_i];
group.objects.push(this.loadTmxObject(new es.TmxObject(), map, e)); group.objects.push(this.loadTmxObject(new es.TmxObject(), map, e));
} }
@@ -8312,21 +8312,16 @@ var es;
return alignment; return alignment;
}; };
TiledMapLoader.parsePoints = function (xPoints) { TiledMapLoader.parsePoints = function (xPoints) {
var pointString = xPoints["points"];
var pointStringPair = pointString.split(' ');
var points = []; var points = [];
var index = 0; var index = 0;
for (var _i = 0, pointStringPair_1 = pointStringPair; _i < pointStringPair_1.length; _i++) { for (var _i = 0, xPoints_1 = xPoints; _i < xPoints_1.length; _i++) {
var s = pointStringPair_1[_i]; var s = xPoints_1[_i];
points[index++] = this.parsePoint(s); points[index++] = this.parsePoint(s);
} }
return points; return points;
}; };
TiledMapLoader.parsePoint = function (s) { TiledMapLoader.parsePoint = function (pt) {
var pt = s.split(','); return new es.Vector2(pt.x, pt.y);
var x = Number(pt[0]);
var y = Number(pt[1]);
return new es.Vector2(x, y);
}; };
TiledMapLoader.parseTmxTerrain = function (xTerrain) { TiledMapLoader.parseTmxTerrain = function (xTerrain) {
var terrain = new es.TmxTerrain(); var terrain = new es.TmxTerrain();
@@ -8500,16 +8495,52 @@ var es;
break; break;
case es.TmxObjectType.tile: case es.TmxObjectType.tile:
var tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid); var tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid);
var sourceRect = tileset.tileRegions[obj.tile.gid]; var sourceRect = tileset.tileRegions.get(obj.tile.gid);
pos.y -= obj.tile.tilesetTile.image.height; if (obj.tile.horizontalFlip && obj.tile.verticalFlip) {
if (!obj.tile.tilesetTile.image.texture) pos.x += tileset.tileHeight + (sourceRect.height * scale.y - tileset.tileHeight);
container.addChild(obj.tile.tilesetTile.image.texture); pos.y -= (sourceRect.width * scale.x - tileset.tileWidth);
obj.tile.tilesetTile.image.texture.x = pos.x; }
obj.tile.tilesetTile.image.texture.y = pos.y; else if (obj.tile.horizontalFlip) {
obj.tile.tilesetTile.image.texture.filters = []; pos.x += tileset.tileWidth + (sourceRect.height * scale.y - tileset.tileHeight);
obj.tile.tilesetTile.image.texture.rotation = 0; }
obj.tile.tilesetTile.image.texture.scaleX = scale.x; else if (obj.tile.verticalFlip) {
obj.tile.tilesetTile.image.texture.scaleY = scale.y; pos.y += (tileset.tileWidth - sourceRect.width * scale.x);
}
else {
pos.y += (tileset.tileHeight - sourceRect.height * scale.y);
}
if (container) {
var 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;
}
break; break;
case es.TmxObjectType.ellipse: case es.TmxObjectType.ellipse:
pos = new es.Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale); pos = new es.Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale);
@@ -8572,14 +8603,14 @@ var es;
ty -= (sourceRect.width * scale.x - tileWidth); ty -= (sourceRect.width * scale.x - tileWidth);
} }
else if (tile.horizontalFlip) { else if (tile.horizontalFlip) {
tx += tileWidth + (sourceRect.height * scale.y - tileHeight);
ty += tileHeight; ty += tileHeight;
} }
else if (tile.verticalFlip) { else if (tile.verticalFlip) {
tx += tileWidth + (sourceRect.height * scale.y - tileHeight);
ty += (tileWidth - sourceRect.width * scale.x); ty += (tileWidth - sourceRect.width * scale.x);
} }
else { else {
ty += (tileHeight - sourceRect.height * scale.y); ty += tileHeight;
} }
var pos = new es.Vector2(tx, ty).add(position); var pos = new es.Vector2(tx, ty).add(position);
if (tile.tileset.image) { if (tile.tileset.image) {
+1 -1
View File
File diff suppressed because one or more lines are too long
+6 -12
View File
@@ -59,7 +59,7 @@ module es {
*/ */
public static async parseLayers(container: any, xEle: any, map: TmxMap, width: number, height: number) { public static async parseLayers(container: any, xEle: any, map: TmxMap, width: number, height: number) {
for (let e of ObjectUtils.elements(xEle).where(x => { for (let e of ObjectUtils.elements(xEle).where(x => {
return x.type == "tilelayer" || x.name == "objectgroup" || x.name == "imagelayer" || x.name == "group" return x.type == "tilelayer" || x.type == "objectgroup" || x.type == "imagelayer" || x.type == "group"
})) { })) {
let layer: ITmxLayer; let layer: ITmxLayer;
switch (e.type) { switch (e.type) {
@@ -394,10 +394,10 @@ module es {
let drawOrderValue = xObjectGroup["draworder"]; let drawOrderValue = xObjectGroup["draworder"];
if (drawOrderValue) if (drawOrderValue)
group.drawOrder = drawOrderDict[drawOrderValue]; group.drawOrder = drawOrderDict.get(drawOrderValue);
group.objects = []; group.objects = [];
for (let e of xObjectGroup["object"]) for (let e of xObjectGroup["objects"])
group.objects.push(this.loadTmxObject(new TmxObject(), map, e)); group.objects.push(this.loadTmxObject(new TmxObject(), map, e));
group.properties = this.parsePropertyDict(xObjectGroup["properties"]); group.properties = this.parsePropertyDict(xObjectGroup["properties"]);
return group; return group;
@@ -479,24 +479,18 @@ module es {
} }
public static parsePoints(xPoints: any) { public static parsePoints(xPoints: any) {
let pointString: string = xPoints["points"];
let pointStringPair = pointString.split(' ');
let points = []; let points = [];
let index = 0; let index = 0;
for (let s of pointStringPair) for (let s of xPoints)
points[index++] = this.parsePoint(s); points[index++] = this.parsePoint(s);
return points; return points;
} }
public static parsePoint(s: string) { public static parsePoint(pt: {x: number, y: number}) {
let pt = s.split(','); return new Vector2(pt.x, pt.y);
let x = Number(pt[0]);
let y = Number(pt[1]);
return new Vector2(x, y);
} }
public static parseTmxTerrain(xTerrain: any) { public static parseTmxTerrain(xTerrain: any) {
let terrain = new TmxTerrain(); let terrain = new TmxTerrain();
terrain.name = xTerrain["name"]; terrain.name = xTerrain["name"];
+42 -11
View File
@@ -112,7 +112,6 @@ module es {
continue; continue;
} }
let pos = Vector2.add(position, new Vector2(obj.x, obj.y).multiply(scale)); let pos = Vector2.add(position, new Vector2(obj.x, obj.y).multiply(scale));
switch (obj.objectType) { switch (obj.objectType) {
case TmxObjectType.basic: case TmxObjectType.basic:
@@ -133,17 +132,49 @@ module es {
break; break;
case TmxObjectType.tile: case TmxObjectType.tile:
let tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid); let tileset = objGroup.map.getTilesetForTileGid(obj.tile.gid);
let sourceRect = tileset.tileRegions[obj.tile.gid]; let sourceRect = tileset.tileRegions.get(obj.tile.gid);
pos.y -= obj.tile.tilesetTile.image.height;
if (!obj.tile.tilesetTile.image.texture) if (obj.tile.horizontalFlip && obj.tile.verticalFlip) {
container.addChild(obj.tile.tilesetTile.image.texture); pos.x += tileset.tileHeight + (sourceRect.height * scale.y - tileset.tileHeight);
obj.tile.tilesetTile.image.texture.x = pos.x; pos.y -= (sourceRect.width * scale.x - tileset.tileWidth);
obj.tile.tilesetTile.image.texture.y = pos.y; }
obj.tile.tilesetTile.image.texture.filters = []; else if (obj.tile.horizontalFlip) {
obj.tile.tilesetTile.image.texture.rotation = 0; pos.x += tileset.tileWidth + (sourceRect.height * scale.y - tileset.tileHeight);
obj.tile.tilesetTile.image.texture.scaleX = scale.x; }
obj.tile.tilesetTile.image.texture.scaleY = scale.y; 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;
}
break; break;
case TmxObjectType.ellipse: case TmxObjectType.ellipse:
pos = new Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale); pos = new Vector2(obj.x + obj.width * 0.5, obj.y + obj.height * 0.5).multiply(scale);