Question

Je suis nouveau sur AS3 et je travaille sur un système de navigation basé sur XML écrit en AS3.

À l'heure actuelle, j'ai importé le contenu d'un fichier XML et l'ai tracé dans un MovieClip contenant créé de manière dynamique sur la scène. Ce MovieClip s’appelle 'conteneur'.

Ce que je veux accomplir est un effet d’accélération / décélération progressif qui anime le clip du conteneur le long de l’axe X en fonction de l’emplacement du curseur de la souris par rapport au milieu de la scène.

Mon code est disponible ici: http://pastie.org/521432

La ligne 87 et suivantes sont le code que j'utilise actuellement pour faire défiler le MovieClip vers la gauche & amp; à droite.

Ce que je travaille ne fonctionne pas, mais est maladroit, mais fonctionne. Je veux simplement que ce soit un peu plus poli et je n'ai rien en commun avec Google. Parce que je veux que MovieClip continue de défiler à la vitesse relative actuelle même lorsque la souris cesse de bouger, j'ai utilisé une instance de la classe Timer.

Quelqu'un peut-il suggérer des améliorations? Merci d'avance.

Était-ce utile?

La solution

Vous devez séparer vos calculs et vos méthodes de dessin. Demandez-lui de faire tous les calculs dans un gestionnaire onMouseMove , mais dessinez en réalité les modifications dans un gestionnaire onEnterFrame .

De plus, je pense que votre algorithme pourrait être beaucoup plus simple et que personne ne le remarquerait. J'ai donné un exemple rapide de la façon dont vous pourriez le faire. collez ce code dans un fichier AS3 nommé Main.as et transformez-le en classe de document d'une nouvelle FLA.

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

    public class Main extends Sprite 
    {
        private const boxCount:int = 10;
        private const boxWidth:int = 45;
        private const boxMargin:int = 5;
        private const startPoint:int = 150;
        private const boxesWidth:int = boxCount * (boxWidth + boxMargin);
        private const endPoint:int = boxesWidth + startPoint;
        private const zeroPoint:int = boxesWidth / 2 + startPoint;

        private var container:MovieClip;
        private var targetX:Number;
        private var speed:Number = 0;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            container = new MovieClip();
            addChild(container);
            container.x = 150;
            container.y = 300;
            for (var i:int = 0; i < boxCount; i++) 
            {
                container.graphics.beginFill(Math.random() * 0xFFFFFF);
                container.graphics.drawRect(i*(boxWidth+boxMargin), 0, boxWidth, boxWidth);
            }

            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
        }

        private function mouseMoveHandler(e:MouseEvent):void 
        {
            var distanceFromCenter:int = stage.mouseX - zeroPoint;
            speed = distanceFromCenter * -0.01; // Bring number into a good range, and invert it.
        }

        private function enterFrameHandler(e:Event):void 
        {
            container.x += speed;
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top