2010-01-27 8 views
1

J'ai un objet qui pointe dans la direction d'un autre objet (c'est-à-dire qu'il tourne dans la direction où se trouvent les deuxièmes coordonnées x et y).faire lentement pivoter un objet vers un autre objet

var distx = target.x - x; 
var disty = target.y - y; 

var angle:Number = Math.atan2(disty, distx); 


var vx:Number = Math.cos(angle) * cspeed; 
var vy:Number = Math.sin(angle) * cspeed; 
rotation = angle * 180/Math.PI; 

x += vx; 
y += vy; 

comme vous pouvez le voir. Non seulement il tourne vers l'objet cible, mais il se déplace aussi vers lui. Lorsque je joue le film, l'objet pointe instantanément vers l'objet ciblé et se dirige vers celui-ci.

Je voudrais qu'il tourne lentement vers l'objet au lieu de tourner instantanément vers lui. Quelqu'un sait-il comment faire ça.

Répondre

3

Je dirais essayer cette fonction

function averageNums($a:Number, $b:Number, $f:Number=0.5):Number { 
    var avg:Number = (Math.atan2(Math.sin($a)*($f) + Math.sin($b)*(1-$f) , Math.cos($a)*($f) + Math.cos($b)*(1-$f))); 
    return avg; 
} 

et rotation = averageNums (rotation/180 * Math.PI, angle, 0,9) * 180/Math.PI;

le nombre f va vous laisser passer une rotation plus rapide/plus lent

-il des problèmes sont avec cette façon de le faire, comme une moyenne de 0 et 180

+0

qui a réellement fonctionné parfait. Merci beaucoup – numerical25

+0

heureux que cela fonctionne, juste être conscient de la question a souligné, cela se produirait lorsque l'objet est exactement 0 ou 180 degrés. Si vous suivez le trig là, ce qui finit par arriver est que la différence entre les deux positions y (qui sont exactement les mêmes à ce point) sera 0, et vous ne pouvez pas diviser par zéro. Donc, vous pourriez vouloir mettre une instruction if pour empêcher l'événement d'erreur de se produire – Daniel

1

Qu'en est-il de l'utilisation d'un tween pour le faire? Vous pouvez utiliser la bibliothèque de flash intégré fl.transitions.Tween ou l'une des nombreuses alternatives comme Tweener ou TweenLite.

Pour fl.transitions.Tween

import fl.transitions.Tween; 
import fl.transitions.easing.*; 
var myTween:Tween = new Tween(this, "rotation", Regular.easeOut, this.rotation, angle * 180/Math.PI, 3, true); 

En utilisant Tweener:

import com.caurina.transitions.Tweener 
Tweener.addTween(this, {rotation:angle * 180/Math.PI, time:3, transition:"easeOutQuad"}); 

En utilisant TweenLite:

import com.greensock.*; 
import com.greensock.easing.*; 
TweenLite.to(this, 3, {rotation:angle * 180/Math.PI, ease:Quad.easeOut}); 
+0

Pas trop farmiluar avec l'importance des programmes interpolations. – numerical25

1

hey je sais que ce post est un peu vieux mais je v été à la recherche d'une solution moi-même pour cela et finalement trouvé un moyen de résoudre ce problème! ye moi: D

cette boucle fera son tour myAngle vers la souris

 //loop 
    function loop(e:Event) { 
     var targetAngle:Number=Math.atan2(myStage.mouseY-y,myStage.mouseX-x); 

     if(Math.abs(myAngle-targetAngle)>Math.PI){ 
      if(targetAngle>0){ 
       targetAngle-=Math.PI*2; 
      }else{ 
       targetAngle+=Math.PI*2; 
      } 
     } 

     if(myAngle>Math.PI){ 
      myAngle -=Math.PI*2; 
     } 

     if(myAngle<-Math.PI){ 
      myAngle +=Math.PI*2; 
     } 

     //this is to check if the angle is wide enough, otherwise myAngle will jiggle back and forth 
     if (Math.abs(myAngle-targetAngle)>0.1) { 
      if (myAngle-targetAngle<0) { 
       myAngle+=0.1; 
      } else { 
       myAngle-=0.1; 
      } 
     }