문제

저는 AS3을 처음 접했고 AS3로 작성된 XML 구동 내비게이션 시스템에서 작업하고 있습니다.

현재, 나는 XML 파일의 내용을 가져 와서 무대에서 동적으로 루트 레벨에서 생성 된 포함 된 movieclip 내부에 그렸습니다. 이 movieclip을 '컨테이너'라고합니다.

내가 달성하고 싶은 것은 마우스 커서가 스테이지 중간과 관련하여 X 축을 따라 컨테이너 movieclip을 애니메이션하는 부드럽고 가속 / 감소 효과입니다.

내 코드는 여기에서 찾을 수 있습니다. http://pastie.org/521432

87 행은 MovieClip 스크롤을 왼쪽 및 오른쪽으로 만들기 위해 지금 사용하고있는 코드입니다.

내가 가지고있는 것은 작동하지만 어색하지만 효과가 있습니다. 나는 단지 조금 더 세련되고 Google과 공백을 그렸습니다. MovieClip이 마우스가 움직이지 않아도 현재 상대 속도로 계속 스크롤하기를 원하기 때문에 타이머 클래스의 인스턴스를 사용했습니다.

누구든지 개선을 제안 할 수 있습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

계산과 드로잉 방법을 분리해야합니다. 따라서 모든 계산을 수행하십시오 onMouseMove 핸들러이지만 실제로 변경 사항을 그립니다 onenterframe 매니저.

또한 알고리즘이 훨씬 단순하고 아무도 눈치 채지 못할 것이라고 생각합니다. 나는 당신이 어떻게 할 수 있는지에 대한 빠른 예를 만들었습니다. 이 코드를 호출 된 AS3 파일에 붙여 넣으십시오 메인 그리고 그것을 만드십시오 문서 클래스 새로운 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;
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top