2010-01-27 4 views
1

У меня есть объект, который указывает в направлении другого объекта (т. Е. Он вращается в направлении, в котором находятся координаты второго объекта х и у) ниже, - это код, который я использую.медленно вращать объект по отношению к другому объекту

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; 

как вы можете видеть. Он не только вращается к целевому объекту, но также движется к нему. Когда я играю в фильм, объект мгновенно указывает на целевой объект и движется к нему.

Я хотел бы, чтобы он медленно поворачивался к объекту, а не мгновенно поворачивался к нему. Кто-нибудь знает, как это сделать.

ответ

3

Я бы сказал, что попробовать эту функцию

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

и вращение = среднийNums (вращение/180 * Math.PI, угол, 0.9) * 180/Math.PI;

число е позволит вам иметь быстрее/медленнее вращение

есть проблемы с этим способом сделать это, как в среднем 0 и 180

+0

это действительно сработал безупречный. Спасибо alot – numerical25

+0

рад, что он работает, просто обратите внимание на указанную проблему, это произойдет, когда объект будет ровно на 0 или 180 градусов. Если вы следуете за триггером, то, что в итоге происходит, заключается в том, что разница между двумя положениями y (то же самое в этой точке) будет равна 0, и вы не можете делить на ноль. Таким образом, вы можете поместить инструкцию if, чтобы предотвратить событие ошибки. – Daniel

1

Как насчет использования Tween для этого? Вы можете использовать встроенную флеш-библиотеку fl.transitions.Tween или одну из многих альтернатив, например Tweener или TweenLite.

Для 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); 

Использование Tweener:

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

Использование TweenLite:

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

Не слишком farmiluar со значением программных промежуточных кадров. – numerical25

1

эй я знаю, этот пост немного старый, но я» v искал для себя решение для этого и, наконец, нашел способ решить эту проблему! Yey меня: D

этот цикл будет сделать myAngle поворота к мыши

 //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; 
      } 
     } 
Смежные вопросы