即使移动次数为0,对象仍然在移动

时间:2016-07-08 14:42:53

标签: actionscript-3 flash touch

我有一个名为player的对象和一个名为joystick的虚拟操纵杆控制器,它包含一个名为knob的旋钮,我放置了joystickknob在另一个动画片段中。

我使用脚本将player移动为knob的移动量。

以下是代码:

function enterFrame(e:Event): void {
    if (moving) {
        // I move the knob as the touch point moves
        // and the player as the knob moves
    } else {
        // I'm trying to slow down the knob movement to get back to its default position
        // and slow down the player movement until it stopped

        if (knob.x - joystick.x > 0) {
            knob.x -= (knob.x - joystick.x)*.5;
            player.x -= -(knob.x - joystick.x)*.9;
        }
        if (knob.x - joystick.x < 0) {
            knob.x += -((knob.x - joystick.x)*.5);
            player.x += (knob.x - joystick.x)*.9;
        }
        if (knob.y - joystick.y > 0) {
            knob.y -= (knob.y - joystick.y)*.5;
            player.y -= -((knob.y - joystick.y)*.9);
        }
        if (knob.y - joystick.y < 0) {
            knob.y += -((knob.y - joystick.y)*.5);
            player.y += (knob.y - joystick.y)*.9;
        }

        // Then I use trace to trace the player x position
        trace(player.x);
    }
}

我得到的是当我将旋钮移动到左侧位置并touch_end时,慢速起作用但player向左移动.01。但是当我将旋钮移动到另一个方向并touch_end时,减速效果很好,直到player停止。

为什么会发生这种情况?

我有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

这看起来像一个浮点精度效果。如果您从1开始knob.x而0.5开始joystick.x,那么您将获得:

knob.x      joystick.x  knob-joystick   knob-joystick/2 
1           0.5         0.5             0.25
0.75        0.5         0.25            0.125
0.625       0.5         0.125           0.0625
0.5625      0.5         0.0625          0.03125
0.53125     0.5         0.03125         0.015625
0.515625    0.5         0.015625        0.0078125

它显然趋于零,但在计算knob.x-joystick.x时,剩余的正值很小。

注意:由于更改if的{​​{1}}语句位于knob.x侦听器中,因此响应用户输入而更改任何操纵杆所需的时间将超过此时间。

而不是检查您的差异是否> 0,检查它是否大于一些小的保护值,例如

EnterFrame

您还可以在听众的末尾添加一些保护代码:

if (knob.x - joystick.x > 0.01) {
    knob.x -= (knob.x - joystick.x)*.5;
    player.x -= -(knob.x - joystick.x)*.9;
}
//etc.

答案 1 :(得分:1)

好吧,在解决之后,我终于做到了!

我使用Math.floor&#34;技巧&#34;强制-0.0249999999999828(向左移动时的最后一个位置,即使我不再控制它,player继续向左移动)也要更改为0。< / p>

以下是代码:

function enterFrame(e:Event): void {
    .... // bla bla bla
    } else {
        if (knob.x > joystick.x) {
            knob.x -= (knob.x - joystick.x)*.5;
            player.x -= -((knob.x - joystick.x)*.9);
        }
        if (knob.x < joystick.x) {
            knob.x += -(Math.floor((knob.x - joystick.x)*.5));
            player.x += Math.floor((knob.x - joystick.x)*.9);
        }
        if (knob.y > joystick.y) {
            knob.y -= (knob.y - joystick.y)*.5;
            player.y -= -((knob.y - joystick.y)*.9);
        }
        if (knob.y < joystick.y) {
            knob.y += -(Math.floor((knob.y - joystick.y)*.5));
            player.y += Math.floor((knob.y - joystick.y)*.9);
        }
    }
}

我将if (knob.x - joystick.x > 0)(及其所有类型)更改为if (knob.x > joystick.x)我觉得检测旋钮的位置(向右,向左,向上,向下)效率更高。

或许你们可以找到更有效,更准确的另一种方式?这会对我有所帮助