UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

267 lines (252 loc) 9.46 kB
/** * The MIT License (MIT) * * Copyright (c) 2012-2017 DragonBones team and other contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace dragonBones { /** * - Worldclock provides clock support for animations, advance time for each IAnimatable object added to the instance. * @see dragonBones.IAnimateble * @see dragonBones.Armature * @version DragonBones 3.0 * @language en_US */ /** * - WorldClock 对动画提供时钟支持,为每个加入到该实例的 IAnimatable 对象更新时间。 * @see dragonBones.IAnimateble * @see dragonBones.Armature * @version DragonBones 3.0 * @language zh_CN */ export class WorldClock implements IAnimatable { /** * - Current time. (In seconds) * @version DragonBones 3.0 * @language en_US */ /** * - 当前的时间。 (以秒为单位) * @version DragonBones 3.0 * @language zh_CN */ public time: number = 0.0; /** * - The play speed, used to control animation speed-shift play. * [0: Stop play, (0~1): Slow play, 1: Normal play, (1~N): Fast play] * @default 1.0 * @version DragonBones 3.0 * @language en_US */ /** * - 播放速度,用于控制动画变速播放。 * [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] * @default 1.0 * @version DragonBones 3.0 * @language zh_CN */ public timeScale: number = 1.0; private readonly _animatebles: Array<IAnimatable | null> = []; private _clock: WorldClock | null = null; /** * - Creating a Worldclock instance. Typically, you do not need to create Worldclock instance. * When multiple Worldclock instances are running at different speeds, can achieving some specific animation effects, such as bullet time. * @version DragonBones 3.0 * @language en_US */ /** * - 创建一个 WorldClock 实例。通常并不需要创建 WorldClock 实例。 * 当多个 WorldClock 实例使用不同的速度运行时,可以实现一些特殊的动画效果,比如子弹时间等。 * @version DragonBones 3.0 * @language zh_CN */ public constructor(time: number = -1.0) { if (time < 0.0) { this.time = new Date().getTime() * 0.001; } else { this.time = time; } } /** * - Advance time for all IAnimatable instances. * @param passedTime - Passed time. [-1: Automatically calculates the time difference between the current frame and the previous frame, [0~N): Passed time] (In seconds) * @version DragonBones 3.0 * @language en_US */ /** * - 为所有的 IAnimatable 实例更新时间。 * @param passedTime - 前进的时间。 [-1: 自动计算当前帧与上一帧的时间差, [0~N): 前进的时间] (以秒为单位) * @version DragonBones 3.0 * @language zh_CN */ public advanceTime(passedTime: number): void { if (passedTime !== passedTime) { // isNaN passedTime = 0.0; } if (passedTime < 0.0) { passedTime = new Date().getTime() * 0.001 - this.time; } if (this.timeScale !== 1.0) { passedTime *= this.timeScale; } if (passedTime < 0.0) { this.time -= passedTime; } else { this.time += passedTime; } if (passedTime === 0.0) { return; } let i = 0, r = 0, l = this._animatebles.length; for (; i < l; ++i) { const animatable = this._animatebles[i]; if (animatable !== null) { if (r > 0) { this._animatebles[i - r] = animatable; this._animatebles[i] = null; } animatable.advanceTime(passedTime); } else { r++; } } if (r > 0) { l = this._animatebles.length; for (; i < l; ++i) { const animateble = this._animatebles[i]; if (animateble !== null) { this._animatebles[i - r] = animateble; } else { r++; } } this._animatebles.length -= r; } } /** * - Check whether contains a specific instance of IAnimatable. * @param value - The IAnimatable instance. * @version DragonBones 3.0 * @language en_US */ /** * - 检查是否包含特定的 IAnimatable 实例。 * @param value - IAnimatable 实例。 * @version DragonBones 3.0 * @language zh_CN */ public contains(value: IAnimatable): boolean { if (value === this) { return false; } let ancestor: IAnimatable | null = value; while (ancestor !== this && ancestor !== null) { ancestor = ancestor.clock; } return ancestor === this; } /** * - Add IAnimatable instance. * @param value - The IAnimatable instance. * @version DragonBones 3.0 * @language en_US */ /** * - 添加 IAnimatable 实例。 * @param value - IAnimatable 实例。 * @version DragonBones 3.0 * @language zh_CN */ public add(value: IAnimatable): void { if (this._animatebles.indexOf(value) < 0) { this._animatebles.push(value); value.clock = this; } } /** * - Removes a specified IAnimatable instance. * @param value - The IAnimatable instance. * @version DragonBones 3.0 * @language en_US */ /** * - 移除特定的 IAnimatable 实例。 * @param value - IAnimatable 实例。 * @version DragonBones 3.0 * @language zh_CN */ public remove(value: IAnimatable): void { const index = this._animatebles.indexOf(value); if (index >= 0) { this._animatebles[index] = null; value.clock = null; } } /** * - Clear all IAnimatable instances. * @version DragonBones 3.0 * @language en_US */ /** * - 清除所有的 IAnimatable 实例。 * @version DragonBones 3.0 * @language zh_CN */ public clear(): void { for (const animatable of this._animatebles) { if (animatable !== null) { animatable.clock = null; } } } /** * @inheritDoc */ public get clock(): WorldClock | null { return this._clock; } public set clock(value: WorldClock | null) { if (this._clock === value) { return; } if (this._clock !== null) { this._clock.remove(this); } this._clock = value; if (this._clock !== null) { this._clock.add(this); } } /** * - Deprecated, please refer to {@link dragonBones.BaseFactory#clock}. * @deprecated * @language en_US */ /** * - 已废弃,请参考 {@link dragonBones.BaseFactory#clock}。 * @deprecated * @language zh_CN */ public static readonly clock: WorldClock = new WorldClock(); } }