UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

289 lines (269 loc) 9.15 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////////////// namespace egret { /** * @classdesc 使用 MovieClipData 类,您可以创建 MovieClip 对象和处理 MovieClip 对象的数据。MovieClipData 一般由MovieClipDataFactory生成 * @see http://edn.egret.com/cn/docs/page/596 MovieClip序列帧动画 * @version Egret 2.4 * @platform Web,Native */ export class MovieClipData extends HashObject { /** * @private * MovieClip数据 */ $mcData:any = null; /** * 总帧数 * @version Egret 2.4 * @platform Web,Native */ public numFrames:number = 1; /** * 帧数据列表 * @version Egret 2.4 * @platform Web,Native */ public frames:any[] = []; /** * 帧标签列表 * @version Egret 2.4 * @platform Web,Native */ public labels:any[] = null; /** * 帧事件列表 * @version Egret 2.4 * @platform Web,Native */ public events:any[] = []; /** * 帧率 * @version Egret 2.4 * @platform Web,Native */ public frameRate:number = 0; /** * 纹理数据 * @version Egret 2.4 * @platform Web,Native */ public textureData:any = null; /** * 纹理集 * @version Egret 2.4 * @platform Web,Native */ public spriteSheet:SpriteSheet = null; /** * 创建一个 egret.MovieClipData 对象 * @version Egret 2.4 * @platform Web,Native */ constructor() { super(); } /** * @private * * @param mcData * @param textureData * @param spriteSheet */ $init(mcData:any, textureData:any, spriteSheet:SpriteSheet) { this.textureData = textureData; this.spriteSheet = spriteSheet; this.setMCData(mcData); } /** * 根据指定帧序号获取该帧对应的关键帧数据 * @param frame {number} 帧序号 * @returns {any} 帧数据对象 * @version Egret 2.4 * @platform Web,Native */ public getKeyFrameData(frame:number):any { let outputFrameData = this.frames[frame - 1]; if (outputFrameData.frame) { outputFrameData = this.frames[outputFrameData.frame - 1]; } return outputFrameData; } /** * 根据指定帧序号获取该帧对应的Texture对象 * @param frame {number} 帧序号 * @returns {egret.Texture} Texture对象 * @version Egret 2.4 * @platform Web,Native */ public getTextureByFrame(frame:number):Texture { let frameData = this.getKeyFrameData(frame); if (frameData.res) { let outputTexture:Texture = this.getTextureByResName(frameData.res); return outputTexture; } return null; } public $getOffsetByFrame(frame:number, point:Point):void { let frameData = this.getKeyFrameData(frame); if (frameData.res) { point.setTo(frameData.x | 0, frameData.y | 0); } } /** * @private * * @param resName * @returns */ private getTextureByResName(resName:string):Texture { if (this.spriteSheet == null) { return null; } let texture = this.spriteSheet.getTexture(resName); if (!texture) { let textureData = this.textureData[resName]; texture = this.spriteSheet.createTexture(resName, textureData.x, textureData.y, textureData.w, textureData.h); } return texture; } /** * @private * * @returns */ $isDataValid():boolean { return this.frames.length > 0; } /** * @private * * @returns */ $isTextureValid():boolean { return this.textureData != null && this.spriteSheet != null; } /** * @private * * @param mcData */ $fillMCData(mcData:any):void { this.frameRate = mcData["frameRate"] || 24; this.fillFramesData(mcData.frames); this.fillFrameLabelsData(mcData.labels); this.fillFrameEventsData(mcData.events); } /** * @private * * @param framesData */ private fillFramesData(framesData:any[]):void { let frames:any[] = this.frames; let length:number = framesData ? framesData.length : 0; let keyFramePosition:number; for (let i = 0; i < length; i++) { let frameData:any = framesData[i]; frames.push(frameData); if (frameData.duration) { let duration:number = parseInt(frameData.duration); if (duration > 1) { keyFramePosition = frames.length; for (let j = 1; j < duration; j++) { frames.push({"frame": keyFramePosition}) } } } } this.numFrames = frames.length; } /** * @private * * @param frameLabelsData */ private fillFrameLabelsData(frameLabelsData:any[]):void { if (frameLabelsData) { let length:number = frameLabelsData.length; if (length > 0) { this.labels = []; for (let i = 0; i < length; i++) { let label:any = frameLabelsData[i]; this.labels.push(new FrameLabel(label.name, label.frame, label.end)); } } } } /** * @private * * @param frameEventsData */ private fillFrameEventsData(frameEventsData:any[]):void{ if(frameEventsData){ let length:number = frameEventsData.length; if(length>0){ this.events = []; for (let i = 0; i < length; i++){ let events:any = frameEventsData[i]; this.events[events.frame] = events.name; } } } } /** * MovieClip数据源 */ public set mcData(value:MovieClipData) { this.setMCData(value); } /** * @version Egret 2.4 * @platform Web,Native */ public get mcData():MovieClipData { return this.$mcData; } /** * @private * * @param value */ private setMCData(value:MovieClipData) { if (this.$mcData == value) { return; } this.$mcData = value; if (value) { this.$fillMCData(value); } } } }