7

Часто необходимо скрыть все то, что находится за пределами флешки… Этот класс поможет вам в этом.

Вот весь код класса:

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);
Скачать Mask.as (51)

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);
 
                }
 
        }
 
}

Отзывов (7) на «Небольшой класс, который добавляет маску на всю сцену»

  1. elder_Nosferatu

    DisplayObject.scrollRect тебе в помощь!!!

  2. byflasher

    нашлепки круче)
    кажеться кто-то говорил, что из-за него фпс немного падал

  3. elder_Nosferatu

    На 100% потвердить/опровергнуть немогу, но одно я знаю точно: scrollRect просто не дает выводить изображение вне заданой области, а маска делает то же самое, но еще она ложится поверх маскируемого контента и тянет на себя все MouseEvent`ы. Так что делаю вывод, что маска имеет смысл лиш тогда, когда “подглядывать” нужно в область, отличную от прямоугольной

  4. byflasher

    обновил запись,
    в этом способе за сценой рисуются 4 больших прямоугольных нашлепка в цвет сцены, в таком случае на производительность влиять не должно(думал об этом варианте идет речь)
    а что лучше scrollRect или эти нашлепки надо проводить тесты, при нашлепках се равно отрисовываются объекты за сценой, а как понимаю при scrollRect область отрисовки только этот квадрат?

  5. elder_Nosferatu

    Точнее – прямоугольник.

    Через scrollRect парни из Adobe реализовали все свои скролящиеся компоненты. Надеюсь это они сделали потому, что так лучше, а не для раскрутки нового метода DisplayObject`ов…

    Мне было немного неудобно с ним по началу, потому как я тоже использовал маски (с ними во Flash IDE удобно работать), но когда разделил рабочий прцесс на создание мувиков и написание чистого кода, то все удобства масок сократились лиш к тому, что область отрисовки может быть произвольной.

  6. elder_Nosferatu

    К стати, твой “Первый урок” как раз демонстрирует достоинство масок! Я о градиентной заливке текста. Когдато тоже делал такое, но там градиент был анимирован.

  7. byflasher

    Может и так.
    Но я уж привык к этому способу ;)


Трекбеки/Пинги


Ваш отзыв