Flash AS3 - 为可拖动的动画片段添加反射/镜像

时间:2012-05-25 14:56:11

标签: actionscript-3 reflection drag mirror

我需要创建一个从1张图片创建图案形状的flash文件。它需要反映或镜像已加载的可拖动动画片段 - 在移动时使用反射/镜像更新并在舞台上拖动动画片段。

我遇到过:http://active.tutsplus.com/freebies/actionscript-30-classes/dynamic-reflection-generator-class-for-as3/ 这与我追求的非常相似。该演示似乎没问题,但在评论中,拖动有很多减速和滞后,尤其是当您拖动的图像开始变大时。

对于要求看起来相当多的东西感到抱歉,我不是在完整的解决方案之后,我只需要先知道是否可以完成以及如何实现它?

我希望以下图片可以帮助解释:

第1阶段: 将用户模式图像加载到舞台上,如下所示:

http://www.tiltworld.co.uk/yhfus6fh/pattern_1.png

第2阶段: 显示我希望反射如何工作 - 在模式的每一侧有4个块:

... / pattern_2.png

(与上面的链接相同,最后只有pattern_2.png)

第3阶段: 获得反射以适应用户在舞台上拖动模式的位置。如在图像中,反射发生在每侧的4个块内,而不是直接附着在原始动画片段上/旁边。

... / pattern_3.png

(与上面的2相同的链接只是最后的pattern_3.png)

劳伦:)

P.S。我下面的当前代码显示了当前的第1阶段 - 如何使用fileReference.load将模式加载到舞台上,然后使用startDrag将其拖动到舞台上。

// Create FileReference.
var draggableMC:FileReference;

// Create Loader to hold image content
var draggable_mc_loader:Loader = new Loader();
var draggable_mc_content:Sprite = new Sprite();

// Select Button Function.
select_btn.addEventListener(MouseEvent.CLICK, onselect_btnClicked);

function onselect_btnClicked(event:MouseEvent):void {
draggableMC=new FileReference();
draggableMC.addEventListener(Event.SELECT, onFileSelected);
var imageTypeFilter:FileFilter = new FileFilter("JPG/PNG Files","*.jpeg; *.jpg;*.gif;*.png");
draggableMC.browse([imageTypeFilter]);
}

// File Selected Function.
function onFileSelected(event:Event):void {
draggableMC.addEventListener(Event.COMPLETE, onFileLoaded);
draggableMC.load();
}

// File Loaded Function.
function onFileLoaded(event:Event):void {
var fileReference:FileReference=event.target as FileReference;

var data:ByteArray=fileReference["data"];
var movieClipLoader:Loader=new Loader();
movieClipLoader.loadBytes(data);
movieClipLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieClipLoaderComplete);

draggableMC.removeEventListener(Event.COMPLETE, onFileLoaded);
}

// Load Image onto Stage Function.
function onMovieClipLoaderComplete(event:Event):void {
var loadedContent:DisplayObject=event.target.content;
draggable_mc_loader =event.target.loader as Loader;
draggable_mc_loader.x=10;
draggable_mc_loader.y=10;
draggable_mc_content.buttonMode=true;
draggable_mc_content.addChild(draggable_mc_loader);
addChild(draggable_mc_content);
}

// Drag
draggable_mc_content.addEventListener(MouseEvent.MOUSE_DOWN, drag);
stage.addEventListener(MouseEvent.MOUSE_UP, drop);

function drag(event:Event):void {
draggable_mc_content.startDrag();
}
function drop(event:Event):void {
draggable_mc_content.stopDrag();
}

1 个答案:

答案 0 :(得分:0)

是的,这可以完全完成,你尝试过使用他的组件吗?在查看附加到你链接的组件的fla中的代码时,他在MouseMove上更新它是不理想的,可以在单帧循环中调度多个移动事件(默认帧速率我认为是24每1 / 24th一秒钟将是一个帧循环,基于MouseMove的更新将不必要地快速)。如果它被简单地调整为打开一个定时器,该定时器在单击对象后每10秒钟打勾一次(鼠标按下然后在鼠标向上或关闭时关闭),而不是尝试为每个鼠标移动事件执行此操作显着提高性能。此外,他在代码中遇到了一些效率低下的问题,并且正如他所说的那样,如果你需要为某些任务进行优化然后优化它,他会免费提供它。他的代码中的一些其他低效率是在方法调用中创建对象,可以将其引入构造函数和过滤器的使用,在这些示例中,这些对象似乎并不是必需的。刚刚在今天早些时候关于AS3优化的这篇文章中偶然发现了Jason Sturges的个人资料What are the major performance hitters in AS3 aside from rendering vectors?