0

我创建了一个movieclip spawner 类和animator 类,它们沿着一组x,y 点对movieclip 进行动画处理。我使用 Greensock 的 TweenMax 来完成动画,并且我将速度设置为每个点之间的 1 秒。问题是当两点之间的距离很小时,它看起来太慢了。

我想做的是以某种方式计算两点之间的距离并输出 0 到 1 秒范围内的速度,以便速度对于较短的距离和较长的距离都是正确的。

任何帮助或建议将不胜感激。

谢谢,

eb_dev

4

3 回答 3

1

你想要做的是计算两点之间的距离,并让时间与之相关。您如何准确定义关系取决于。是一秒钟的动画,其中事物从舞台的一端移动到另一端或什么。这将是您的基线,所有动画都将与它相关。

因此,假设整个舞台宽度上的动画为一秒,任何比这更短的都与该一秒相关。

dist = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
animTime = dist / state.stageWidth;

更新: Math.sqrt 只取点之间差异的平方根。您不一定需要这样做,因为您只对相对于舞台大小的距离感兴趣,而不是实际距离。它存在的原因是将距离恢复到与stage.stageSize. 请注意,是平方和坐标(x1-x2)*(x1-x2)之间的距离,即。等于。x1x2Math.pow(x1-x2,2)

于 2010-11-08T10:45:20.833 回答
1

我认为您想要较小距离的最小速度。

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 定义的某个速度移动。

于 2010-11-08T15:07:15.663 回答
1

赞同 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 轴相交的点。为了能够将此应用于勾股定理,让我们看看ab的大小- 腿a的长度是0、0和点 1之间的距离。减去0、0仍然只剩下点 1 - 但是,我们知道它将位于 X 轴上的某个位置 - 因此它的 Y 将为 0。我们可以说a的长度等于点 1 的 X 部分。

b腿和第 2 点也是如此。然而,这一次,我们只得到它的 Y 部分。

为了计算c ,我们首先将ab的二次幂(a^2 + b^2) 相加。我们现在有 c^2,所以要获得c - 斜边,我们将计算它的平方根(即 AS3.0 中的 Math.sqrt())。

c是距离。

希望这能解释这一点。

于 2010-11-08T16:48:58.917 回答