Как мне замедлить анимацию в AS3 без уменьшения частоты кадров - PullRequest
0 голосов
/ 20 января 2010

У меня есть этот код, который я нашел в Интернете, который создает бесконечно вращающуюся галерею, теперь моя проблема в том, что во входном фрейме он скачет и слишком быстро Я хочу, чтобы это было так же быстро после того, как вы наведете курсор на логотип.

Вот код:

//Import TweenMax
import com.greensock.TweenMax;

//Save the horizontal center
var centerX:Number = stage.stageWidth / 2;

//Save the width of the whole gallery
var galleryWidth:Number = infiniteGallery.width;

//Speed of the movement (calculated by the mouse position in the moveGallery() function)
var speed:Number = 0;

//Add an ENTER_FRAME listener for the animation
addEventListener(Event.ENTER_FRAME, moveGallery);

function moveGallery(e:Event):void {

 //Calculate the new speed
 speed = -(0.02 * (mouseX - centerX));

 //Update the x coordinate
 infiniteGallery.x+=speed;

 //Check if we are too far on the right (no more stuff on the left edge)
 if (infiniteGallery.x>0) {

  //Update the gallery's coordinates
  infiniteGallery.x= (-galleryWidth/2);
 }

 //Check if we are too far on the left (no more stuff on the right edge)
 if (infiniteGallery.x<(-galleryWidth/2)) {

  //Update the gallery's coordinates
  infiniteGallery.x=0;
 }
}

и вот демоверсия

1 Ответ

2 голосов
/ 20 января 2010

Скорость скроллера основана на трех вещах:

1 - частота кадров. Обработчик события ENTER_FRAME вызывается для каждого кадра, поэтому на него напрямую влияет частота кадров.

2- Число демпфирования скорости. В вашем случае это равно 0,02. Если вы хотите замедлить прокрутку, сделайте это меньшее число. Попробуйте 0,01 на половину скорости.

3- Расстояние указателя мыши до координаты центра х вашей сцены. Разница между указателем мыши и центром вашей сцены умножается на ваше число демпфирования скорости. Если вы хотите, чтобы движение прекратилось, когда вы находитесь в центре или вокруг него, измените код следующим образом:

var buffer:Number = 50;

function moveGallery(e:Event):void {
    var diff = mouseX - centerX;
    if (Math.abs(diff) > buffer) 
        speed = -(0.02 * (diff + (diff > 0 ? -buffer : buffer)));
    else
        speed = 0;

по запросу:

var centerX:Number = stage.stageWidth / 2;
var galleryWidth:Number = infiniteGallery.width;
var speed:Number = 0;
addEventListener(Event.ENTER_FRAME, moveGallery);

var buffer:Number = 100;

function moveGallery(e:Event):void {
    var diff = mouseX - centerX;
    if (Math.abs(diff) > buffer) 
        speed = -(0.02 * (diff + (diff > 0 ? -buffer : buffer)));
    else
        speed = 0;

    infiniteGallery.x += speed;

    if (infiniteGallery.x>0) {
        infiniteGallery.x = -galleryWidth / 2;
    }

    if (infiniteGallery.x < -galleryWidth / 2) {
        infiniteGallery.x = 0;
    }
}
...