понедельник, 16 ноября 2009 г.

Перекрытие мувика и mouseEnabled

Бывают ситуации когда один мувик перекрывает другой и, даже если верхний мувик прозрачный, то до нижнего не достучаться и даже при наведении на него не работает buttonMode и useHandCursor, и смена иконки курсора при наведении на него не происходит.

Тогда нам поможет волшебное свойство mouseEnabled, просто пишем:

top_mc.mouseEnabled = false;

и верхний мувик не мешает нам работать дальше.

среда, 21 октября 2009 г.

Удаления дубликатов из массива на actionscript 3

Наткнулся в интернете на код на actionscript 3, позволяющий удалять повторяющиеся значений из массива (код удаляет все найденные дубликаты, трипликаты и тд).
Код полезен и интересен тем, что показывается использование довольно новой функции array.some(), но недостатком является то, что не зная эту функцию сложно понять его работу. Этот же код можно переписать более просто и понятно.

Смысл работы прост - проверяем в цикле есть ли уже такое значение в нашем новом массиве, и если нет добавляем.

Код для удаления дубликатов из массива на actionscript3 для flash

package
{
  import flash.display.Sprite;

  /**
   * ...
   * @author andrew
   */

  public class Test extends Sprite
  {
    public function Test()
    {
      var originalArray:Array = new Array("yellow", "red", "blue", "red", "yellow", "green", "yellow", "purple", "ginger", "red", "blue");
      var dedupedArray:Array = new Array();

      function ArrayProcess()
      {
        for each (var item:String in originalArray)
        {
          if (dedupedArray.indexOf(item)===-1)
          {
            dedupedArray.push(item);
          }
        }
        trace("dedupedArray: "+dedupedArray);
      }

      ArrayProcess();
    }
  }
}

воскресенье, 4 октября 2009 г.

Класс на as3 для эффекта волн (ряби)

Не помню уже где нашел в сети скрипт на actionscript 2 для анимации волн (эффект ряби), решил переписать его для as3.
Результат работы можно увидеть ниже.

Для использования надо просто создать мувик с нужной картинкой,
присвоить ему класс asflash.Wave
и поместить его на сцену.
Скорость и направление ряби задается параметром в вызове функции makeWave(-0.1), знак отвечает за направление, значение за скорость волн.


Эффект волн (ряби) на actionscript3 для flash
Класс Wave - Wave.as

package asflash
{
 /**
  * ...
  * @author andrew
  * @web http://as-flash.blogspot.com
 */

 import flash.display.*;
 import flash.geom.*;
 import flash.filters.*;
 import flash.utils.*;
 import flash.events.*;

 public class Wave extends MovieClip
 {
  private var w:Number;
  private var h:Number;

  private var ripple:BitmapData;
  private var ripple3:BitmapData;
  private var ripple2:BitmapData;
  private var ripple1:BitmapData;
  private var gradient:BitmapData;
  private var gradient_mc:BitmapData;

  private var offset3:Point;
  private var offset2:Point;
  private var offset1:Point;

  private var speed1:Number;
  private var speed2:Number;
  private var speed3:Number;

  private var pt:Point;
  private var rect:Rectangle;

  private var dMap:DisplacementMapFilter;

  private var r1pt:Point;
  private var r2pt:Point;
  private var r3pt:Point;
  private var r1rect:Rectangle;
  private var r2rect:Rectangle;
  private var r3rect:Rectangle;
  private var seed:Number;

  public function Wave()
  {
   makeWave(-0.1);
  }

  public function makeWave(str=-0.1)
  {

   w = this.width;
   h = this.height;

   ripple = new flash.display.BitmapData(w, h);
   ripple3 = new flash.display.BitmapData(w, h / 2);
   ripple2 = new flash.display.BitmapData(w, h / 4);
   ripple1 = new flash.display.BitmapData(w, h / 4);
   gradient = new flash.display.BitmapData(ripple.width, ripple.height);
   gradient.draw(gradient, new flash.geom.Matrix(1, 0, 0, 1, 0, 0));

   offset3 = new flash.geom.Point(0, 0);
   offset2 = new flash.geom.Point(0, 0);
   offset1 = new flash.geom.Point(0, 0);
   speed1 = 1*str;
   speed2 = 2*str;
   speed3 = 4*str;
   pt = new flash.geom.Point(0, 0);
   rect = new flash.geom.Rectangle(0, 0, ripple.width, ripple.height);

   this.addEventListener(Event.ENTER_FRAME, showWave);

   r1rect = new flash.geom.Rectangle(0, 0, ripple1.width, ripple1.height);
   r2rect = new flash.geom.Rectangle(0, 0, ripple2.width, ripple2.height);
   r3rect = new flash.geom.Rectangle(0, 0, ripple3.width, ripple3.height);
   r1pt = new flash.geom.Point(0, 0);
   r2pt = new flash.geom.Point(0, ripple1.height);
   r3pt = new flash.geom.Point(0, ripple1.height + ripple2.height);
  }

  private function showWave(e:Event)
  {
   offset1.y = offset1.y + speed1;
   offset2.y = offset2.y + speed2;
   offset3.y = offset3.y + speed3;

   seed = 0;

   ripple3.perlinNoise(0, 12, 1, seed, true, true, 1, true, [offset3]);
   ripple2.perlinNoise(0, 8, 1, seed, true, true, 1, true, [offset2]);
   ripple1.perlinNoise(0, 4, 1, seed, true, true, 1, true, [offset1]);


   ripple.copyPixels(ripple1, r1rect, r1pt);
   ripple.copyPixels(ripple2, r2rect, r2pt);
   ripple.copyPixels(ripple3, r3rect, r3pt);
   ripple.merge(gradient, rect, pt, 127, 127, 127, 127);
   dMap = new flash.filters.DisplacementMapFilter(ripple, pt, 0, 1, 100, 100, DisplacementMapFilterMode.WRAP);
   this.filters = [dMap];
  };
 }
}

суббота, 3 октября 2009 г.

Парсинг JSON без библиотек в одну строку

json

Легкий и простой способ парсить JSON, без использования сторонних библиотек предложен Tyler Larson на cookbooks.adobe.com

public function decode( data:String ):void
{
   return ExternalInterface.call("function(){return " + data + "}");
}

суббота, 26 сентября 2009 г.

1151 A conflict exists with definition your_mc in namespace internal

Ошибка "1151: A conflict exists with definition your_mc in namespace internal" возникает в среде разработки Flash при программировании на actionscript 3, когда вы пытаетесь еще раз задекларировать уже существующие экземпляры.

Чтобы избавиться от нее нужно отключить автоматическую декларацию экземпляров в настройках публикации flash:

File -> Publish settings -> Flash -> Settings (возле "Script:" Actionscript 3.0) ->
убрать галочку с чекбокса "Automatically declare stage instances".

Только не забудьте определить ваш мувик your_mc в классе как public.

суббота, 18 июля 2009 г.

Использование useHandCursor в MovieClip на AS3

Чтобы использовать курсор на мувиках(MovieClip) в AS3 недостаточно прописать:

mc.useHandCursor = true;

надо еще включить "режим кнопки":

mc.buttonMode = true;
mc.useHandCursor = true;


Вот теперь все будет работать.

воскресенье, 28 июня 2009 г.

IE vs Flash (AS3)

Решил тут записывать о моментах возникающих в разработке на Flash (AS), себе для памяти, а может кому еще пригодится.

Практически все знают, что IE очень своеобразный браузер, но он все еще не перестает меня удивлять. Даже казалось бы в кроссплатформенный флеш он вносит свои коррективы.

IE VS Flash

Итак был себе мирно код для прелоадера на AS3, никого не трогал:


loaderInfo.addEventListener(ProgressEvent.PROGRESS, loadingListener);
private function loadingListener (e:ProgressEvent):void
{
  if(e.bytesLoaded>=e.bytesTotal)
  {
    gotoAndStop(2);
  }
}



Но, оказывается, если Internet Explorer закэшировал флешку, то ProgressEvent не работает.
Поэтому, надо использовать старый добрый onEnterFrame:


root.addEventListener("enterFrame",onEnterFrame);
function onEnterFrame(e:Event)
{
  if(loaderInfo.bytesLoaded >= loaderInfo.bytesTotal)
  {
    gotoAndStop(2);
    root.removeEventListener("enterFrame",onEnterFrame);
  }
}



либо отдельно добавить проверку загрузки


if (loaderInfo.bytesLoaded >= loaderInfo.bytesTotal)
{
  gotoAndStop(2);
}

Приятного кодинга!