我有一个名为player
的对象和一个名为joystick
的虚拟操纵杆控制器,它包含一个名为knob
的旋钮,我放置了joystick
和knob
在另一个动画片段中。
我使用脚本将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
停止。
为什么会发生这种情况?
我有办法解决这个问题吗?
答案 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)
我觉得检测旋钮的位置(向右,向左,向上,向下)效率更高。
或许你们可以找到更有效,更准确的另一种方式?这会对我有所帮助