【问题标题】:Flash CS5 Moving an object around in a circle 1 degree at a timeFlash CS5 一次将物体绕圈移动 1 度
【发布时间】:2011-08-02 07:54:25
【问题描述】:

我有一个名为 point 的对象,我可以用鼠标在屏幕上移动。这个对象有一个通过它(_v1)映射的向量,使用舞台中心和“点”的x,y位置来绘制向量(注意所有这些都很好)。当我设置一个按钮时,我的问题发生了,如果你按下它,它只会将一个值设置为 true。这个按钮背后的想法是,当按下时,无论“点”在什么位置,它都会绕舞台中心顺时针移动 1 度(这一切都发生在 frameHandler 中,所以我可以继续点击按钮来制作它在舞台周围继续)。我使用的代码基于下面列出的 if 语句:

if(clockwisePressed) {
    var v1angle:Number = _v1.angle;
    v1angle++; //increase the angle by 1 degree
    if(v1angle>180) {
        v1angle -= 360;
    }
    //Now just move the crosshair and get it ready to be redrawn
    point.x = centerX - _v1.m * Math.cos(v1angle);
    point.y = centerY - _v1.m * Math.sin(v1angle);
    clockwisePressed = false; //remove button pressed boolean
}

所以这里发生的事情是 顺时针Pressed 已设置为 true,因此会触发。我的向量 (_v1) 设置为告诉我角度(已经从弧度转换为度数),但它是一个只读值。所以我将它(_v1.angle)分配给v1angle,这样我就可以弄乱它并将它增加1,所以我绕着舞台中心顺时针移动。然后我只是检查以确保它在 -180 和 180 之间的范围内(如果我在舞台周围跟踪 _v1.angle,0 度是向左,90 度是直线向上,180 度是向右,并且-90 是直线下降)。现在使用我从this thread 导出的公式,但转换为指向左侧的 0 度和 Y 的值越往下走,我想出了

x = centerX - radius * cos(angle)
y = centerY - radius * sin(angle)

现在,当我在纸上制作示例图表并在我的计算器上使用这些值时,这就像一个魅力。如果我插入一个角度、半径和中心,我会在我的圆上得到一个点,我会在一张方格纸上绘制。然而,当我真正在 flash 中尝试这个时,“点”在整个舞台上跳跃。 (注意 _v1.m 只是舞台中心和“点”之间的向量的大小,与半径相同)。

所以我跟踪所有内容,cos 和 sin 的值似乎不正确。例如,如果我的角度是 -1.9581,我在计算器上取它的 cos,我得到的结果大约是 0.9994,但闪存跟踪 Math.cos(angle) 为 -0.3777。使用 Math.cos(-1.9581) 与将 -1.9581 放入计算器并输入 cos 不一样吗?

因此,在我上面的示例中,我的 point.x 从 139.95 变为 261.3。对于应该是 1 度的情况来说,这是一个很大的跳跃。所以我不知道是什么导致这段代码如此严重地失败。我在这里做错了吗?

更新:如果有人对此主题感兴趣,以下是有效的更正代码:

if(clockwisePressed) {
    var v1RadAngle:Number = Math.atan2(_v1.vy, _v1.vx); //get angle in radians
    v1RadAngle += 0.0174; //increase the angle by ~1 degree more or less
    //Now just move the crosshair and get it ready to be redrawn
    point.x = centerX - _v1.m * Math.cos(v1RadAngle); //_v1.m = radius
    point.y = centerY - _v1.m * Math.sin(v1RadAngle);
    clockwisePressed = false; //remove button pressed boolean
}

【问题讨论】:

    标签: flash actionscript-3 flash-cs5


    【解决方案1】:

    Flash 中的三角函数需要以弧度为单位输入,但您使用的是度数。在使用它之前,您必须将您的度数转换为弧度:

    var angle:Number = -1.9581;
    var radAngle:Number = angle * Math.PI / 180;
    trace(Math.cos(radAngle)); // 0.9994160815411552
    

    【讨论】:

    • 呃...你的意思是我实际上对于闪存来说效率太高了?哈哈。以为我很聪明地进行了所有转换等“让事情变得更容易”。我可以将其保留为弧度,甚至不需要检查将其从 180 更改为 -179。再次感谢 shanthehat,你救了我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多