Stratus service for developing end-to-end applications using RTMFP in Flash Player 10
January 5th, 2009
“There is a new ActionScript 3.0 API in Flash Player 10 to support RTMFP. Connecting to the Stratus service and creating end-to-end media streams are analogous to working with Flash Media Server. Please note that you must use ActionScript 3.0 with either Flash Professional CS4 or Flex Builder 3 targeting Flash Player 10 or AIR 1.5.”
Why use Stratus? hmm, well, Stratus is one sweet way to connect and trade data between users direct from Flash Player, eg. audio and video call or multi-player games. Like the AMFPHP, using Stratus you need first connect to service as show my code bellow:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.media.*; public class stratusSample extends MovieClip { private const StratusAddress:String = "rtmfp://stratus.adobe.com"; private const DeveloperKey:String = "YOUR_STRATUS_ID"; private var netConnection:NetConnection; private var sendStream:NetStream; private var recvStream:NetStream; public function stratusSample():void { netConnection = new NetConnection(); netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler); netConnection.connect(StratusAddress + "/" + DeveloperKey); } private function netConnectionHandler(e:NetStatusEvent):void { trace("Net Status : " + e.info.code); } } } |
This will connect and show the status of connection, if was successfull or fail. To work you must use YOUR_STRATUS_ID that you will create in “labs.adobe.com/stratus”. I am working in one chat using Stratus and soon i ll publish source code here. Any question comment. Thanks for all.
Simple gallery class [AS3]: gallLoader
December 17th, 2008
Create one simple gallery can take a time that you havent. Well, a simple solution that i create was gallLoader Class, one simple gallery that load thumbs, position thumbs in lines and load large image. Simple to use:

Have two arrows in right and left side of thumb container, these arrow will move container to view all other images using one more class named slideClip. Now you need only import and create these class objects like code bellow:
import com.dLibs.slider.slideClip; import com.dLibs.photos.gallLoader; var minData:Array = ["galeria/001/001.jpg", ...]; var maxData:Array = ["galeria/001/g001.jpg", ...]; var gallPict:gallLoader; gallPict = new gallLoader(minData,maxData,gClip.bigImage,gClip.gImages,"gallThumb",4,2,gClip.LoadQuadAnim); var galSlider:slideClip; galSlider = new slideClip(gClip.gImages, gClip.gMask, gClip.gNext, gClip.gPrev);
Well, minData and maxData is an Array with thum and large images location. We import slideClip and gallLoader classes, the first will make slider with container and other classe will create the gallery.
First create gallPict link and gallLoader object, and this new gallLoader object need receive in order: thumb array, large images array, MovieClip instance of large image, container instance, class of the thumb clip in library, padding or distance of thumb clips, number of lines that will separated thumbs and loader instance. Uffa ehehhe so many instances but the result is so many speedly.
Too need create slideClip object and set the clip instances: container clip instance, mask intance ( mask of container ), next and prev clip instance. Using click event will move and show all container clip with your thumbs. See the Flash simple gallery in action here:
Bellow the slideClip and gallLoader classes to view and save.
slideClip.as
package com.dLibs.slider { import flash.display.*; import flash.events.*; import gs.TweenLite; public class slideClip { private var _contClip:MovieClip; private var _maskClip:MovieClip; private var _nextClip:MovieClip; private var _prevClip:MovieClip; private var _maxWidth:Number; private var _actWidth:Number; public function slideClip(contClip:MovieClip, maskClip:MovieClip, nextClip:MovieClip, prevClip:MovieClip) { /* To use this class var galSlider:slideClip = new slideClip(clip_Images, clip_Mask, clip_Next, clip_Prev); Clips that ll be slided, clip that mask the first, button to Next and to ultimate to Prev */ _contClip = contClip; _maskClip = maskClip; _nextClip = nextClip; _prevClip = prevClip; _nextClip.buttonMode = true; _prevClip.buttonMode = true; _maxWidth = _maskClip.width; _actWidth = _maskClip.x; slideInit(); } private function verifyWidth():void { if ( _contClip.width <= _maxWidth ) _nextClip.visible = _prevClip.visible = false; } private function slideInit():void { _nextClip.addEventListener(MouseEvent.CLICK, showNext); _prevClip.addEventListener(MouseEvent.CLICK, showPrev); verifyWidth(); } private function showNext(e:MouseEvent):void { if ( int(_actWidth) > int((_maskClip.x + _maxWidth ) - _contClip.width) ) { TweenLite.to(_contClip,.9, {x : _actWidth - _maxWidth}); _actWidth = _actWidth - _maxWidth; } } private function showPrev(e:MouseEvent):void { if ( int(_actWidth) < int(_maskClip.x) ) { TweenLite.to(_contClip,.9, {x : _actWidth + _maxWidth}); _actWidth = _actWidth + _maxWidth; } } } }
gallLoader.as
package com.dLibs.photos { import flash.display.*; import flash.events.*; import flash.utils.*; import flash.net.*; import gs.TweenLite; public class gallLoader { /* @ Variables ____________________________________________________*/ private var _minData :Array; private var _maxData :Array; private var _thmBox :Array; private var _bigPict :MovieClip; private var _smallPict :MovieClip; private var _thmClip :MovieClip; private var _thmMovie :MovieClip; private var _bigMovie :MovieClip; private var _loaderClip :MovieClip; private var _thumbClass :String; private var _loaderThumb :Loader; private var _loaderBig :Loader; private var _i :uint; private var _thumbPadding :uint; private var _thumbLines :uint; private var _thumbLineY :uint; private var _thumbLineX :uint; /* @ Constructor ____________________________________________________*/ public function gallLoader(minData:Array,maxData:Array,bigPicture:MovieClip,smallPictures:MovieClip,thumbClass:String,thumbPadding:uint=0, thumbLines:uint=1,loaderClip:MovieClip=null):void { _minData = minData; _maxData = maxData; _bigPict = bigPicture; _smallPict = smallPictures; _thumbClass = thumbClass; _thumbPadding = thumbPadding; _thumbLines = thumbLines; _loaderClip = loaderClip; _thmBox = new Array(); initGall(); }; /* @ init Function ____________________________________________________*/ private function initGall():void { if ( _loaderClip != null ) _loaderClip.visible = false; for ( _i = 0; _i < _minData.length; _i++ ) { _loaderThumb = new Loader(); _loaderThumb.x = _thumbPadding; _loaderThumb.y = _thumbPadding; _loaderThumb.load(new URLRequest(_minData[_i])); trace(_minData[_i] , _i); _thmClip = new ( getDefinitionByName(_thumbClass) as Class )(); _thmClip.addChild(_loaderThumb); _thmMovie = new MovieClip(); _thmMovie.x = ( _thmClip.width + 5 ) * _thumbLineX; _thmMovie.y = ( _thmClip.height + 5 ) * _thumbLineY; _thmMovie.id = _i; _thmMovie.buttonMode = true; _thmMovie.addEventListener(MouseEvent.CLICK, viewPicture); _thmBox.push(_thmMovie); _thmMovie.addChild(_thmClip); _smallPict.addChild(_thmMovie); if ( _thumbLineY + 1 < _thumbLines ) { _thumbLineY++; } else { _thumbLineY = 0; _thumbLineX++; } }; _thmBox[0].dispatchEvent(new MouseEvent(MouseEvent.CLICK)); }; /* @ init Function ____________________________________________________*/ private function viewPicture(e:MouseEvent):void { _loaderBig = new Loader(); _loaderBig.load(new URLRequest(_maxData[e.currentTarget.id])); _loaderBig.contentLoaderInfo.addEventListener(Event.COMPLETE, showLoadedBig); _loaderBig.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, showLoaderBig); trace(_maxData[e.currentTarget.id] , e.currentTarget.id); if ( _bigPict.numChildren > 1 ) _bigPict.removeChildAt(1); }; private function showLoaderBig(e:ProgressEvent):void { if ( _loaderClip != null ) _loaderClip.visible = true; }; private function showLoadedBig(e:Event):void { if ( _loaderClip != null ) _loaderClip.visible = false; _bigMovie = new MovieClip(); _bigMovie.alpha = 0; _bigMovie.addChild(_loaderBig); _bigPict.addChild(_bigMovie); TweenLite.to(_bigMovie,.4,{ alpha : 1 }); }; /* @ End ____________________________________________________*/ }; };
You can download the classes direct in repository:
http://asdatalibs.googlecode.com/svn/trunk/
Any questions comment it. Thanks.
XD
AS3.0 Memory monitoring
December 2nd, 2008
Hi for all. Today i have some problems with a SWF file that stop all Flash Player Plug-in. First i thought that may be total memory used for the player, well, and now? What can i do to know total memory? Ta-daaaa. Reading the Flash Help - this page - i saw the propertie System.totalMemory.
Its so simple to use it, bellow the sample:
var memoryUsed:Number = (System.totalMemory / 1024 / 1024).toFixed(2)); trace(memoryUsed);
System.totalMemory give memory used in Bytes, to converte it to MegaBytes is necessary first convert to Kbyte (x/1024) and after that convert Kbyte to MByte (y/1024).
Use .toFixed() to especify how much numbers ll be appear after dot. (eg 10.45 or 105.23)
Any idea? Post your comment. Thanks and see you soon.
jQuery.popeye: a lightbox alternative
November 26th, 2008
A power full alternative to load pictures and descriptions about the photo is a Popeye, a jQuery plug-in. Popeye work inline floating across the content. The XHTML code is simple and W3 valid.
To load this plug-in you may before load too jQuery after include too Popeye Javascript file, and to run it use the code bellow into HEAD tag:
$(document).ready(function () { $('.popeye').popeye(); });
Take a look in DEMO page and in Download page, two links bellow:
Sounds using AS3
November 12th, 2008
Hi, from now to ever ehehe i ll write my posts in English. Today I will talk about Sound Object, how to use for load music and play other music on sound complete. First step is create object Sound, like used in Actionscript 2:
var s:Sound = new Sound();
After this step need call a music, that will be played:
s.loadSound("music.mp3", true);
The second argument - true - is used to set load progress music, a fake streaming. Now we need set the functions that will be called when sound will be played. We can call a function on music start, other on music loaded and when music will be total played. Bellow the full script that execute function on music played:
var s:Sound = new Sound(new URLRequest("music.mp3"));
s.addEventListener(Event.COMPLETE, doLoadComplete);
var channel:SoundChannel = new SoundChannel();
channel = s.play();
channel.addEventListener(Event.SOUND_COMPLETE, doSoundComplete);
function doLoadComplete($evt:Event):void
{
trace("Song loaded.");
}
function doSoundComplete($evt:Event):void
{
trace("Song done.");
}
I will write a class to load, play, next and prev musics and soon show it here. Thanks for all and comment if you need.
Resize stage: stageWidth and stageHeight
September 24th, 2008
Olá, e como quase adoradores do Flash - e estudantes do AS3 - vamos falar um pouco do Resize do stage, ações quando o palco for dimensionado. Para fazer com que o Flash identifique o aumento ou diminuição do palco e execute uma determinada função deve-se criar o addEventListener abaixo:
stage.addEventListener(Event.RESIZE, resizeMe);
Assim podemos criar a função resizeMe que fara todas as mudanças de posição do palco a cada vez que ele identifique o resize. Para tanto a função deve receber o argumento event:Event para que seja executada pelo addEventListener, só que ai encontramos um pequeno problema: toda vez que o flash for carregado ele deve executar a função ao carregar e depois executar a cada resize para que nao carregue na posição errada e so seja corrigido as posições ao aumentar ou diminuir o palco.
Uma função ao ser chamada sem nenhum, com o event:Event, ela precisa enviar um arqumento do tipo Event o que não acontece quando executamos a função simplismente chamando-a pelo nome(), assim, um pequeno gato (heheh) criamos uma função sem o event normalmente:
function resizeAll():void { // code goes here };
essa poderá ser chamada pelo nome sem argumento no carregamento do frame normalmente:
resizeAll();
e ainda, completando cria-se uma função complementar, com o argumento event:Event onde será chamada pelo Listener do stage, dentro dessa função ela pede somente para executar a função resizeAll() normalmente, assim mesmo na inicialização ou no event.RESIZE será executada a mesma função, como segue no codigo completo abaixo:
stage.addEventListener(Event.RESIZE, resizeMe);
function resizeMe(event:Event):void { resizeAll(); };
function resizeAll():void
{
objeto.x = stageWidth - objeto.with;
objeto.y = stageHeight - objeto.height;
};
resizeAll();
Assim podemos posicionar objetos de acordo com os resize e ainda sempre que excutada a função podemos recuperar a largura e altura do stage usando a variável stageWidth e stageHeight, pegando o novo valor, ou seja da janela ampliada ou reduzida.
Espero que tenha ajudado, qualquer dúvida: comment me x)
Introduzindo asDataLibs
September 23rd, 2008
Olá, estou aqui novamente escrevendo um pouco mais sobre Actionscript 3 para iniciantes e intermediários. Antes de mais nada preciso explicar o que é o tal “asDataLibs”, que mesmo com um nome meio estranho, nada mais é que uma biblioteca ou coleção de bibliotecas, classes AS3, em Actionscript 3 que tem a intenção de facilitar para o programador o modo com que ele recebe, trata e disponibiliza os dados usados nas aplicações em Flash (AS3).
Acredito que a forma mais complicada mas a mais completa de se fazer uma transição do AS2 para AS3 é começando entender e criar Classes, essas que uma vez criadas, e bem criadas, resolvem um enorme problema de retrabalhos que se tinha facilmente na versão anterior da linguagem, mesmo que nessa anterior também fosse possivel criação das classes mas não era tão utilizada como agora.
O “asDataLibs” pode ser encontrado no endereço: http://code.google.com/p/asdatalibs
Ainda em fase de criação, as classes no dominio asDataLibs do Google, listado acima, somente seram publicadas no SVN depois de testadas e funcionando corretamente e seram colocados exemplos dentro da pasta samples no proprio SVN e no Wiki do Google Code.
A primeira classe criada e que vamos falar agora é a openFile (com.dLibs) essa que tem a finalidade de carregar arquivos externos para dentro da sua aplicação como imagens e animações em formato SWF. É realmente uma classe bem simples mas muito completa no quisito carregamento porque através dela se pode receber a porcentagem de carregamento diretamente em uma função de Loader que o proprio desenvolvedor criara de acordo com sua necessidade. Para iniciar a utilização da classe precisa-se inicialmente importar o pacote como segue abaixo:
import com.dLibs.openFile;
Depois disso, como se trata de uma classe estatica e por isso não precisa se criar objetos como acontece no Tweener por exemplo, então precisa-se somente chamar a classe a sua função estatica para ser executada como mostrado a seguir:
openFile.addItem(mc:MovieClip, file:String, Loader:Function, Timer:uint, transit:String);
Aparentemente muito complexa mais os campos requeridos para o carregamento são somente os três primeiros que são:
mc : Movie Clip onde será carregado o arquivo externo.
file: Arquivo a ser carregado, endereço relativo ao arquivo swf.
loaderText: que é o nome da função.
Para ver o loader funcionando basta criar uma função dentro do seu pacote de acesso ou dentro do arquivo FLA com o nome colocado quando se chama a classe e ele receberá o valor do percentual carregado abaixo mostrado:
import com.dLibs.openFile;
openFile.addItem(clip_mc, "files/image.jpg",loaderImages);
function loaderImages(porcentagem:uint):void
{
myTextField.text = String(porcentagem);
}
No exemplo acima a classe openFile carrega o arquivo “image.jpg” dentro do diretório “files” e o coloca dentro do movie clip nomeado de “clip_mc”, durante o carregamento desse arquivo o campo de texto nomeado de “myTextField” receberá os valores numerais convertidos para String da porcentagem carregada do arquivo, muito simples.
Assim os outros dois tipos de argumentos da função são responsáveis pela velocidade do fade final do arquivo recebido e do tipo de transição sera feita pelo fade, os dois correspondentes a classe Tweener, que é incluida dentro da classe openFile.
Próximos posts falaram de outras classes existentes e outras que ainda estão em construção para serem disponivilizadaso no SVN: http://asdatalibs.googlecode.com/svn/trunk/
addFrameScript undocument feature AS3
September 19th, 2008
Olá a todos, agora vou falar um pouco sobre um metodo bem interessante para a organização do codigo actionscript, podendo ter todos os scripts em um unico bloco de ações mesmo que esses façam referência local dentro de um moviClip indepentente de qual seja o frame. Estou falando do addFrameScript().
A função addFrameScript - flash.display.MovieClip - é um metodo não documentado no Flash CS3 que possibilita adicionar um codigo actionscript, a execução de uma função em determinado frame do codigo actionscript sem que esse codigo precise estar dentro do MovieClip. Funciona da seguinte forma:
movieClipInstance.addFrameScript(frame:Number, actionscript:Function);
dentro de uma classe, como já foi dito acima, deve ser importado a classe “flash.display.MovieClip” para se ter acesso ao addFrameScript.
Outro exemplo é de animação de carregamento de arquivo - Loader.
Nesse caso acima, o movieClip que tem a animação do carregamento não tem nenhum actionscript, mas quando a quantidade total de bits é carregada, como podemos ver o bloco da linha 20 a 24, primeiramente é retirado o evento ENTER_FRAME, depois pede para o carregador (PreLoader) executar o restante da animação e na linha 23 foi pedido para que no ultimo frame de PreLoader fosse adicionado a função gotoNextScene() assim indo finalmente ao site.
A função não fica marcada em azul como as demais ‘default’ do CS3 pelo fato de não ser documentada mas é de grande ajuda para deixar um codigo mais compacto e menos espalhado pelo arquivo e seus inumeros clips.
Espero que tenha ajudado, até mais.
Programando em Flash
September 1st, 2008
Existem milhares de vantagens para se aprender Actionscript 3, além de se manter no mercado que cada dia tem rookies - ganhando pouco e tomando o trampo dos experientes. Querendo ou não isso é uma realidade onde os medianos temem os novatos e por isso especializar é preciso, quanto mais PRO mais seguro está, claro.
No site DevNet da Adobe tem uma lista muito interessante de videos tuto para iniciantes na programação em AS3, realmente simples para se familiarizar com a nova linguagem e sintaxe do Actionscript3.
Link: Flash in a Flash - AS3
AMFPHP e AS3 para noobs
August 11th, 2008
Depois de passar um tempo longe dessa caceta de blog ( caceta no sentido carinhoso da palavra, ou se preferirem no feminio que não posso escrever ) tive dando uma estudada em AS3 bem a fundo e comecei a procurar um AMF (Action Message Format) para fazer comunicação do Flash com banco de dados e assim alimentar as aplicações de forma mais rápida sem aquele taaaaaaaanto de arquivos PHP para acessar banco e outros mil para enviar dados ao Flash.
Entre as formas pagas (Flash Media Server) e o grátis eu fiquei com o FREE claro. O danado em questão é um programa, gateway, que interpreta as classes colocadas dentro dele e retorna de forma fácil os dados para a aplicação, executando até coisas simples como um form de e-mail.
AMFPHP é um programa feito em PHP, como está no próprio nome, coisa idiota, com uma interface gráfica (Browser) criada no Flex onde podemos executar as aplicações sem necessariamente rodar a aplicação em Flash. Como eu já havia dito é grátis, basta acessar o site do AMFPHP e clicar em download par abaixar a última versão do programa, basta copiar para o server dentro do diretorio que preferir - por default:
Para visualizar a parte gráfica, o browser das aplicações, basta acessar o endereço:
Segue imagem (preview) do Browser abaixo:
Um exemplo simples para utilizar no AMFPHP é um form de email, onde nesse criamos um arquivo em PHP separado chamado de Email.php dentro dele criaremos a classe Email com a função _send como veremos no código abaixo:
<?php
class Email
{
/**
* Esse serviço ira enviar um formulario
* @retorno true ou false se enviado ou nao
*/
function send($to, $subject, $message){
return mail($to, $subject, $message);
}
}?>
Com essa classe dentro do servidor dentro da pasta do AMFPHP, aperto dentro do Browser o botão de Refresh para visualizar a nova Classe “Email” criada essa pode ser executada dentro do proprio Browser somente preenchendo os campos ou do Flash que segue o source abaixo. Bem fácil de usar e não instala nada no servidor, vale a pena testar.
Source em Flash (fla): Download
Espero que gostem e até breve.

