Flash CS4 AS3 마우스 이동으로 스크롤하는 수평 movieclip 스크롤
-
06-07-2019 - |
문제
저는 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;
}
}
}