Flash / Actionscript Tween не гладкий - PullRequest
0 голосов
/ 20 июля 2011

Я использую Flash - Actionscript 3.0 - для загрузки путей изображений (и, в конечном счете, изображений) из файла XML, а затем я использую класс Tweener для анимации анимации прокрутки по заголовку.

Проблема: прокрутка не плавная, она довольно изменчивая, и я не могу понять, почему.

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

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

http://community.greencupboards.com/2011/07/15/lions-fighting-extinction/

Спасибо!

РЕДАКТИРОВАТЬ: Код запрошен

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import caurina.transitions.*

var imageLoader:Loader;
var currentLoader:Loader;
var xml:XML;
var xmlList:XMLList;
var xmlLoader:URLLoader = new URLLoader();
var xmlLoader2:URLLoader = new URLLoader();
var k:int;
var iterator:int = 0;
var imageCount:int;

//********** Begin editable region *************///
//---------------------------------------------
//dont change startX unless you are sure -> 
//start coordinates are affected by more than this variable
var startX:Number = 690;
//change endX to extend the scroll length
var endX:Number = 20;
//change scrollSpeed to change speed of images
var scrollSpeed:Number = 32;
//---------------------------------------------
//********** End editable region **************///

var ratio:Number = scrollSpeed/(startX-endX);
var rate:Number = (startX-endX)/scrollSpeed;

//align tabs under heading
setChildIndex(headertab,1);

// ----- Program Main ----- //
initializeMouseEvents();
Main_Begin();

//@ initializes mouse events for url navigation
function initializeMouseEvents():void
{
Mouse.cursor = flash.ui.MouseCursor.BUTTON
headertab.addEventListener(MouseEvent.ROLL_OVER, expandTab);
headertab.addEventListener(MouseEvent.ROLL_OUT, shrinkTab);
function expandTab(e:MouseEvent):void
{
    Tweener.addTween(headertab, {y:5, time:.1, delay:0, transition:"linear"});
}
function shrinkTab(e:MouseEvent):void
{
    Tweener.addTween(headertab, {y:0, time:.1, delay:0, transition:"linear"});
}
stage.addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void
{
    navigateToURL(new URLRequest("http://www.greencupboards.com"), "_blank");
}
}

function Main_Begin():void
{
xmlLoader.load(new URLRequest("http://www.greencupboards.com/media/community/scroll/images.xml"));
xmlLoader.addEventListener(Event.COMPLETE, loadInitialXml);

function loadInitialXml(event:Event):void
{
    xml = XML(event.target.data);
    xmlList = xml.children();
    imageCount = xmlList.length();
    for(var j:int = 1; j < 10; j++)
    {
        k = imageCount - j;
        imageLoader = new Loader();
        imageLoader.name = "loader"+j;
        imageLoader.load(new URLRequest(xmlList[k].source));
        imageLoader.x = endX + 60*(j+1) + 10;
        imageLoader.y = 37;
        //imageLoader.addEventListener(MouseEvent.ROLL_OVER, pauseAll);
        //imageLoader.addEventListener(MouseEvent.ROLL_OUT, resumeAll);
        addChild(imageLoader);
        setChildIndex(imageLoader,1);
        //Tweener.addTween(imageLoader, {alpha:1, time:1.4, delay:0, transition:"linear"});
        Tweener.addTween(imageLoader, {x:endX, time:rate*(j+1)/7.2, delay:0, transition:"linear"});
        Tweener.addTween(imageLoader, {alpha:0, time:2, delay:(rate*(j+1)/7.5)-4, transition:"linear"});
        imageLoader.unload();
    }

    //first scrolling images to fade in
    loadXML();
    //loop of scrolling images infinetely
    function loop():void 
    {
        loadXML();
    }
    setInterval(loop,(  ((imageCount*60))/rate)*1000   );

//imageLoader.name = xmlList[i].attribute("source");
}
}

function loadXML()
{
xmlLoader2.load(new URLRequest("http://www.greencupboards.com/media/community/scroll/images.xml"));
xmlLoader2.addEventListener(Event.COMPLETE, xmlLoaded);

function xmlLoaded(event:Event):void
{
    xml = XML(event.target.data);
    xmlList = xml.children();
    imageCount = xmlList.length();
    for(var i:int = 0; i < xmlList.length(); i++)
    {
        imageLoader = new Loader();
        imageLoader.name = "loader"+i;
        imageLoader.load(new URLRequest(xmlList[i].source));
        imageLoader.x = startX + 60*i;
        imageLoader.y = 37;
        imageLoader.alpha = -1;
        //imageLoader.addEventListener(MouseEvent.ROLL_OVER, pauseAll);
        //imageLoader.addEventListener(MouseEvent.ROLL_OUT, resumeAll);
        addChild(imageLoader);
        setChildIndex(imageLoader,1);
        makeTween(imageLoader);
        iterator++;
    }
iterator = 0;
//imageLoader.name = xmlList[i].attribute("source");
}
}

function resumeAll(event:Event):void
{
    Tweener.resumeAllTweens();
}

function pauseAll(event:Event):void
{
    Tweener.pauseAllTweens();
}

function makeTween(obj:Loader):void
{
Tweener.addTween(obj, {alpha:1, time:2, delay:60*ratio*iterator+3.3, transition:"linear"});
Tweener.addTween(obj, {x:endX, time:(scrollSpeed + 60*ratio*iterator), delay:0, transition:"linear", onComplete:unloadObject(obj)});
}

function unloadObject(obj:Object):void
{
//iterator - 2 simply creates a big enough delay.  I think the scroll gets ahead of fadeout so it needs this buffer to run many times
Tweener.addTween(obj, {alpha:0, time:2, delay:(scrollSpeed + 60*ratio*(iterator-2)), transition:"linear"});
obj.unload();
}

Ответы [ 3 ]

1 голос
/ 21 июля 2011

иногда лучший способ создания анимации - это анимация вручную с помощью события ENTER_FRAME.

Мой совет: избавьтесь от Tweener и напишите свой собственный цикл анимации.

package 
{
  import flash.display.Sprite;
  import flash.events.Event;

  [SWF(width="400", height="100", frameRate="30", backgroundColor="#FFFFFF")]
  public class Main extends Sprite
  {
    private var items : Array;
    public function Main()
    {
        items = [];
        var curx:int = 0;
        // create some items
        for (var i:int=0;i<10;i++)
        {
            var s:Sprite = new Sprite();
            s.x = curx;
            s.graphics.beginFill(0xff0000*i/10, 1);
            s.graphics.drawRect(0, 0, 20, 40);
            items.push(s);

            addChild(s);
            curx += s.width + 6;
        }
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private function onEnterFrame(event : Event) : void 
    {
        var i:int = items.length-1;
        var s:Sprite;
        while (i >= 0)
        {
            s = items[i] as Sprite;
            if (s.x <= -20) {
                s.x = stage.stageWidth;
            }
            s.x -= 2;
            --i;                
        }
    }
  }
}

и работающий пример: http://wonderfl.net/c/nhhM

cheers

1 голос
/ 20 июля 2011

ОБНОВЛЕНИЕ

Не добавляйте загрузчик напрямую на сцену.(плохая практика с моей точки зрения)

addChild(imageLoader);

вместо этого сделайте это так:

imageLoader.loaderInfo.addEventListener ( Event.COMPLETE, handleLoadComplete );

ОРИГИНАЛ

Вот как выможет сгладить растровое изображение:

private function handleLoadComplete ( e : Event ) : void
{
    imageLoader.loaderInfo.removeEventListener( Event.COMPLETE, handleLoadComplete );
    var bitmap:Bitmap = Bitmap (loader.content); //get the loaders content as a bitmap
    bitmap.smoothing = true;//turn on smoothing
    location.addChilc ( bitmap ) // add the bitmap to you desired location
}

Причина, по которой ваша анимация прерывистая, заключается в том, что она замедляется.

Увеличьте частоту кадров вашего флэш-фильма.И увеличить скорость анимации.

0 голосов
/ 22 июля 2011

Если вы хотите, чтобы программная анимация была сделана, я бы порекомендовал использовать библиотеку TweenLite (http://www.greensock.com/tweenlite/). Я приведу небольшой пример ниже, чтобы показать вам, насколько простой может быть анимация.

private function startAnimation():void
{
    for each(var yourImage:Bitmap in SomeArrayYouCollectTheImagesIn)
    {
        TweenLite.to(yourImage, timeItShouldTake, {x: X-PositionToGoTo, onComplete: someFunction, onCompleteParams: [yourImage]});
    }
}

private function someFunction(image:Bitmap):void
{
    //You can reposition your image here
}

private function stopAnimation(image:Bitmap):void
{
    TweenLite.killTweensOf(image);
}
...