我是AS3的新手,一直致力于用AS3编写的XML驱动导航系统。
目前,我已导入XML文件的内容,并将其绘制在舞台上动态创建的包含在根级别的MovieClip内。这个MovieClip被称为'容器'。
我想要实现的是平滑,加速/减速效果,它根据鼠标光标相对于舞台中间的位置,沿X轴动画容器动画片段。
我的代码可在此处找到:http://pastie.org/521432
第87行以后是我正在使用的代码,用于使影片剪辑向左滚动和放大右。
我所做的工作虽然有点笨拙,但确实有效 - 我只是希望它更加精致,并且在Google上留下了空白。因为即使鼠标停止移动,我希望MovieClip继续以当前相对速度滚动,我使用了Timer类的实例。
有人可以建议改进吗?提前谢谢。
答案 0 :(得分:4)
您应该将计算和绘图方法分开。因此,它在 onMouseMove 处理程序中执行所有计算,但实际上是在 onEnterFrame 处理程序中绘制更改。
此外,我认为您的算法可能更简单,没有人会注意到。我快速举了一个例子,说明如何做到这一点。将此代码粘贴到名为 Main.as 的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;
}
}
}