медленно поворачивать объект к другому объекту - PullRequest
1 голос
/ 27 января 2010

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

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 ]

3 голосов
/ 28 января 2010

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

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

и Вращение = среднее число (вращение / 180 * Math.PI, угол, 0,9) * 180 / Math.PI;

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

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

1 голос
/ 05 февраля 2012

эй, я знаю, что этот пост немного устарел, но я сам искал решение для этого и наконец нашел способ решить эту проблему! ты меня: 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;
            }
        }
1 голос
/ 28 января 2010

Как насчет использования 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});
...