AS3 Инвертированная маска, MouseEvent.ROLL_OVER перемещает маску - PullRequest
1 голос
/ 17 января 2011

Я пытаюсь, чтобы мои изображения выглядели потрясающе в 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;
}

Заранее спасибо.

1 Ответ

2 голосов
/ 17 января 2011

Мне кажется, я понял проблему, с которой вы столкнулись.

Проблема в том, что вы назначаете вещи для 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;
}
...