Часто необходимо скрыть все то, что находится за пределами флешки… Этот класс поможет вам в этом.
Вот весь код класса:
package com.byflasher.utils { import flash.display.Sprite; /** * @author Maxim Sidorkin aka hitab * @site http://byflasher.com/ */ public class Mask extends Sprite { private var _screen:Sprite; private var _x:Number; private var _y:Number; private var _width:Number; private var _height:Number; /** * _screen - MovieClip или Sprite, для которого будет применена маска * _width - ширина маски, если не установлена, то будет использована _screen.width (однако надо быть увереным, что _screen не пуст!) * _height - высота маски, если не установлена будет использована _screen.height * _x - положение макси по x * _y - положение маски по y */ public function Mask(_screen:Sprite, _width:Number = 0, _height:Number = 0, _x:Number = 0, _y:Number = 0) { this._screen = _screen; this._width = _width; this._height = _height; this._x = _x; this._y = _y; addMask(); } private function addMask():void { /* * Убедитесь, что _screen.width и _screen.height не раны 0 * */ _width = _width == 0 ? _screen.width : _width; _height = _height == 0 ? _screen.height : _height; /* * Рисуем черыхугольник для маски */ graphics.beginFill(0x000000, 1); graphics.drawRect(_x, _y, _width, _height); /* * Добавляем маску в список отображения(при скэйлинге маска тоже будет скэйлится) и устанавливаем маску */ _screen.addChild(this); _screen.mask = this; } } }
А вот способ применения, этот код записан в классе Main
/* * Создаем маску, которая будет скрывать все, * что находится за пределами сцены * */ new Mask(this, 640, 480);
upd
package com.byflasher.utils { import flash.display.Sprite; /** * @author Maxim Sidorkin aka hitab * @site http://byflasher.com/ */ public class Mask1 extends Sprite { // На сколько будут выпирать границы прямоугольников private const RECT_SIZE:int = 300; /** * _screen - MovieClip или Sprite, для которого будет применена маска * _width - ширина маски, если не установлена, то будет использована _screen.width (однако надо быть увереным, что _screen не пуст!) * _height - высота маски, если не установлена будет использована _screen.height * _color - цвет четырехугольников, по дефолту белый * _x - положение макси по x * _y - положение маски по y */ public function Mask1(_screen:Sprite, _width:Number = 0, _height:Number = 0, _color:uint = 0xFFFFFF, _x:Number = 0, _y:Number = 0) { addRectanglesOutStage(_screen, _width, _height, _color, _x, _y); } private function addRectanglesOutStage(_screen:Sprite, _width:Number, _height:Number, _color:uint, _x:Number, _y:Number):void { graphics.beginFill(_color, 1); /* * Рисуем верхний черыхугольник */ graphics.drawRect(_x - RECT_SIZE, _y - RECT_SIZE, 2 * RECT_SIZE + _width, RECT_SIZE); /* * Рисуем левый черыхугольник */ graphics.drawRect(_x - RECT_SIZE, _y, RECT_SIZE, _height); /* * Рисуем правый черыхугольник */ graphics.drawRect(_x + _width, _y, RECT_SIZE, _height); /* * Рисуем нижний черыхугольник */ graphics.drawRect(_x - RECT_SIZE, _y + _height, 2 * RECT_SIZE + _width, RECT_SIZE); graphics.endFill(); cacheAsBitmap = true; _screen.parent.addChild(this); } } }
27 января 2012, 13:09
DisplayObject.scrollRect тебе в помощь!!!
27 января 2012, 18:44
нашлепки круче)
кажеться кто-то говорил, что из-за него фпс немного падал
28 января 2012, 20:21
На 100% потвердить/опровергнуть немогу, но одно я знаю точно: scrollRect просто не дает выводить изображение вне заданой области, а маска делает то же самое, но еще она ложится поверх маскируемого контента и тянет на себя все MouseEvent`ы. Так что делаю вывод, что маска имеет смысл лиш тогда, когда “подглядывать” нужно в область, отличную от прямоугольной
28 января 2012, 20:39
обновил запись,
в этом способе за сценой рисуются 4 больших прямоугольных нашлепка в цвет сцены, в таком случае на производительность влиять не должно(думал об этом варианте идет речь)
а что лучше scrollRect или эти нашлепки надо проводить тесты, при нашлепках се равно отрисовываются объекты за сценой, а как понимаю при scrollRect область отрисовки только этот квадрат?
28 января 2012, 21:05
Точнее – прямоугольник.
Через scrollRect парни из Adobe реализовали все свои скролящиеся компоненты. Надеюсь это они сделали потому, что так лучше, а не для раскрутки нового метода DisplayObject`ов…
Мне было немного неудобно с ним по началу, потому как я тоже использовал маски (с ними во Flash IDE удобно работать), но когда разделил рабочий прцесс на создание мувиков и написание чистого кода, то все удобства масок сократились лиш к тому, что область отрисовки может быть произвольной.
28 января 2012, 21:10
К стати, твой “Первый урок” как раз демонстрирует достоинство масок! Я о градиентной заливке текста. Когдато тоже делал такое, но там градиент был анимирован.
28 января 2012, 22:27
Может и так.
Но я уж привык к этому способу ;)