/** * 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. */ using System; using System.Collections.Generic; namespace DragonBones { /// /// - Worldclock provides clock support for animations, advance time for each IAnimatable object added to the instance. /// /// /// /// DragonBones 3.0 /// en_US /// /// - WorldClock 对动画提供时钟支持,为每个加入到该实例的 IAnimatable 对象更新时间。 /// /// /// /// DragonBones 3.0 /// zh_CN public class WorldClock : IAnimatable { /// /// - Current time. (In seconds) /// /// DragonBones 3.0 /// en_US /// /// - 当前的时间。 (以秒为单位) /// /// DragonBones 3.0 /// zh_CN public float time = 0.0f; /// /// - The play speed, used to control animation speed-shift play. /// [0: Stop play, (0~1): Slow play, 1: Normal play, (1~N): Fast play] /// /// 1.0 /// DragonBones 3.0 /// en_US /// /// - 播放速度,用于控制动画变速播放。 /// [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] /// /// 1.0 /// DragonBones 3.0 /// zh_CN public float timeScale = 1.0f; private float _systemTime = 0.0f; private readonly List _animatebles = new List(); private WorldClock _clock = 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. /// /// DragonBones 3.0 /// en_US /// /// - 创建一个 WorldClock 实例。通常并不需要创建 WorldClock 实例。 /// 当多个 WorldClock 实例使用不同的速度运行时,可以实现一些特殊的动画效果,比如子弹时间等。 /// /// DragonBones 3.0 /// zh_CN public WorldClock(float time = -1.0f) { this.time = time; this._systemTime = DateTime.Now.Ticks * 0.01f * 0.001f; } /// /// - Advance time for all IAnimatable instances. /// /// - Passed time. [-1: Automatically calculates the time difference between the current frame and the previous frame, [0~N): Passed time] (In seconds) /// DragonBones 3.0 /// en_US /// /// - 为所有的 IAnimatable 实例更新时间。 /// /// - 前进的时间。 [-1: 自动计算当前帧与上一帧的时间差, [0~N): 前进的时间] (以秒为单位) /// DragonBones 3.0 /// zh_CN public void AdvanceTime(float passedTime) { if (float.IsNaN(passedTime)) { passedTime = 0.0f; } var currentTime = DateTime.Now.Ticks * 0.01f * 0.001f; if (passedTime < 0.0f) { passedTime = currentTime - this._systemTime; } this._systemTime = currentTime; if (this.timeScale != 1.0f) { passedTime *= this.timeScale; } if (passedTime == 0.0f) { return; } if (passedTime < 0.0f) { this.time -= passedTime; } else { this.time += passedTime; } int i = 0, r = 0, l = _animatebles.Count; for (; i < l; ++i) { var animateble = _animatebles[i]; if (animateble != null) { if (r > 0) { _animatebles[i - r] = animateble; _animatebles[i] = null; } animateble.AdvanceTime(passedTime); } else { r++; } } if (r > 0) { l = _animatebles.Count; for (; i < l; ++i) { var animateble = _animatebles[i]; if (animateble != null) { _animatebles[i - r] = animateble; } else { r++; } } _animatebles.ResizeList(l - r, null); } } /// /// - Check whether contains a specific instance of IAnimatable. /// /// - The IAnimatable instance. /// DragonBones 3.0 /// en_US /// /// - 检查是否包含特定的 IAnimatable 实例。 /// /// - IAnimatable 实例。 /// DragonBones 3.0 /// zh_CN public bool Contains(IAnimatable value) { if (value == this) { return false; } IAnimatable ancestor = value; while (ancestor != this && ancestor != null) { ancestor = ancestor.clock; } return ancestor == this; } /// /// - Add IAnimatable instance. /// /// - The IAnimatable instance. /// DragonBones 3.0 /// en_US /// /// - 添加 IAnimatable 实例。 /// /// - IAnimatable 实例。 /// DragonBones 3.0 /// zh_CN public void Add(IAnimatable value) { if (value != null && !_animatebles.Contains(value)) { _animatebles.Add(value); value.clock = this; } } /// /// - Removes a specified IAnimatable instance. /// /// - The IAnimatable instance. /// DragonBones 3.0 /// en_US /// /// - 移除特定的 IAnimatable 实例。 /// /// - IAnimatable 实例。 /// DragonBones 3.0 /// zh_CN public void Remove(IAnimatable value) { var index = _animatebles.IndexOf(value); if (index >= 0) { _animatebles[index] = null; value.clock = null; } } /// /// - Clear all IAnimatable instances. /// /// DragonBones 3.0 /// en_US /// /// - 清除所有的 IAnimatable 实例。 /// /// DragonBones 3.0 /// zh_CN public void Clear() { for (int i = 0, l = _animatebles.Count; i < l; ++i) { var animateble = _animatebles[i]; _animatebles[i] = null; if (animateble != null) { animateble.clock = null; } } } /// /// - Deprecated, please refer to {@link dragonBones.BaseFactory#clock}. /// /// en_US /// /// - 已废弃,请参考 {@link dragonBones.BaseFactory#clock}。 /// /// zh_CN [System.Obsolete("")] /// public WorldClock clock { get { return _clock; } set { if (_clock == value) { return; } if (_clock != null) { _clock.Remove(this); } _clock = value; if (_clock != null) { _clock.Add(this); } } } } }