UNPKG

tinyjs-plugin-ninepatch

Version:
2,104 lines (1,823 loc) 1.03 MB
/*! * Name: tiny * Description: The Tiny engine is an HTML5 game engine designed to be lightweight and concise JavaScript-friendly syntax, it will only for mobile. * Author: yiqi * Version: v1.0.1 */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["Tiny"] = factory(); else root["Tiny"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/dist"; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 147); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * String of the current Tiny version. * * @static * @constant * @memberof Tiny * @name VERSION * @type {string} */ var VERSION = exports.VERSION = '1.0.1'; /** * Math.PI * 2 * * @static * @constant * @memberof Tiny * @name PI_2 * @type {number} */ var PI_2 = exports.PI_2 = Math.PI * 2; /** * Constant conversion factor for converting radians to degrees * * @static * @constant * @memberof Tiny * @name RAD_TO_DEG * @type {number} */ var RAD_TO_DEG = exports.RAD_TO_DEG = 180 / Math.PI; /** * Constant conversion factor for converting degrees to radians * * @static * @constant * @memberof Tiny * @name DEG_TO_RAD * @type {number} */ var DEG_TO_RAD = exports.DEG_TO_RAD = Math.PI / 180; /** * Constant to identify the Renderer Type. * * @static * @constant * @memberof Tiny * @name RENDERER_TYPE * @type {object} * @property {number} UNKNOWN - Unknown render type. * @property {number} WEBGL - WebGL render type. * @property {number} CANVAS - Canvas render type. */ var RENDERER_TYPE = exports.RENDERER_TYPE = { UNKNOWN: 0, WEBGL: 1, CANVAS: 2 }; /** * Various blend modes supported. * <br> * IMPORTANT - The WebGL renderer only supports the NORMAL, ADD, MULTIPLY and SCREEN blend modes. * Anything else will silently act like NORMAL. * * @static * @constant * @memberof Tiny * @name BLEND_MODES * @type {object} * @property {number} NORMAL * @property {number} ADD * @property {number} MULTIPLY * @property {number} SCREEN * @property {number} OVERLAY * @property {number} DARKEN * @property {number} LIGHTEN * @property {number} COLOR_DODGE * @property {number} COLOR_BURN * @property {number} HARD_LIGHT * @property {number} SOFT_LIGHT * @property {number} DIFFERENCE * @property {number} EXCLUSION * @property {number} HUE * @property {number} SATURATION * @property {number} COLOR * @property {number} LUMINOSITY */ var BLEND_MODES = exports.BLEND_MODES = { NORMAL: 0, ADD: 1, MULTIPLY: 2, SCREEN: 3, OVERLAY: 4, DARKEN: 5, LIGHTEN: 6, COLOR_DODGE: 7, COLOR_BURN: 8, HARD_LIGHT: 9, SOFT_LIGHT: 10, DIFFERENCE: 11, EXCLUSION: 12, HUE: 13, SATURATION: 14, COLOR: 15, LUMINOSITY: 16 }; /** * Various webgl draw modes. These can be used to specify which GL drawMode to use * under certain situations and renderers. * * @static * @constant * @memberof Tiny * @name DRAW_MODES * @type {object} * @property {number} POINTS * @property {number} LINES * @property {number} LINE_LOOP * @property {number} LINE_STRIP * @property {number} TRIANGLES * @property {number} TRIANGLE_STRIP * @property {number} TRIANGLE_FAN */ var DRAW_MODES = exports.DRAW_MODES = { POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6 }; /** * The scale modes that are supported. * * The {@link Tiny.settings.SCALE_MODE} scale mode affects the default scaling mode of future operations. * It can be re-assigned to either LINEAR or NEAREST, depending upon suitability. * * @static * @constant * @memberof Tiny * @name SCALE_MODES * @type {object} * @property {number} LINEAR Smooth scaling * @property {number} NEAREST Pixelating scaling */ var SCALE_MODES = exports.SCALE_MODES = { LINEAR: 0, NEAREST: 1 }; /** * The wrap modes that are supported. * * The {@link Tiny.settings.WRAP_MODE} wrap mode affects the default wraping mode of future operations. * It can be re-assigned to either CLAMP or REPEAT, depending upon suitability. * If the texture is non power of two then clamp will be used regardless as webGL can * only use REPEAT if the texture is po2. * * This property only affects WebGL. * * @static * @constant * @name WRAP_MODES * @memberof Tiny * @type {object} * @property {number} CLAMP - The textures uvs are clamped * @property {number} REPEAT - The texture uvs tile and repeat * @property {number} MIRRORED_REPEAT - The texture uvs tile and repeat with mirroring */ var WRAP_MODES = exports.WRAP_MODES = { CLAMP: 0, REPEAT: 1, MIRRORED_REPEAT: 2 }; /** * The gc modes that are supported by Tiny. * * The {@link Tiny.settings.GC_MODE} Garbage Collection mode for Tiny textures is AUTO * If set to GC_MODE, the renderer will occasianally check textures usage. If they are not * used for a specified period of time they will be removed from the GPU. They will of course * be uploaded again when they are required. This is a silent behind the scenes process that * should ensure that the GPU does not get filled up. * * Handy for mobile devices! * This property only affects WebGL. * * @static * @constant * @name GC_MODES * @memberof Tiny * @type {object} * @property {number} AUTO - Garbage collection will happen periodically automatically * @property {number} MANUAL - Garbage collection will need to be called manually */ var GC_MODES = exports.GC_MODES = { AUTO: 0, MANUAL: 1 }; /** * Regexp for image type by extension. * * @static * @constant * @memberof Tiny * @type {RegExp|string} * @example `image.png` */ var URL_FILE_EXTENSION = exports.URL_FILE_EXTENSION = /\.(\w{3,4})(?:$|\?|#)/i; /** * Regexp for data URI. * Based on: {@link https://github.com/ragingwind/data-uri-regex} * * @static * @constant * @name DATA_URI * @memberof Tiny * @type {RegExp|string} * @example data:image/png;base64 */ var DATA_URI = exports.DATA_URI = /^\s*data:(?:([\w-]+)\/([\w+.-]+))?(?:;(charset=[\w-]+|base64))?,(.*)/i; /** * Regexp for SVG size. * * @static * @constant * @name SVG_SIZE * @memberof Tiny * @type {RegExp|string} * @example &lt;svg width="100" height="100"&gt;&lt;/svg&gt; */ var SVG_SIZE = exports.SVG_SIZE = /<svg[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i; /** * Constants that identify shapes, mainly to prevent `instanceof` calls. * * @static * @constant * @name SHAPES * @memberof Tiny * @type {object} * @property {number} POLY Polygon * @property {number} RECT Rectangle * @property {number} CIRC Circle * @property {number} ELIP Ellipse * @property {number} RREC Rounded Rectangle */ var SHAPES = exports.SHAPES = { POLY: 0, RECT: 1, CIRC: 2, ELIP: 3, RREC: 4 }; /** * Constants that specify float precision in shaders. * * @static * @constant * @name PRECISION * @memberof Tiny * @type {object} * @property {string} LOW='lowp' * @property {string} MEDIUM='mediump' * @property {string} HIGH='highp' */ var PRECISION = exports.PRECISION = { LOW: 'lowp', MEDIUM: 'mediump', HIGH: 'highp' }; /** * Constants that specify the transform type. * * @static * @constant * @name TRANSFORM_MODE * @memberof Tiny * @type {object} * @property {number} STATIC * @property {number} DYNAMIC */ var TRANSFORM_MODE = exports.TRANSFORM_MODE = { STATIC: 0, DYNAMIC: 1 }; /** * Constants that define the type of gradient on text. * * @static * @constant * @name TEXT_GRADIENT * @memberof Tiny * @type {object} * @property {number} LINEAR_VERTICAL Vertical gradient * @property {number} LINEAR_HORIZONTAL Linear gradient */ var TEXT_GRADIENT = exports.TEXT_GRADIENT = { LINEAR_VERTICAL: 0, LINEAR_HORIZONTAL: 1 }; /** * Represents the update priorities used by internal Tiny classes when registered with * the {@link Tiny.ticker.Ticker} object. Higher priority items are updated first and lower * priority items, such as render, should go later. * * @static * @constant * @name UPDATE_PRIORITY * @memberof Tiny * @type {object} * @property {number} INTERACTION=50 Highest priority, used for {@link Tiny.interaction.InteractionManager} * @property {number} HIGH=25 High priority updating, {@link Tiny.VideoBaseTexture} and {@link Tiny.AnimatedSprite} * @property {number} NORMAL=0 Default priority for ticker events, see {@link Tiny.ticker.Ticker#add}. * @property {number} LOW=-25 Low priority used for {@link Tiny.Application} rendering. * @property {number} UTILITY=-50 Lowest priority used for {@link Tiny.prepare.BasePrepare} utility. */ var UPDATE_PRIORITY = exports.UPDATE_PRIORITY = { INTERACTION: 50, HIGH: 25, NORMAL: 0, LOW: -25, UTILITY: -50 }; /** * 主界面尺寸 * * @static * @constant * @name WIN_SIZE * @memberof Tiny * @type {object} * @property {number} width 宽 * @property {number} height 高 */ var WIN_SIZE = exports.WIN_SIZE = { width: 0, height: 0 }; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseTextureCache = exports.TextureCache = exports.isArray = exports.mixins = exports.pluginTarget = exports.EventEmitter = exports.removeItems = exports.isMobile = exports.TWEEN = undefined; var _decide = __webpack_require__(126); Object.keys(_decide).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _decide[key]; } }); }); exports.uid = uid; exports.isFunction = isFunction; exports.isNumber = isNumber; exports.isString = isString; exports.isUndefined = isUndefined; exports.isObject = isObject; exports.getTime = getTime; exports.random = random; exports.randomInt = randomInt; exports.randomFloat = randomFloat; exports.randomBool = randomBool; exports.randomPM = randomPM; exports.randomFromArray = randomFromArray; exports.hex2rgb = hex2rgb; exports.hex2string = hex2string; exports.rgb2hex = rgb2hex; exports.deg2radian = deg2radian; exports.radian2deg = radian2deg; exports.getXMLHttpRequest = getXMLHttpRequest; exports.getResolutionOfUrl = getResolutionOfUrl; exports.decomposeDataUri = decomposeDataUri; exports.getUrlFileExtension = getUrlFileExtension; exports.getSvgSize = getSvgSize; exports.isWebGLSupported = isWebGLSupported; exports.sign = sign; exports.arrayRemoveObject = arrayRemoveObject; exports.detect = detect; exports.point = point; exports.scale = scale; exports.color = color; exports.destroyTextureCache = destroyTextureCache; exports.clearTextureCache = clearTextureCache; var _const = __webpack_require__(0); var _settings = __webpack_require__(3); var _settings2 = _interopRequireDefault(_settings); var _eventemitter = __webpack_require__(6); var _eventemitter2 = _interopRequireDefault(_eventemitter); var _tween = __webpack_require__(20); var _tween2 = _interopRequireDefault(_tween); var _pluginTarget = __webpack_require__(130); var _pluginTarget2 = _interopRequireDefault(_pluginTarget); var _mixin = __webpack_require__(129); var mixins = _interopRequireWildcard(_mixin); var _ismobilejs = __webpack_require__(17); var isMobile = _interopRequireWildcard(_ismobilejs); var _removeArrayItems = __webpack_require__(76); var _removeArrayItems2 = _interopRequireDefault(_removeArrayItems); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var nextUid = 0; exports.TWEEN = _tween2.default; exports.isMobile = isMobile; exports.removeItems = _removeArrayItems2.default; exports.EventEmitter = _eventemitter2.default; exports.pluginTarget = _pluginTarget2.default; exports.mixins = mixins; /** * Gets the next unique identifier * * @static * @memberof Tiny * @function uid * @return {number} The next unique identifier to use. */ function uid() { return ++nextUid; } /** * 判断对象是否是`Array`类型 * * @static * @memberof Tiny * @function isArray * @param {Object} obj 要判断的对象 * @return {Boolean} */ var isArray = exports.isArray = Array.isArray || function (obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }; /** * 判断对象是否是函数类型 * * @static * @memberof Tiny * @function isFunction * @param {Object} obj 要判断的对象 * @return {Boolean} */ function isFunction(obj) { return Object.prototype.toString.call(obj) === '[object Function]'; } /** * 判断对象是否是`Number`类型 * * @static * @memberof Tiny * @function isNumber * @param {Object} obj 要判断的对象 * @return {Boolean} */ function isNumber(obj) { return Object.prototype.toString.call(obj) === '[object Number]'; } /** * 判断对象是否是`String`类型 * * @static * @memberof Tiny * @function isString * @param {Object} obj 要判断的对象 * @return {Boolean} */ function isString(obj) { return typeof obj === 'string'; } /** * 判断对象是否是`Undefined`类型 * * @static * @memberof Tiny * @function isUndefined * @param obj * @return {boolean} */ function isUndefined(obj) { return obj === void 0; } /** * 判断对象是否是`Object`类型 * * @static * @memberof Tiny * @function isObject * @param {Object} obj 要判断的对象 * @return {boolean} */ function isObject(obj) { return Object.prototype.toString.call(obj) === '[object Object]'; } /** * 高精度获取当前时间,比 `Date.now()` 的精度高1000倍,为考虑不同性能场景下的时间获取,建议使用此方法来替代 `Date.now()`。 * * @static * @memberof Tiny * @function getTime * @return {number} */ function getTime() { return window.performance.timing.navigationStart + window.performance.now(); } /** * 生成数字区间内的随机整型数据 * * @example * * ``` js * Tiny.random(10, 18); * //=> 15 * ``` * * @static * @memberof Tiny * @function random * @param min * @param max * @return {number} */ function random(min, max) { if (isArray(min)) { max = min[1]; min = min[0]; } return Math.floor(Math.random() * (max - min + 1)) + min; } /** * `Tiny.random` 的别名 * * @static * @memberof Tiny * @function randomInt * @return {boolean} */ function randomInt() { return random.call.apply(random, [this].concat(Array.prototype.slice.call(arguments))); } /** * 返回区间内的随机浮点类型数字 * * @static * @memberof Tiny * @function randomFloat * @param min * @param max * @return {number} */ function randomFloat(min, max) { return min + Math.random() * (max - min); } /** * 生成随机的`Boolean`类型数据 * * @static * @memberof Tiny * @function randomBool * @param {number} chance 生成 true 的几率,默认值:0.5 * @return {boolean} */ function randomBool(chance) { chance = chance ? chance : 0.5; // eslint-disable-line return Math.random() < chance; } /** * 随机生成 {-1, 1} 两个值 * * @example * * ``` js * Tiny.randomPM(0.8); * //=> -1 * ``` * * @static * @memberof Tiny * @function randomPM * @param {number} chance 生成 -1 的几率,默认值:0.5 * @return {number} */ function randomPM(chance) { chance = chance ? chance : 0.5; // eslint-disable-line return Math.random() > chance ? -1 : 1; } /** * 随机返回数组中的任意对象 * * @memberof Tiny * @function randomFromArray * @param {array<object>} arr * @return {object} */ function randomFromArray(arr) { return arr[random(0, arr.length - 1)]; } /** * Converts a hex color number to an [R, G, B] array * * @memberof Tiny * @function hex2rgb * @param {number} hex - The number to convert * @param {number[]} [out=[]] If supplied, this array will be used rather than returning a new one * @return {number[]} An array representing the [R, G, B] of the color. */ function hex2rgb(hex, out) { out = out || []; out[0] = (hex >> 16 & 0xFF) / 255; out[1] = (hex >> 8 & 0xFF) / 255; out[2] = (hex & 0xFF) / 255; return out; } /** * Converts a hex color number to a string. * * @memberof Tiny * @function hex2string * @param {number} hex - Number in hex * @return {string} The string color. */ function hex2string(hex) { hex = hex.toString(16); hex = '000000'.substr(0, 6 - hex.length) + hex; return '#' + hex; } /** * Converts a color as an [R, G, B] array to a hex number * * @memberof Tiny * @function rgb2hex * @param {number[]} rgb - rgb array * @return {number} The color number */ function rgb2hex(rgb) { return (rgb[0] * 255 << 16) + (rgb[1] * 255 << 8) + (rgb[2] * 255 | 0); } /** * 角度值转弧度 * * @memberof Tiny * @function deg2radian * @param deg * @return {number} */ function deg2radian(deg) { return _const.PI_2 * deg / 360; } /** * 弧度值转角度 * * @memberof Tiny * @function radian2deg * @param radian * @return {number} */ function radian2deg(radian) { return 360 * radian / _const.PI_2; } /** * 获取 XMLHttpRequest 对象,如果 Tiny._XMLHttpRequest 存在,则取之,如果没有,则创建一个 XMLHttpRequest 对象,并存之。 * 如果 Tiny._XMLHttpRequest 正在使用中,则返回一个新建的 XMLHttpRequest * * @static * @return {XMLHttpRequest} */ function getXMLHttpRequest() { var xhr = this._XMLHttpRequest; if (!xhr) { xhr = new XMLHttpRequest(); this._XMLHttpRequest = xhr; } else { if (+xhr.readyState !== 4) { return new XMLHttpRequest(); } } return xhr; } /** * get the resolution / device pixel ratio of an asset by looking for the prefix * used by spritesheets and image urls * * @memberof Tiny * @function getResolutionOfUrl * @param {string} url - the image path * @param {number} [defaultValue=1] - the defaultValue if no filename prefix is set. * @return {number} resolution / device pixel ratio of an asset */ function getResolutionOfUrl(url, defaultValue) { var resolution = _settings2.default.RETINA_PREFIX.exec(url); if (resolution) { return parseFloat(resolution[1]); } return defaultValue !== undefined ? defaultValue : 1; } /** * Typedef for decomposeDataUri return object. * * @typedef {object} DecomposedDataUri * @property {mediaType} Media type, eg. `image` * @property {subType} Sub type, eg. `png` * @property {encoding} Data encoding, eg. `base64` * @property {data} The actual data */ /** * Split a data URI into components. Returns undefined if parameter `dataUri` is not a valid data URI. * * @memberof Tiny * @function decomposeDataUri * @param {string} dataUri - the data URI to check * @return {DecomposedDataUri|undefined} The decomposed data uri or undefined */ function decomposeDataUri(dataUri) { var dataUriMatch = _const.DATA_URI.exec(dataUri); if (dataUriMatch) { return { mediaType: dataUriMatch[1] ? dataUriMatch[1].toLowerCase() : undefined, subType: dataUriMatch[2] ? dataUriMatch[2].toLowerCase() : undefined, encoding: dataUriMatch[3] ? dataUriMatch[3].toLowerCase() : undefined, data: dataUriMatch[4] }; } return undefined; } /** * Get type of the image by regexp for extension. Returns undefined for unknown extensions. * * @memberof Tiny * @function getUrlFileExtension * @param {string} url - the image path * @return {string|undefined} image extension */ function getUrlFileExtension(url) { var extension = _const.URL_FILE_EXTENSION.exec(url); if (extension) { return extension[1].toLowerCase(); } return undefined; } /** * Typedef for Size object. * * @typedef {object} Size * @property {width} Width component * @property {height} Height component */ /** * Get size from an svg string using regexp. * * @memberof Tiny * @function getSvgSize * @param {string} svgString - a serialized svg element * @return {Size|undefined} image extension */ function getSvgSize(svgString) { var sizeMatch = _const.SVG_SIZE.exec(svgString); var size = {}; if (sizeMatch) { size[sizeMatch[1]] = Math.round(parseFloat(sizeMatch[3])); size[sizeMatch[5]] = Math.round(parseFloat(sizeMatch[7])); } return size; } /** * Helper for checking for webgl support * * @memberof Tiny * @function isWebGLSupported * @return {boolean} is webgl supported */ function isWebGLSupported() { var contextOptions = { stencil: true, failIfMajorPerformanceCaveat: true }; try { if (!window.WebGLRenderingContext) { return false; } var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl', contextOptions) || canvas.getContext('experimental-webgl', contextOptions); var success = !!(gl && gl.getContextAttributes().stencil); if (gl) { var loseContext = gl.getExtension('WEBGL_lose_context'); if (loseContext) { loseContext.loseContext(); } } gl = null; return success; } catch (e) { return false; } } /** * Returns sign of number * * @memberof Tiny * @function sign * @param {number} n - the number to check the sign of * @return {number} 0 if `n` is 0, -1 if `n` is negative, 1 if `n` is positive */ function sign(n) { if (n === 0) return 0; return n < 0 ? -1 : 1; } /** * 从数组中移除某个对象 * * @memberof Tiny * @function arrayRemoveObject * @param {array<object>} arr * @param {object} delObj */ function arrayRemoveObject(arr, delObj) { for (var i = 0, l = arr.length; i < l; i++) { if (arr[i] === delObj) { arr.splice(i, 1); break; } } } /** * Looks through each value in the list, returning the first one that passes a truth test (**predicate**), or `undefined` if no value passes the test. The function returns as soon as it finds an acceptable element, and doesn't traverse the entire list. * * @example * * ``` js * var even = Tiny.detect([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); * //=> 2 * ``` * * @static * @memberof Tiny * @function detect * @param {object} obj * @param {function} iterator * @param {object} context * @param arg1 * @param arg2 * @return {boolean} */ function detect(obj, iterator, context, arg1, arg2) { var result = void 0; if (obj === null) { return; } if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { result = iterator.call(context, obj[i], i, arg1, arg2); if (result) { return result; } } return false; } else { for (var key in obj) { result = iterator.call(context, obj[key], key, arg1, arg2); if (result) { return result; } } return false; } } /** * 转化坐标值 * * @example * * ``` js * Tiny.point(100, 200); * //=> {x: 100, y: 200} * ``` * * @static * @memberof Tiny * @function point * @param {number} x * @param {number} y - 如果不传,则等于 x * @return {object} */ function point(x, y) { return { x: x, // eslint-disable-line y: y === void 0 ? x : y }; } /** * 转化缩放值 * * @example * * ```js * Tiny.scale(2, 1.5); * //=> {scaleX: 2, scaleY: 1.5} * ``` * * @memberof Tiny * @function scale * @param {number} x * @param {number} y - 如果不传,则等于 x * @return {object} */ function scale(x, y) { return { scaleX: x, scaleY: y === void 0 ? x : y }; } /** * 转化RGB颜色值 * * @example * * ``` js * Tiny.color(0, 255, 255); * //=> {r: 0, g: 255, b: 255} * ``` * * @param {number} red * @param {number} green * @param {number} blue * @param {number} alpha * @returns {object} */ function color(red, green, blue, alpha) { return { r: Tiny.isUndefined(red) ? 255 : red, g: Tiny.isUndefined(green) ? 255 : green, b: Tiny.isUndefined(blue) ? 255 : blue, a: Tiny.isUndefined(alpha) ? 1 : alpha }; } /** * texture 缓存,用于存储已加载的图片 texture * * @name TextureCache * @memberof Tiny * @type {object} * @private */ var TextureCache = exports.TextureCache = Object.create(null); /** * * @name BaseTextureCache * @memberof Tiny * @type {object} * @private */ var BaseTextureCache = exports.BaseTextureCache = Object.create(null); /** * Destroys all texture in the cache * * @static * @memberof Tiny * @function destroyTextureCache */ function destroyTextureCache() { var key = void 0; for (key in TextureCache) { TextureCache[key].destroy(); } for (key in BaseTextureCache) { BaseTextureCache[key].destroy(); } } /** * Removes all textures from cache, but does not destroy them * * @static * @memberof Tiny * @function clearTextureCache */ function clearTextureCache() { var key = void 0; for (key in TextureCache) { delete TextureCache[key]; } for (key in BaseTextureCache) { delete BaseTextureCache[key]; } } /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _Point = __webpack_require__(24); Object.defineProperty(exports, 'Point', { enumerable: true, get: function get() { return _interopRequireDefault(_Point).default; } }); var _ObservablePoint = __webpack_require__(98); Object.defineProperty(exports, 'ObservablePoint', { enumerable: true, get: function get() { return _interopRequireDefault(_ObservablePoint).default; } }); var _Matrix = __webpack_require__(50); Object.defineProperty(exports, 'Matrix', { enumerable: true, get: function get() { return _interopRequireDefault(_Matrix).default; } }); var _GroupD = __webpack_require__(49); Object.defineProperty(exports, 'GroupD8', { enumerable: true, get: function get() { return _interopRequireDefault(_GroupD).default; } }); var _Circle = __webpack_require__(99); Object.defineProperty(exports, 'Circle', { enumerable: true, get: function get() { return _interopRequireDefault(_Circle).default; } }); var _Ellipse = __webpack_require__(100); Object.defineProperty(exports, 'Ellipse', { enumerable: true, get: function get() { return _interopRequireDefault(_Ellipse).default; } }); var _Polygon = __webpack_require__(101); Object.defineProperty(exports, 'Polygon', { enumerable: true, get: function get() { return _interopRequireDefault(_Polygon).default; } }); var _Rectangle = __webpack_require__(25); Object.defineProperty(exports, 'Rectangle', { enumerable: true, get: function get() { return _interopRequireDefault(_Rectangle).default; } }); var _RoundedRectangle = __webpack_require__(102); Object.defineProperty(exports, 'RoundedRectangle', { enumerable: true, get: function get() { return _interopRequireDefault(_RoundedRectangle).default; } }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.config = undefined; var _maxRecommendedTextures = __webpack_require__(128); var _maxRecommendedTextures2 = _interopRequireDefault(_maxRecommendedTextures); var _canUploadSameBuffer = __webpack_require__(125); var _canUploadSameBuffer2 = _interopRequireDefault(_canUploadSameBuffer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * User's customizable globals for overriding the default Tiny settings, such * as a renderer's default resolution, framerate, float percision, etc. * * @example * // Disable interpolation when scaling, will make texture be pixelated * Tiny.settings.SCALE_MODE = Tiny.SCALE_MODES.NEAREST; * @namespace Tiny.settings */ exports.default = { /** * Target frames per millisecond. * * @static * @memberof Tiny.settings * @type {number} * @default 0.06 */ TARGET_FPMS: 0.06, /** * If set to true WebGL will attempt make textures mimpaped by default. * Mipmapping will only succeed if the base texture uploaded has power of two dimensions. * * @static * @memberof Tiny.settings * @type {boolean} * @default true */ MIPMAP_TEXTURES: true, /** * Default resolution / device pixel ratio of the renderer. * * @static * @memberof Tiny.settings * @type {number} * @default 1 */ RESOLUTION: 1, /** * The maximum textures that this device supports. * * @static * @memberof Tiny.settings * @type {number} * @default 32 */ SPRITE_MAX_TEXTURES: (0, _maxRecommendedTextures2.default)(32), /** * The default sprite batch size. * * The default aims to balance desktop and mobile devices. * * @static * @memberof Tiny.settings * @type {number} * @default 4096 */ SPRITE_BATCH_SIZE: 4096, /** * The prefix that denotes a URL is for a retina asset. * * @static * @memberof Tiny.settings * @type {RegExp|string} * @type {RegExp} * @example `@2x` * @default /@([0-9\.]+)x/ */ RETINA_PREFIX: /@([0-9\.]+)x/, // eslint-disable-line /** * 默认渲染参数 * * @static * @constant * @memberof Tiny.settings * @type {object} * @property {boolean} antialias=false * @property {boolean} transparent=false * @property {number} backgroundColor=0x000000 * @property {boolean} clearBeforeRender=true * @property {boolean} preserveDrawingBuffer=false * @property {boolean} roundPixels=false * @property {boolean} legacy=false */ RENDER_OPTIONS: { view: null, antialias: false, autoResize: false, transparent: false, backgroundColor: 0x000000, clearBeforeRender: true, preserveDrawingBuffer: false, roundPixels: false, legacy: false }, /** * Default transform type. * * @static * @memberof Tiny.settings * @type {Tiny.TRANSFORM_MODE} * @default Tiny.TRANSFORM_MODE.STATIC */ TRANSFORM_MODE: 0, /** * Default Garbage Collection mode. * * @static * @memberof Tiny.settings * @type {Tiny.GC_MODES} * @default Tiny.GC_MODES.AUTO */ GC_MODE: 0, /** * Default Garbage Collection max idle. * * @static * @memberof Tiny.settings * @type {number} * @default 3600 */ GC_MAX_IDLE: 60 * 60, /** * Default Garbage Collection maximum check count. * * @static * @memberof Tiny.settings * @type {number} * @default 600 */ GC_MAX_CHECK_COUNT: 60 * 10, /** * Default wrap modes that are supported by Tiny. * * @static * @memberof Tiny.settings * @type {Tiny.WRAP_MODES} * @default Tiny.WRAP_MODES.CLAMP */ WRAP_MODE: 0, /** * The scale modes that are supported by Tiny. * * @static * @memberof Tiny.settings * @type {Tiny.SCALE_MODES} * @default Tiny.SCALE_MODES.LINEAR */ SCALE_MODE: 0, /** * Default specify float precision in vertex shader. * * @static * @memberof Tiny.settings * @type {Tiny.PRECISION} * @default Tiny.PRECISION.HIGH */ PRECISION_VERTEX: 'highp', /** * Default specify float precision in shaders. * * @static * @memberof Tiny.settings * @type {Tiny.PRECISION} * @default Tiny.PRECISION.MEDIUM */ PRECISION_FRAGMENT: 'mediump', /** * Can we upload the same buffer in a single frame? * * @static * @constant * @memberof Tiny.settings * @type {boolean} */ CAN_UPLOAD_SAME_BUFFER: (0, _canUploadSameBuffer2.default)() }; /** * 默认配置参数 * * @static * @constant * @name config * @memberof Tiny * @type {object} * @property {number} width=320 宽度 * @property {number} height=568 高度 ['480', '568'] * @property {string} canvasId='TinyCanvas' canvas的DOM * @property {boolean} fullScreen=true 是否全屏 * @property {number} dpi=1 分辨率 * @property {boolean} showFPS=false 是否显示帧频 * @property {number} renderType=0 渲染类型 [0: 自动识别, 1: WEBGL, 2: CANVAS] * @property {object} renderOptions 渲染参数,见{@link Tiny.settings.RENDER_OPTIONS} * @property {number} autoRender=1 是否自动渲染 [0: 手动, 1: 自动] */ var config = exports.config = { width: 320, height: 568, canvasId: 'TinyCanvas', fullScreen: true, dpi: 1, showFPS: false, renderType: 0, //WEBGL: 1, CANVAS: 2 renderOptions: {}, autoRender: 1 //0: 手动, 1: 自动 }; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var gl = { createContext: __webpack_require__(81), setVertexAttribArrays: __webpack_require__(34), GLBuffer: __webpack_require__(77), GLFramebuffer: __webpack_require__(78), GLShader: __webpack_require__(79), GLTexture: __webpack_require__(33), VertexArrayObject: __webpack_require__(80), shader: __webpack_require__(82) }; // Export for Node-compatible environments if (typeof module !== 'undefined' && module.exports) { // Export the module module.exports = gl; } // Add to the browser window pixi.gl if (typeof window !== 'undefined') { // add the window object window.PIXI = window.PIXI || {}; window.PIXI.glCore = gl; } /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Application = exports.Filter = exports.SpriteMaskFilter = exports.Quad = exports.RenderTarget = exports.ObjectRenderer = exports.WebGLManager = exports.Shader = exports.CanvasRenderTarget = exports.TextureUvs = exports.VideoBaseTexture = exports.BaseRenderTexture = exports.RenderTexture = exports.BaseTexture = exports.Texture = exports.Spritesheet = exports.CanvasGraphicsRenderer = exports.GraphicsRenderer = exports.GraphicsData = exports.Graphics = exports.TextMetrics = exports.TextStyle = exports.Text = exports.SpriteRenderer = exports.CanvasTinter = exports.CanvasSpriteRenderer = exports.AnimatedSprite = exports.Sprite = exports.TransformBase = exports.TransformStatic = exports.Transform = exports.Container = exports.DisplayObject = exports.Bounds = exports.glCore = exports.WebGLRenderer = exports.CanvasRenderer = exports.ticker = exports.settings = exports.config = undefined; var _const = __webpack_require__(0); Object.keys(_const).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _const[key]; } }); }); var _math = __webpack_require__(2); Object.keys(_math).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _math[key]; } }); }); var _utils = __webpack_require__(1); Object.keys(_utils).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _utils[key]; } }); }); var _settings = __webpack_require__(3); Object.defineProperty(exports, 'config', { enumerable: true, get: function get() { return _settings.config; } }); var _pixiGlCore = __webpack_require__(4); Object.defineProperty(exports, 'glCore', { enumerable: true, get: function get() { return _interopRequireDefault(_pixiGlCore).default; } }); var _Bounds = __webpack_require__(22); Object.defineProperty(exports, 'Bounds', { enumerable: true, get: function get() { return _interopRequireDefault(_Bounds).default; } }); var _DisplayObject = __webpack_require__(45); Object.defineProperty(exports, 'DisplayObject', { enumerable: true, get: function get() { return _interopRequireDefault(_DisplayObject).default; } }); var _Container = __webpack_require__(8); Object.defineProperty(exports, 'Container', { enumerable: true, get: function get() { return _interopRequireDefault(_Container).default; } }); var _Transform = __webpack_require__(46); Object.defineProperty(exports, 'Transform', { enumerable: true, get: function get() { return _interopRequireDefault(_Transform).default; } }); var _TransformStatic = __webpack_require__(47); Object.defineProperty(exports, 'TransformStatic', { enumerable: true, get: function get() { return _interopRequireDefault(_TransformStatic).default; } }); var _TransformBase = __webpack_require__(23); Object.defineProperty(exports, 'TransformBase', { enumerable: true, get: function get() { return _interopRequireDefault(_TransformBase).default; } }); var _Sprite = __webpack_require__(26); Object.defineProperty(exports, 'Sprite', { enumerable: true, get: function get() { return _interopRequireDefault(_Sprite).default; } }); var _AnimatedSprite = __webpack_require__(117); Object.defineProperty(exports, 'AnimatedSprite', { enumerable: true, get: function get() { return _interopRequireDefault(_AnimatedSprite).default; } }); var _CanvasSpriteRenderer = __webpack_require__(118); Object.defineProperty(exports, 'CanvasSpriteRenderer', { enumerable: true, get: function get() { return _interopRequireDefault(_CanvasSpriteRenderer).default; } }); var _CanvasTinter = __webpack_require__(57); Object.defineProperty(exports, 'CanvasTinter', { enumerable: true, get: function get() { return _interopRequireDefault(_CanvasTinter).default; } }); var _SpriteRenderer = __webpack_require__(120); Object.defineProperty(exports, 'SpriteRenderer', { enumerable: true, get: function get() { return _interopRequireDefault(_SpriteRenderer).default; } }); var _Text = __webpack_require__(58); Object.defineProperty(exports, 'Text', { enumerable: true, get: function get() { return _interopRequireDefault(_Text).default; } }); var _TextStyle = __webpack_require__(60); Object.defineProperty(exports, 'TextStyle', { enumerable: true, get: function get() { return _interopRequireDefault(_TextStyle).default; } }); var _TextMetrics = __webpack_require__(59); Object.defineProperty(exports, 'TextMetrics', { enumerable: true, get: function get() { return _interopRequireDefault(_TextMetrics).default; } }); var _Graphics = __webpack_require__(88); Object.defineProperty(exports, 'Graphics', { enumerable: true, get: function get() { return _interopRequireDefault(_Graphics).default; } }); var _GraphicsData = __webpack_require__(48); Object.defineProperty(exports, 'GraphicsData', { enumerable: true, get: function get() { return _interopRequireDefault(_GraphicsData).default; } }); var _GraphicsRenderer = __webpack_require__(91); Object.defineProperty(exports, 'GraphicsRenderer', { enumerable: true, get: function get() { return _interopRequireDefault(_GraphicsRenderer).default; } }); var _CanvasGraphicsRenderer = __webpack_require__(89); Object.defineProperty(exports, 'CanvasGraphicsRenderer', { enumerable: true, get: function get() { return _interopRequireDefault(_CanvasGraphicsRenderer).default; } }); var _Spritesheet = __webpack_require__(122); Object.defineProperty(exports, 'Spritesheet', { enumerable: true, get: function get() { return _interopRequireDefault(_Spritesheet).default; } }); var _Texture = __webpack_require__(7); Object.defineProperty(exports, 'Texture', { enumerable: true, get: function get() { return _interopRequireDefault(_Texture).default; } }); var _BaseTexture = __webpack_require__(11); Object.defineProperty(exports, 'BaseTexture', { enumerable: true, get: function get() { return _interopRequireDefault(_BaseTexture).default; } }); var _RenderTexture = __webpack_require__(27); Object.defineProperty(exports, 'RenderTexture', { enumerable: true, get: function get() { return _interopRequireDefault(_RenderTexture).default; } }); var _BaseRenderTexture = __webpack_require__(61); Object.defineProperty(exports, 'BaseRenderTexture', { enumerable: true, get: function get() { return _interopRequireDefault(_BaseRenderTexture).default; } }); var _VideoBaseTexture = __webpack_require__(63); Object.defineProperty(exports, 'VideoBaseTexture', { enumerable: true, get: function get() { return _interopRequireDefault(_VideoBaseTexture).default; } }); var _TextureUvs = __webpack_require__(62); Object.defineProperty(exports, 'TextureUvs', { enumerable: true, get: function get() { return _interopRequireDefault(_TextureUvs).default; } }); var _CanvasRenderTarget = __webpack_require__(52); Object.defineProperty(exports, 'CanvasRenderTarget', { enumerable: true, get: function get() { return _interopRequireDefault(_CanvasRenderTarget).default; } }); var _Shader = __webpack_require__(12); Object.defineProperty(exports, 'Shader', { enumerable: true, get: function get() { return _interopRequireDefault(_Shader).default; } }); var _WebGLManager = __webpack_require__(10); Object.defineProperty(exports, 'WebGLManager', { enumerable: true, get: function get() { return _interopRequireDefault(_WebGLManager).default; } }); var _ObjectRenderer = __webpack_require__(15); Object.defineProperty(exports, 'ObjectRenderer', { enumerable: true, get: function get() { return _interopRequireDefault(_ObjectRenderer).default; } }); var _RenderTarget = __webpack_require__(16); Object.defineProperty(exports, 'RenderTarget', { enumerable: true, get: function get() { return _interopRequireDefault(_RenderTarget).default; } }); var _Quad = __webpack_require__(56); Object.defineProperty(exports, 'Quad', { enumerable: true, get: function get() { return _interopRequireDefault(_Quad).default; } }); var _SpriteMaskFilter = __webpack_require__(55); Object.defineProperty(exports, 'SpriteMaskFilter', { enumerable: true, get: function get() { return _interopRequireDefault(_SpriteMaskFilter).default; } }); var _Filter = __webpack_require__(54); Object.defineProperty(exports, 'Filter', { enumerable: true, get: function get() { return _interopRequireDefault(_Filter).default; } }); var _Application = __webpack_require__(87); Object.defineProperty(exports, 'Application', { enumerable: true, get: function get() { return _interopRequireDefault(_Application).default; } }); var _ticker = __webpack_require__(28); var ticker = _interopRequireWildcard(_ticker); var _settings2 = _interopRequireDefault(_settings); var _CanvasRenderer = __webpack_require__(9); var _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer); var _WebGLRenderer = __webpack_require__(14); var _WebGLRenderer2 = _interopRequireDefault(_WebGLRenderer); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.settings = _settings2.default; exports.ticker = ticker; exports.CanvasRenderer = _CanvasRenderer2.default; exports.WebGLRenderer = _WebGLRenderer2.default; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var has = Object.prototype.hasOwnProperty, prefix = '~'; /** * Constructor to create a storage for our `EE` objects. * An `Events` instance is a plain object whose properties are event names. * * @constructor * @api private */ function Events() {} // // We try to not inherit from `Object.prototype`. In some engines creating an // instance in this way is faster than calling `Object.create(null)` directly. // If `Object.create(null)` is not supported we prefix the event names with a // character to make sure that the built-in object properties are not // overridden or used as an attack vector. // if (Object.create) { Events.prototype = Object.create(null); // // This hack is needed because the `__proto__` property is still inherited in // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. // if (!new Events().__proto__) prefix = false; } /** * Representation of a single event listener. * * @param {Function} fn The listener function. * @param {Mixed} context The context to invoke the listener with. * @param {Boolean} [once=false] Specify if the listener is a one-time listener. * @constructor * @api private */ function EE(fn, context, once) { this.fn = fn; this.context = context; this.once = once || false; } /** * Minimal `EventEmitter` interface that is molded against the Node.js * `EventEmitter` interface. * * @constructor * @api public */ function EventEmitter() { this._events = new Events(); this._eventsCount = 0; } /** * Return an array listing the events for which the emitter has registered * listeners. * * @returns {Array} * @api public */ EventEmitter.prototype.eventNames = function eventNames() { var names = [], events, name; if (this._eventsCount === 0) return names; for (name in events = this._events) { if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); } if (Object.getOwnPropertySymbols) { return names.concat(Object.getOwnPropertySymbols(events)); } return names; }; /** * Return the listeners registered for a given event. * * @param {String|Symbol} event The event name. * @param {Boolean} exists Only check if there are listeners. * @returns {Array|Boolean} * @api public */ EventEmitter.prototype.listeners = function listeners(event, exists) { var evt = prefix ? prefix + event : event, available = this._events[evt]; if (exists) return !!available; if (!available) return []; if (available.fn) return [available.fn]; for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { ee[i] = available[i].fn; } return ee; }; /** * Calls each of the listeners registered for a given event. * * @param {String|Symbol} event The event name. * @returns {Boolean} `true` if the event had listeners, else `false`. * @api public */ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return false; var listeners = this._events[evt], len = arguments.length, args, i; if (listeners.fn) { if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); switch (len) { case 1: return listeners.fn.call(listeners.context), true; case 2: return listeners.fn.call(listeners.context, a1), true; case 3: return listeners.fn.call(listeners.context, a1, a2), true; case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; } for (i = 1, args = new Array(len - 1); i < len; i++) { args[i - 1] = arguments[i]; } listeners.fn.apply(listeners.context, args); } else { var length = listeners.length, j; for (i = 0; i < length; i++) { if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); switch (len) { case 1: listeners[i].fn.call(listene