пятница, 2 мая 2008 г.

Queue

var ar=new Array();
ar.unshift(1);
ar.unshift(2);
trace(ar);

trace(ar.pop());
trace(ar.pop());

четверг, 24 апреля 2008 г.

Узанть URL страницы на котором запущена флэшка

var url:String = ExternalInterface.call ( "function() { return window.document.location.href }" );

четверг, 27 марта 2008 г.

пятница, 29 февраля 2008 г.

DataGrid cellRenerer для столбца

Поместить в первый кадр (На сцену перетащить компонет DataGrid обозвать dg, в либу поместить Button)
var sampleItem1:Object = { Name:"John Alpha",     Number:"555-123-0101", Email:"jalpha@fictitious.com" };
var sampleItem2:Object = { Name:"Mary Bravo", Number:"555-372-3322", Email:"mbravo@fictitious.com" };
var sampleItem3:Object = { Name:"Trevor Gamma", Number:"555-485-1212", Email:"tgamma@fictitious.com" };
var sampleItem4:Object = { Name:"Susan Delta", Number:"555-987-3434", Email:"sdelta@fictitious.com" };

//dg.setStyle('cellRenderer', MyRenderer);

dg.columns = ["Name", "Number", "Email"];

dg.addItem(sampleItem1);
dg.addItem(sampleItem2);
dg.addItem(sampleItem3);
dg.addItem(sampleItem4);
dg.addColumn("NewCol");
dg.getColumnAt(0).cellRenderer=MyRenderer;
dg.getColumnAt(1).cellRenderer=MyRenderer2;

MyRenderer.as:
package
{
import fl.controls.LabelButton;
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.ListData;
import fl.containers.BaseScrollPane;

public class MyRenderer extends LabelButton implements ICellRenderer {
private var _listData:ListData;
private var _data:Object;

public function MyRenderer() {
}

public function set listData(newListData:ListData):void {
_listData = newListData;
label = "Random: " + _listData.label;
drawRandomColor();
}

private function drawRandomColor():void {
graphics.beginFill(Math.random()*0xFFFFFF);
graphics.drawRect(0,0,20,20);
graphics.endFill();
}

public function get listData():ListData {
return _listData;
}

public function set data(newData:Object):void {
_data = newData;
}

public function get data():Object {
return _data;
}
}
}

MyRenderer2.as:
package
{
import fl.controls.LabelButton;
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.ListData;
import fl.containers.BaseScrollPane;
import flash.display.Sprite;
import flash.events.MouseEvent;

public class MyRenderer2 extends Sprite implements ICellRenderer {
private var _listData:ListData;
private var _data:Object;

public function MyRenderer2() {
this.graphics.lineStyle(1);
this.graphics.drawCircle(10, 10, 10);

this.addEventListener(MouseEvent.CLICK, mouseClickHandler);
}

private function mouseClickHandler(e:MouseEvent):void {
trace("cell clicked");
}

public function set listData(newListData:ListData):void {
_listData = newListData;
//label = "Random: " + _listData.label;
//drawRandomColor();
}

private function drawRandomColor():void {
graphics.beginFill(Math.random()*0xFFFFFF);
graphics.drawRect(0,0,20,20);
graphics.endFill();
}

public function get listData():ListData {
return _listData;
}

public function set data(newData:Object):void {
_data = newData;
}

public function get data():Object {
return _data;
}
public function get selected():Boolean {
return true;
}
public function set selected(value:Boolean):void {

}
public function setMouseState(state:String):void {
if (state == "over") { trace ("mouse Over") } ;
}
public function setSize(width:Number, height:Number):void {
this.width = width;
this.height = height;
}

public function setStyle(style:String, value:Object):void {

}

}
}

вторник, 26 февраля 2008 г.

Передача параметра EventHandler-у (хак от __etc)

Очень помог прием (хак) с функцией delegate

function resizeHandler(event:Event, ...rest):void {
trace(event, rest);
}
var delegate:Function = function(scope:Object, func:Function, ...rest):Function {
return function(...args):void {
func.apply(scope, args.concat(rest));
}
}
super.stage.addEventListener(Event.RESIZE, delegate(this, this.resizeHandler, 1, 2, 3));

понедельник, 25 февраля 2008 г.

Клик по вложенному мувику

Взято с форума, на заметку:

Есть MovieClip1, на нем событие MouseClick1
в этом MovieClip1 есть MovieClip2 и на нем тоже обработчик клика - MouseClick2. Когда нажимаем на MovieClip2 выполняются оба метода MouseClick1 и MouseClick2.
Как избежать? Хочу чтобы обрабатывался только MouseClick2.
Спасибо!

private function mouseClick1 (e:MouseEvent):void {
if (e.eventPhase == EventPhase.AT_TARGET) {
//
}
}

четверг, 14 февраля 2008 г.

TextField - концентратор багов

Очень утомляет и вызывает крайнюю степень раздражения недоделаность TextField-а. Наверное за его разработку отвечали индусы-двоешники. Индусы которые еще ничего, делали что посерьезнее. А двоешникам дали TextField.

Когда getCharIndexAtPoint(x, y) попадает на перенос строки ("\n"), то возвращает черти что (4294967295).

вторник, 12 февраля 2008 г.

Прочитать 100 раз и запомнить. Слабые ссылки

На форуме miramax коротко и ясно описал что такое weakReference
Прочитать и запомнить:

GC удаляет только те объекты, к которым нельзя добраться из точки входа (основного объекта программы, Document Class, функция main как хотите называйте).
Например есть стуктура:

А (точка входа)
/ \
Б В
|
Г
/ \
Д Е

Если в какой-то момент убить ссылку из Б в Г, то будут удалены и Г, и Д, и Е. Т.е. если из точки входа невозможно провести путь к объекту, то он будет удалён, т.к. такой объект не может быть использован в основном потоке исполнения(который запускается в точке входа) даже теоретически =).

Некоторые классы используют так называемые "мягкие ссылки", которые не учитываются при обходе GC. Путь из точки входа к ним провести можно, но это не повлияет на GC/

Например тот же Dictionary, если ссылка на объект определена только в нём, и свойство Dictionary.weakReference = true. То объект будет удалён.

Ещё пример - метод
EventDispatcher.addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
В евент диспатчере как бы инкапсулированы ссылки на все обработчики, но
если последний аргумент true, то при обходе GC они не будут учитываться. Т.е. если на событие подписан метод объекта, на который нет других ссылок. Объект будет всё равно удалён.

вторник, 5 февраля 2008 г.

среда, 30 января 2008 г.

Сохранить MovieClip как SWF файл на сервере.

Взято с forum.vingrad.ru/
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
var ByteLoader:URLLoader;
var ByteConverter:Loader;
var ByteConverter2:Loader;
var FileRequest:URLRequest;
var ba:ByteArray = new ByteArray;
function convert(event:Event)
{
//function BytesExample (event:Event) {
ByteLoader = new URLLoader();
ByteLoader.dataFormat = URLLoaderDataFormat.BINARY;
ByteLoader.addEventListener (Event.COMPLETE, onBytesLoaded);
FileRequest = new URLRequest ("mov.swf");
ByteLoader.load (FileRequest);
//}
function onBytesLoaded (evt:Event)
{
ByteConverter = new Loader();
ByteConverter.contentLoaderInfo.addEventListener (Event.COMPLETE, onConvertFinished);
ByteConverter.loadBytes (ByteLoader.data);
ba.writeBytes(ByteLoader.data);
//urla
var url_req:URLRequest = new URLRequest("http://127.0.0.1/img_create.php");
url_req.data = ba;
url_req.method = URLRequestMethod.POST;
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
url_req.requestHeaders.push(header);
navigateToURL(url_req, "png");
}
function onConvertFinished (evt:Event)
{
var mc = ByteConverter.content;
trace (ba);
mc.x = 0;
mc.y = 0;
mc.alpha = .75;
addChild (mc);
}
}
bt.addEventListener(MouseEvent.CLICK, convert);





header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$image_data = $GLOBALS["HTTP_RAW_POST_DATA"] ;
$filename_to_save = "avatar.swf";
if(isset($image_data)){
$png_file = fopen($filename_to_save, "wb") or die("File not opened!");
if($png_file){
set_file_buffer($png_file, 20);
fwrite($png_file, $image_data);
fclose($png_file);
}
}

echo("
");
?>

четверг, 24 января 2008 г.

Интерпритатор для SSAS (Server-Side ActionScript)

Как то раньше не задумывался, а оказывается что SSAS родной брат JavaScript 1.5.
FlashCom Server использует Mozilla Spidermonkey JavaScript 1.5 интерпритатор.

Вместо main.asc можно писать main.js

Горы книжек! Всем учить китайский!

Куча книжек по флеш технологии на китайском форуме
http://www.itpub.net/search.php?searchid=1117&orderby=lastpost&ascdesc=desc&searchsubmit=yes

среда, 23 января 2008 г.

Параметр snapshotMilliseconds

У метода NetStream.attachCamera() есть интересный опциональный параметр snapshotMilliseconds
public function attachCamera(theCamera:Camera, snapshotMilliseconds:int = -1):void 

Если установить его значение 0, то проигрывающий этот поток будет видеть "снэпшот".
Можно реализовать камеру наблюдения, которая будет записывать видео кусочками по 0.1 секунде, каждые 5 секунд
...
intervalID = setInterval(captureFrame, 5000);
function captureFrame ( ) {
out_ns.attachCamera(cam, 100);
out_ns.publish(streamName, "append");
}
...

понедельник, 14 января 2008 г.

Заготовка для прелоадера

Любая флешка начинается с прелоадера (Если, конечно не лень его делать-)). Я использую такую заготовку:
package {
import flash.display.Sprite;
import flash.events.Event;
import main.Preloader;
public class Game extends Sprite {

public function Game() {

var preloader:Preloader = new Preloader();
addChild(preloader);
preloader.addEventListener("loadComplete", onLoadComplete);
}

private function onLoadComplete(e:Event):void {
trace("Documet class: Load Complete")
}
}
}

package main {
import flash.display.Sprite;
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.text.TextField;

public class Preloader extends Sprite {

private var myText:TextField;

public function Preloader() {
this.myText = new TextField();
this.addChild(myText);
myText.text = "Loading ..."
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

private function onEnterFrame(e:Event):void {
if (this.stage != null) {
var loaded:Number = stage.loaderInfo.bytesLoaded;
var total:Number = stage.loaderInfo.bytesTotal;
trace("loaded = "+loaded);
trace("total = " + total);

if (loaded == total) {
this.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
this.dispatchEvent(new Event("loadComplete"));
}
}
}

}
}

Как добавить экземпляр класса подгружаемого мувика

Пусть есть флешка library.swf и в её библиотеке есть мувик связанный с классом MC
(Свойства, галочка Экспорт для ActionScript)
Есть другая флешка loader.swf которая подгружает флешку library.swf.

package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;

public class loader extends Sprite {
var e:Event;
var a:ApplicationDomain;
public function loader() {
var url:URLRequest = new URLRequest("library.swf");
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
l.load(url);
}

private function onLoadComplete(e:Event) {
trace("loaded");
var currentClass:Class = e.target.applicationDomain.getDefinition("MC") as Class;
var s:Sprite = new currentClass();
addChild(s);

var s2:Sprite = new currentClass();
addChild(s2);

s2.x = 50;
s2.y = 50;
}
}
}


На сцене подгружающей флешки появились два мувика из подргуженной.
Круть -)))

четверг, 10 января 2008 г.

Wowza Media Server подешевел

Одной из алтернатив FMS и Red5 является Wowza Media Server.
Решил посмотреть по-подробнее что сие такое. Обратил внимание на то как резко изменилась цена на Pro Unlimited edition.
Год назад она стоила $5000
А теперь $995
Видимо не велик спрос -) Red5 скоро и FMS подъест.

среда, 9 января 2008 г.

Top4Top

Новый портал реализованный полностью на флеше Top4Top
На блоге у Роста разразилось крупномасштабное сражение

Лично мое мнение: Если идея более-менее (хотя 10001 веловипед чего и не сделать то), то реализация очень хреновая, все какое-то угловатое, разнородные прелоадеры то там то тут жужжащие вызывают панику и желание скорее убраться на нормальный HTML сайт

Совершенно согласен с этим комментарием:

Так вот: я не мог находиться на сайте больше 5 минут из за совершенно некомфортного ощущения тормознутости и наказывания ожиданием за любой клик.

понедельник, 7 января 2008 г.

FullScreen mode в браузере

Уже слышал ранее, но только сейчас возникла необходимость использовать полноэкранный режим флэш-плагина. Впечатляющее зрелище, когда флешка открывается из маленького баннерка на весь экран.
FullScreen по-русски на Flash
FullScreen по-английски на Flex

среда, 2 января 2008 г.

Pure MVC

Пока Рост пишет странные сообщения о медитации на тему фреймворка Pure MVC и продолжает какие-то "тривиально неполезные" описания и обещает выложить пример использования...
Один из авторов книги ActionScript 3.0 Design Patterns (O'Reilly, 2007) в своем блоге выложил минимальный пример и детально описал принцип его работы в контексте фреймворка

Как сохранять видео с youtube.com ?

Очень просто. Установить плагин для FF от Sothink. В комплекте есть еще проигрыватель FLV