pixi-tiled-utils
Version:
PIXI.js Tiled utilities
171 lines (155 loc) • 3.94 kB
JavaScript
;
const PIXI = window.PIXI;
/**
* inner utils, maybe useful for you too
*/
const utils = {
/**
* get texture from tiles
* @param {number} frame
* @param {inner} tiles
* @returns PIXI.Texture
*/
getTexture(frame, tiles) {
if (tiles && typeof tiles.getFrame === "function") {
return tiles.getFrame(frame);
} else {
console.warn("! tiles not set @ getTexture");
}
return PIXI.Texture.EMPTY;
},
/**
* create sprite from frame, tileSizeConfig and tiles
* @param {number} frame
* @param {{ tilewidth, tileheight }} tileSizeConfig
* @param {inner} tiles
* @returns PIXI.Sprite | undefined
*/
createSprite(frame, { tilewidth, tileheight }, tiles = null) {
let sprite;
if (tiles) {
if (!isNaN(frame) && isFinite(frame)) {
sprite = new PIXI.Sprite(utils.getTexture(~~frame, tiles));
} else if (frame) {
sprite = PIXI.Sprite.fromFrame(frame);
}
} else {
sprite = new PIXI.Sprite();
}
if (sprite) {
sprite.width = tilewidth;
sprite.height = tileheight;
if (sprite.texture) {
sprite.texture.baseTexture.scaleMode = PIXI.SCALE_MODES.NEAREST;
}
}
return sprite;
},
/**
* works like lodash.get
* @param {any} source
* @param {string} url
* @returns any
*/
getModel(source, url) {
let cursor = source;
const propList = url.split(".");
while (cursor && propList.length) {
cursor = cursor[propList.shift()];
}
return cursor;
},
/**
* checks does array contain keys starting with value
* @param {any[]} array
* @param {any} value
* @returns boolean
*/
contains(array, value) {
return value && array.some((string) => value.startsWith(string));
},
/**
* groups objects array into object
* @param {any[]} array
* @param {string} groupName
* @returns object
*/
groupObjects(array, groupName = "group.name") {
return array
? array.reduce((groups, item) => {
const cursor = utils.getModel(item, groupName);
if (cursor) {
if (!groups[cursor]) {
groups[cursor] = [];
}
groups[cursor].push(item);
}
return groups;
}, {})
: {};
},
/**
* copies props like name, type from another object
* @param {object} target
* @param {object} source
* @param {string[]} props
* @returns void
*/
nameObject(target, source = {}, props = ["name", "type"]) {
if (!target) return;
props.forEach((prop) => {
if (source[prop] && !target[prop]) {
target[prop] = source[prop];
}
});
},
/**
* adds object to array, also names it
* @param {any} source
* @param {any[]} target
* @param {string[]} props
* @returns void
*/
pushObject(source, target, props) {
if (target.indexOf(source) !== -1) return;
if (Array.isArray(source.objects)) {
source.objects.forEach((sprite) => {
utils.nameObject(sprite, source, props);
});
}
target.push(source);
},
/**
* gets bounds of object, fast
* @param {any[]} array
* @returns object
*/
getBounds(array) {
if (Array.isArray(array) && array.length) {
let up = Infinity;
let left = Infinity;
let right = -Infinity;
let down = -Infinity;
let temp;
array.forEach((sprite) => {
const w = sprite.width;
const h = sprite.height;
if ((temp = sprite.x) < left) {
left = temp;
}
if ((temp = sprite.y) < up) {
up = temp;
}
if ((temp = sprite.x + w) > right) {
right = temp;
}
if ((temp = sprite.y + h) > down) {
down = temp;
}
});
return { up, down, left, right };
}
return { up: 0, down: 0, left: 0, right: 0 };
},
};
module.exports = utils;