我创建了一个movieclip spawner 类和animator 类,它们沿着一组x,y 点对movieclip 进行动画处理。我使用 Greensock 的 TweenMax 来完成动画,并且我将速度设置为每个点之间的 1 秒。问题是当两点之间的距离很小时,它看起来太慢了。
我想做的是以某种方式计算两点之间的距离并输出 0 到 1 秒范围内的速度,以便速度对于较短的距离和较长的距离都是正确的。
任何帮助或建议将不胜感激。
谢谢,
eb_dev
我创建了一个movieclip spawner 类和animator 类,它们沿着一组x,y 点对movieclip 进行动画处理。我使用 Greensock 的 TweenMax 来完成动画,并且我将速度设置为每个点之间的 1 秒。问题是当两点之间的距离很小时,它看起来太慢了。
我想做的是以某种方式计算两点之间的距离并输出 0 到 1 秒范围内的速度,以便速度对于较短的距离和较长的距离都是正确的。
任何帮助或建议将不胜感激。
谢谢,
eb_dev
你想要做的是计算两点之间的距离,并让时间与之相关。您如何准确定义关系取决于。是一秒钟的动画,其中事物从舞台的一端移动到另一端或什么。这将是您的基线,所有动画都将与它相关。
因此,假设整个舞台宽度上的动画为一秒,任何比这更短的都与该一秒相关。
dist = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
animTime = dist / state.stageWidth;
更新: Math.sqrt 只取点之间差异的平方根。您不一定需要这样做,因为您只对相对于舞台大小的距离感兴趣,而不是实际距离。它存在的原因是将距离恢复到与stage.stageSize
. 请注意,是平方和坐标(x1-x2)*(x1-x2)
之间的距离,即。等于。x1
x2
Math.pow(x1-x2,2)
我认为您想要较小距离的最小速度。
const MIN_SPEED:Number = ???// adjust this value
var distance:Number = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
var duration:Number = Math.min(1.0, distance / MIN_SPEED);
对于长距离 1.0 < distance / MIN_SPEED,持续时间将设置为 1.0[sec]
对于小距离 1.0 > distance / MIN_SPEED,并且持续时间将设置为以 MIN_SPEED 定义的某个速度移动。
我赞同 Matti所说的,但它可以做得更快——大约需要 48 到 64 位内存(哇,这么多!!!...)
var dX:Number = x1 - x2;
var dY:Number = y1 - y2;
var dist:Number = Math.sqrt(dX * dX + dY * dY);
var animTime = dist / state.stageWidth;
为了解释eb Dev的要求,平方根是勾股定理的一部分:
a^2 + b^2 = c^2
X 和 Y 轴上的线可以看作是直角三角形的两条腿,因此斜边将是两个特定点之间的距离(我们需要)。
首先我们减去点 (x1 - x2, y1 - y2)。我们仍然有两个点,但是,三角形的直角部分现在位于0, 0 - X 轴和 Y 轴相交的点。为了能够将此应用于勾股定理,让我们看看a和b的大小- 腿a的长度是0、0和点 1之间的距离。减去0、0仍然只剩下点 1 - 但是,我们知道它将位于 X 轴上的某个位置 - 因此它的 Y 将为 0。我们可以说a的长度等于点 1 的 X 部分。
b腿和第 2 点也是如此。然而,这一次,我们只得到它的 Y 部分。
为了计算c ,我们首先将a和b的二次幂(a^2 + b^2) 相加。我们现在有 c^2,所以要获得c - 斜边,我们将计算它的平方根(即 AS3.0 中的 Math.sqrt())。
c是距离。
希望这能解释这一点。