227 lines
7.5 KiB
JavaScript
227 lines
7.5 KiB
JavaScript
"use strict";
|
|
cc._RF.push(module, '30e2eSQWDNKI69FbaYfN62j', 'TmoObjectGroup');
|
|
// Script/TmoObjectGroup.js
|
|
|
|
"use strict";
|
|
|
|
exports.__esModule = true;
|
|
exports["default"] = void 0;
|
|
|
|
// Learn cc.Class:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/class.html
|
|
// Learn Attribute:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
|
|
// Learn life-cycle callbacks:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
|
|
var TmoSprite = require("./TmoSprite");
|
|
|
|
var _default = cc.Class({
|
|
"extends": cc.TiledObjectGroup,
|
|
_init: function _init(groupInfo, mapInfo, texGrids, tiledMap) {
|
|
var TiledMap = cc.TiledMap;
|
|
var TMXObjectType = TiledMap.TMXObjectType;
|
|
var Orientation = TiledMap.Orientation;
|
|
var StaggerAxis = TiledMap.StaggerAxis;
|
|
var TileFlag = TiledMap.TileFlag;
|
|
var FLIPPED_MASK = TileFlag.FLIPPED_MASK;
|
|
var FLAG_HORIZONTAL = TileFlag.HORIZONTAL;
|
|
var FLAG_VERTICAL = TileFlag.VERTICAL;
|
|
this._groupName = groupInfo.name;
|
|
this._positionOffset = groupInfo.offset;
|
|
this._mapInfo = mapInfo;
|
|
this._properties = groupInfo.getProperties();
|
|
this._offset = cc.v2(groupInfo.offset.x, -groupInfo.offset.y);
|
|
this._opacity = groupInfo._opacity;
|
|
var mapSize = mapInfo._mapSize;
|
|
var tileSize = mapInfo._tileSize;
|
|
var width = 0,
|
|
height = 0;
|
|
|
|
if (mapInfo.orientation === Orientation.HEX) {
|
|
if (mapInfo.getStaggerAxis() === StaggerAxis.STAGGERAXIS_X) {
|
|
height = tileSize.height * (mapSize.height + 0.5);
|
|
width = (tileSize.width + mapInfo.getHexSideLength()) * Math.floor(mapSize.width / 2) + tileSize.width * (mapSize.width % 2);
|
|
} else {
|
|
width = tileSize.width * (mapSize.width + 0.5);
|
|
height = (tileSize.height + mapInfo.getHexSideLength()) * Math.floor(mapSize.height / 2) + tileSize.height * (mapSize.height % 2);
|
|
}
|
|
} else if (mapInfo.orientation === Orientation.ISO) {
|
|
var wh = mapSize.width + mapSize.height;
|
|
width = tileSize.width * 0.5 * wh;
|
|
height = tileSize.height * 0.5 * wh;
|
|
} else {
|
|
width = mapSize.width * tileSize.width;
|
|
height = mapSize.height * tileSize.height;
|
|
}
|
|
|
|
this.node.setContentSize(width, height);
|
|
var leftTopX = width * this.node.anchorX;
|
|
var leftTopY = height * (1 - this.node.anchorY);
|
|
var objects = groupInfo._objects;
|
|
var aliveNodes = {}; // 生成映射Map { Texture2D: textureIndex }
|
|
|
|
var textureIndexMap = new Map();
|
|
var objectTextures = tiledMap.getObjectTextures();
|
|
objectTextures.forEach(function (texture, idx) {
|
|
return textureIndexMap.set(texture, idx);
|
|
});
|
|
|
|
for (var i = 0, l = objects.length; i < l; i++) {
|
|
var object = objects[i];
|
|
var objType = object.type;
|
|
object.offset = cc.v2(object.x, object.y);
|
|
var points = object.points || object.polylinePoints;
|
|
|
|
if (points) {
|
|
for (var pi = 0; pi < points.length; pi++) {
|
|
points[pi].y *= -1;
|
|
}
|
|
}
|
|
|
|
if (Orientation.ISO !== mapInfo.orientation) {
|
|
object.y = height - object.y;
|
|
} else {
|
|
var posIdxX = object.x / tileSize.height;
|
|
var posIdxY = object.y / tileSize.height;
|
|
object.x = tileSize.width * 0.5 * (mapSize.height + posIdxX - posIdxY);
|
|
object.y = tileSize.height * 0.5 * (mapSize.width + mapSize.height - posIdxX - posIdxY);
|
|
}
|
|
|
|
if (objType === TMXObjectType.TEXT) {
|
|
var textName = "text" + object.id;
|
|
aliveNodes[textName] = true;
|
|
var textNode = this.node.getChildByName(textName);
|
|
|
|
if (!textNode) {
|
|
textNode = new cc.Node();
|
|
}
|
|
|
|
textNode.active = object.visible;
|
|
textNode.anchorX = 0;
|
|
textNode.anchorY = 1;
|
|
textNode.angle = -object.rotation;
|
|
textNode.x = object.x - leftTopX;
|
|
textNode.y = object.y - leftTopY;
|
|
textNode.name = textName;
|
|
textNode.parent = this.node;
|
|
textNode.color = object.color;
|
|
textNode.opacity = this._opacity;
|
|
textNode.setSiblingIndex(i);
|
|
var label = textNode.getComponent(cc.Label);
|
|
|
|
if (!label) {
|
|
label = textNode.addComponent(cc.Label);
|
|
}
|
|
|
|
label.overflow = cc.Label.Overflow.SHRINK;
|
|
label.lineHeight = object.height;
|
|
label.string = object.text;
|
|
label.horizontalAlign = object.halign;
|
|
label.verticalAlign = object.valign;
|
|
label.fontSize = object.pixelsize;
|
|
textNode.width = object.width;
|
|
textNode.height = object.height;
|
|
}
|
|
|
|
if (objType === TMXObjectType.IMAGE) {
|
|
var gid = object.gid;
|
|
var grid = texGrids[(gid & FLIPPED_MASK) >>> 0];
|
|
if (!grid) continue;
|
|
var tileset = grid.tileset;
|
|
var imgName = "img" + object.id;
|
|
aliveNodes[imgName] = true;
|
|
var imgNode = this.node.getChildByName(imgName);
|
|
var imgWidth = object.width || grid.width;
|
|
var imgHeight = object.height || grid.height;
|
|
var tileOffsetX = tileset.tileOffset.x;
|
|
var tileOffsetY = tileset.tileOffset.y; // Delete image nodes implemented as private nodes
|
|
// Use cc.Node to implement node-level requirements
|
|
|
|
if (imgNode instanceof cc.PrivateNode) {
|
|
imgNode.removeFromParent();
|
|
imgNode.destroy();
|
|
imgNode = null;
|
|
}
|
|
|
|
if (!imgNode) {
|
|
imgNode = new cc.Node();
|
|
}
|
|
|
|
if (Orientation.ISO == mapInfo.orientation) {
|
|
imgNode.anchorX = 0.5 + tileOffsetX / imgWidth;
|
|
imgNode.anchorY = tileOffsetY / imgHeight;
|
|
} else {
|
|
imgNode.anchorX = tileOffsetX / imgWidth;
|
|
imgNode.anchorY = tileOffsetY / imgHeight;
|
|
}
|
|
|
|
imgNode.active = object.visible;
|
|
imgNode.angle = -object.rotation;
|
|
imgNode.x = object.x - leftTopX;
|
|
imgNode.y = object.y - leftTopY;
|
|
imgNode.name = imgName;
|
|
imgNode.parent = this.node;
|
|
imgNode.opacity = this._opacity;
|
|
imgNode.setSiblingIndex(i);
|
|
imgNode._tiledMap = tiledMap;
|
|
var sp = imgNode.getComponent(TmoSprite);
|
|
|
|
if (!sp) {
|
|
sp = imgNode.addComponent(TmoSprite);
|
|
}
|
|
|
|
var spf = sp.spriteFrame;
|
|
|
|
if (!spf) {
|
|
spf = new cc.SpriteFrame();
|
|
}
|
|
|
|
if ((gid & FLAG_HORIZONTAL) >>> 0) {
|
|
spf.setFlipX(true);
|
|
} else {
|
|
spf.setFlipX(false);
|
|
}
|
|
|
|
if ((gid & FLAG_VERTICAL) >>> 0) {
|
|
spf.setFlipY(true);
|
|
} else {
|
|
spf.setFlipY(false);
|
|
}
|
|
|
|
var sourceImage = grid.tileset.sourceImage;
|
|
spf.setTexture(sourceImage, cc.rect(grid));
|
|
sp.spriteFrame = spf;
|
|
sp.setVertsDirty(); // object group may has no width or height info
|
|
|
|
imgNode.width = imgWidth;
|
|
imgNode.height = imgHeight; // 收集图集 更新textureIndexMap
|
|
|
|
if (!textureIndexMap.has(sourceImage)) {
|
|
textureIndexMap.set(sourceImage, objectTextures.length);
|
|
objectTextures.push(sourceImage);
|
|
} // 设置textureIndex
|
|
|
|
|
|
var textureIndex = textureIndexMap.get(sourceImage);
|
|
sp.setTextureIdx(textureIndex + 1);
|
|
}
|
|
}
|
|
|
|
this._objects = objects; // destroy useless node
|
|
|
|
var children = this.node.children;
|
|
var uselessExp = /^(?:img|text)\d+$/;
|
|
|
|
for (var _i = 0, n = children.length; _i < n; _i++) {
|
|
var c = children[_i];
|
|
var cName = c._name;
|
|
var isUseless = uselessExp.test(cName);
|
|
if (isUseless && !aliveNodes[cName]) c.destroy();
|
|
}
|
|
}
|
|
});
|
|
|
|
exports["default"] = _default;
|
|
module.exports = exports["default"];
|
|
|
|
cc._RF.pop(); |