2016-07-08 16 views
-1

ich ein Objekt habe player und einen virtuellen Joystick-Controller namens joystick genannt und enthält sein Knopf knob genannt und ich habe die joystick und die knob in einem anderen Movieclip platziert.Objekt noch in Bewegung, auch wenn die Zahl der Bewegung 0 ist

Ich verwende ein Skript, um die player als die Menge der Bewegung der knob zu verschieben.

Hier ist der Code:

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); 
    } 
} 

Und was ich habe ist, wenn ich den Knopf nach links Position bewegen und touch_end es, die langsamen Arbeiten nach unten, aber der player Halt von .01 links. Aber wenn ich den Knopf in eine andere Richtung und touch_end es verschiebe, funktioniert die Verlangsamung gut, bis die player gestoppt.

Warum konnte das passieren?

Gibt es eine Möglichkeit, das zu beheben?

+0

Trace ("Verschieben:" + Verschieben) in Ihrem enterFrame-Funktion bitte und lassen Sie mich wissen, was passiert. Wenn der Spieler sich bewegt .01, bewegt sich wahr oder falsch? –

+0

Es ist 'false', ich weiß nicht einmal warum – Gregorio

Antwort

2

Dies sieht wie ein Gleitkomma-Präzisions-Effekt aus. Wenn Sie mit knob.x bei 1 und joystick.x bei 0,5 zu starten, erhalten Sie:

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 

Es ist klar in Richtung Null tendiert, aber es gibt einen kleinen verbleibenden positiven Wert, wenn Sie knob.x-joystick.x berechnen.

Hinweis: Da Ihre if-Anweisung, die knob.x ändert, in einem EnterFrame Listener ist, wird jeder Joystick, der als Reaktion auf Benutzereingaben geändert wird, länger dauern.

Anstatt zu überprüfen, ob Ihre Differenz> 0 ist, überprüfen Sie, ob sie größer ist als ein kleiner Schutzwert, z.

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

Sie könnten auch einige Wache Code am Ende Ihrer Zuhörer hinzu:

if (knob.x > 0 && knob.x < 0.01) { 
    knob.x = 0; 
} 
//etc. 
+0

Genau das, was ich dachte. +1 –

+0

Es bewegt sich immer noch – Gregorio

+0

@ G.Chiko Haben Sie den Schutzcode zu allen vier 'if' Blöcken hinzugefügt? Überprüfen Sie außerdem, ob kein anderer Code die 'Player'-Position aktualisiert. – Brian

1

Nun, nachdem um daran zu arbeiten, schließlich ich es tat!

Ich benutze Math.floor „Trick“, um die -0.0249999999999828 zu zwingen (die letzte Position, wenn die den player Halt macht nach links zu bewegen, selbst bewegt links, wenn ich es nicht mehr kontrollieren) Änderung 0 zu sein.

Hier ist der Code:

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); 
     } 
    } 
} 

ich die if (knob.x - joystick.x > 0) verändert (und alle Art von diesem) zu if (knob.x > joystick.x) Ich denke, es effizienter ist, zu erkennen, wo der Knopf (rechts ist, links, oben, unten).

Oder vielleicht finden Sie einen anderen Weg effizienter und genauer? Es würde mir helfen

+0

Das einzige "Problem" dabei ist, dass es sich zu ruckartigen Bewegungen eignet. Es stimmt im Wesentlichen Ihren Zahlenwert auf einen Int-Wert ab. Wenn es für dich funktioniert, ist das großartig. Aber ich bevorzuge die Antwort von Brian. Es erzwingt keinen Aufruf einer mathematischen Methode, die teurer sein kann, und es wird nur aktiviert, wenn der Verschiebungswert sehr niedrig wird. Dein setzt ein, wenn der Zug 3,2 ist, erzwingt er einen Zug auf 3. Wenn er auf 2,9 geht, zwingt er ihn auf 2. Besser, ihn nur auf 0 zu zwingen, wenn er weniger als 0,3 oder so ist. –

+0

Ich habe Brians Code ausprobiert, aber der "Player" bewegt sich weiter. Was soll ich machen? Oder vielleicht gibt es etwas, das ich vermisst habe? – Gregorio

+1

Wissen Sie, wie man debuggt? Strg-Umschalttaste Enter. Setzen Sie einige Unterbrechungspunkte in den Code. Dann gehen Sie während der Verlangsamung durch den Code. Sie werden in der Lage sein, alle Variablenwerte zu sehen und wo der Abspielkopf sehr nützlich ist. –