【问题标题】:AS3 Inverted mask, MouseEvent.ROLL_OVER moves the maskAS3 反转掩码,MouseEvent.ROLL_OVER 移动掩码
【发布时间】:2011-01-17 03:13:34
【问题描述】:

我正在尝试让我的图像在 AS3 中看起来很棒。我想创建“移动背景”的效果。例如,我的图像是 200 x 200,我的蒙版是 200 x 40。当我悬停时,我希望背景移动而蒙版保持不动。

由于 AS3 没有反转蒙版选项,我发现我必须使用 BlendMode 并将蒙版添加到我的父图层。我认为这就是问题所在。如果我想改变遮罩的 Y 位置(我不能因为遮罩没有启用 MouseEvents),要么全部改变,要么全部改变。要么整张图片(包括蒙版)掉下来,要么什么都没有发生。

这是我的一些代码,我真的希望有人知道如何解决这个看起来很简单的问题。啊! (我有一个负责加载图像的自定义 ImageLoader 类)

var imageLoader:ImageLoader = new ImageLoader();
imageLoader.url = "image.jpg";
imageLoader.blendMode = BlendMode.LAYER;
imageLoader.addEventListener(ImageLoader.IMAGE_LOADED, imageLoadedHandler);

var maskContainer:Sprite = new Sprite();
with (maskContainer.graphics) {
 beginFill(0x000000);
 drawRect(0, 0, 200, 40);
 endFill();
}

maskContainer.blendMode = BlendMode.ERASE;

private function imageLoadedHandler(e:Event):void {
 // Ofcourse, here is where the problem starts. 
 // I HAVE to addChild the mask to the imageLoader, so everything comes down/up.
 addChild(imageLoader);
 imageLoader.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
 imageLoader.addChild(maskContainer);
}

private function rollOverHandler(e:MouseEvent):void {
 imageLoader.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
 imageLoader.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}


private function mouseMoveHandler(e:MouseEvent):void{
 trace("move");
 imageLoader.y = e.currentTarget.mouseY;
}

提前致谢。

【问题讨论】:

  • 我不明白为什么你需要经历这一切,为什么你不能只创建图像和蒙版,然后在鼠标悬停时移动图像,并保持蒙版静止?
  • 这就是我想要做的丹尼尔。问题是,由于我需要一个倒置蒙版(我只想查看 200x40 矩形内的内容),我需要将蒙版添加到图像中并更改它们的混合模式,如此处所述。 franto.com/inverse-masking-disclosed
  • 您似乎过于复杂了,请尝试将其简化为满足您需要的更简单的块/原型。看看我在下面展示的例子,你不需要反转蒙版,因为这就是它的意思,你不应该需要这些东西的混合模式。

标签: flash actionscript-3 masking


【解决方案1】:

我想我明白你遇到的问题。

问题是您将事物分配给imageLoader,而不是添加imageHolder Sprite

那么你可以移动位图而不是移动精灵。 我只是在 Flash 中快速完成此操作,并将 IMG 添加到库中,但您可以替换占位符+加载器,这无论如何都是理想的,因为您可以有一个占位符表示“正在加载”,因为您正在动态加载内容。

var imageHolder:Sprite = new Sprite();
addChild(imageHolder);
var bmp:Bitmap = new Bitmap(new IMG);
imageHolder.addChild(bmp);
var maskContainer:Sprite = new Sprite();
with (maskContainer.graphics) {
 beginFill(0x000000);
 drawRect(0, 0, 200, 40);
 endFill();
}

imageHolder.mask = maskContainer;

imageHolder.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);

function rollOverHandler(e:MouseEvent):void {
 imageHolder.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
 imageHolder.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}

function mouseMoveHandler(e:MouseEvent):void{
 trace("move");
 bmp.y = -e.currentTarget.mouseY;
}

【讨论】:

  • 看在上帝的份上,我总是把事情搞得太复杂。说到一个坏习惯……为什么我想不出再做一个父容器的想法,太明显了。我在想什么,BlendModes?!感谢一百万丹尼尔!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2020-12-22
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多