Já estou atrasado com o post, mas não podia deixar de postar o algoritmo que fiz para resolver os problemas do teste do Google Developer Day 2011, que aconteceu em São Paulo / SP / Brasil no dia 16 de setembro de 2011 (post em breve). Foi feito em Actionscript 3.0, mas a lógica se aplica em qualquer linguagem.
segunda-feira, 19 de setembro de 2011
sexta-feira, 8 de julho de 2011
Usando o forEach com Vector
terça-feira, 14 de junho de 2011
Usando Array e Vector
Olá pessoal, a muito tempo venho observando com mais atenção os tipos de variáveis que uso em minhas aplicações e, ao longo do tempo fui percebendo que alguns tipos usados, junto com algumas boas práticas, melhoraram de forma considerável a velocidade de minhas aplicações.
quinta-feira, 14 de abril de 2011
Ordenando Vetor Dançando
quarta-feira, 13 de abril de 2011
Conectando Aplicação AIR à banco MySQL via AsSQL
quarta-feira, 6 de abril de 2011
Invocando Métodos no Actionscript 3.0 por Links no HTMLText
segunda-feira, 28 de março de 2011
LightMVC v.1
Hoje estou lançando oficialmente a primeira versão do LightMVC, o mais novo framework Actionscript 3.0 baseado na arquitetura MVC. Trata-se basicamente de um conjunto de comandos que fazem seu projeto ser mais escalável, desacoplado e fácil de manter.
quinta-feira, 24 de março de 2011
Classe Abstrata em Actionscript 3.0
Hoje vou mostrar uma bom jeito de se implementar uma classe abstrata em Actionscript 3.0. Para quem trabalha em equipe de programadores é uma boa prática, pois ajuda bastante no encapsulamento do código e não engessa a manutenção no futuro.
terça-feira, 22 de março de 2011
Teste o Google Chrome OS
Quando lí que o Google estava desenvolvendo um sistema operacional, fiquei muito interessado em saber o que viria das cabeças daqueles malucos. Hoje sabemos que se trata de um OS focado na núvem e com a interface do nosso querido Google Chrome (o browser).
sexta-feira, 15 de outubro de 2010
Ponteiros em C
Olá, faz algum tempo que eu não posto nada relacionado a programação, estou muito ocupado ultimamente, trabalhando e estudando, fora os projetos pessoais que invadem a madrugada e finais de semana. Mas hoje, felizmente, tive um tempo para solucionar uma dúvida que pintou aqui na sala.
Os temidos PONTEIROS em C, por ter uma certa experiência em programação, foi fácil assimilar o conceito de endereço de memórias e afins, mas ainda tenho muito o que aprender sobre eles. Então, salve enganos, abaixo vou explicar tudo o que sei sobre esses facilitadores e solucionar algumas dúvidas.
Vamos lá...
Introdução
Primeiro, vamos definir o que é ponteiro:
"Em programação, um ponteiro ou apontador é um tipo de dado de uma linguagem de programação cujo valor se refere diretamente a um outro valor alocado em outra área da memória, através de seu endereço. Um ponteiro é uma simples implementação do tipo referência da ciência da computação."
(Wikipedia: http://pt.wikipedia.org/wiki/Ponteiro_(programa%C3%A7%C3%A3o))
Entendido? É simples, imagine da seguinte forma. Você declara uma variável A e atribui a ela o valor de 5.
int a = 5;
Imaginando que você é um super nerd espinhento que decorou os endereços de memória do seu computador, considere que o valor da variável A foi alocado no endereço:
0x10 = a = 5
Agora vamos declarar uma variável que guarda o ondereço de memórias de outras variáveis (isso é um ponteiro):
int *p;
Explicando... Em C, basicamente, quando você insere um asterísco (*) antes do nome da variável ela torna-se um ponteiro, que conterá o endereço de memória de uma variável do mesmo tipo que ela (no exemplo, o ponteiro P necessáriamente terá que apontar para um endereço de memória de uma variável do tipo INTEIRO).
Entendido isso, podemos agora guardar o endereço de memória de A em P, atribuindo A prescedido de um E comercial (&):
p = &a;
Prescedendo um variável qualquer (mesmo ponteiro) com um &, isso faz com que a variável retorne naquele momento seu próprio endereço de memória. Então, se dermos um PRINTF em &a:
// %p é o marcador para mostrar endereços de memória printf("%p", &a); // exibe: 0x10
Trabalhando com Ponteiros
Agora podemos passar para o passo de pegar o valor da variável pelo seu endereço de memória, de uma forma ainda mais simples. Se dermos um PRINTF em P veremos:
printf("%p", p); // exibe: 0x10 (o endereço de memória de A)
E se usarmos o prescedente asterísco (*) em P, veremos:
printf("%i", *p); // exibe: 5 (o valor do endereço de memória, que no caso é o valor da variável A)
Compreendendo tudo isso, podemos definir algumas coisas baseadas em nosso exemplo:
a = 5
&a = 0x10
p = &a = 0x10
&p = ao endereço de memória de P, por exemplo, 0x11
*p = a = 5
O que é preciso definir muito bem é, que o ponteiro não se refere a quantidade de memória alocada pela variável (independente do tipo) e sim ao local quem está alocada na memória. Por exemplo, podemos ter a seguinte informação em sua memória:
0x10 = 10 Mb
0x11 = 1 Kb
0x12 = 5 Gb
0x13 = 7 Bytes
0x14 = 100 Tb
Vetor é um Ponteiro
Para continuarmos a entender e usar ponteiros, temos que ter em mente que um vetor é um ponteiro (matriz é um pouco diferente). Como assim?!
Um vetor (array para os íntimos), nada mais é que um ponteiro para o endereço de memória da primeira posição do vetor. Por exemplo:
int v[5] = {1, 2, 3, 4, 5};
E assumindo que o programa aloca os seguintes endereços de memória:
0x10 = 1
0x11 = 2
0x12 = 3
0x13 = 4
0x14 = 5
Se dermos um PRINTF em V:
printf("%p", v); // exibe: 0x10 printf("%p", &v[0]); // exibe: 0x10
Então, podemos complementar nossa tabela acima da seguinte forma:
0x10 = v[0] = 1
0x11 = v[1] = 2
0x12 = v[2] = 3
0x13 = v[3] = 4
0x14 = v[4] = 5
O Uso do Ponteiro
Em C, se incrementarmos (++) um ponteiro, ele passará a valer o próximo endereço de memória. Por exemplo:
printf("%p", p); // 0x10 p++; printf("%p", p); // 0x11
Baseado nisso, poder percorrer um vetor incremetando o ponteiro:
int v[5] = {1, 2, 3, 4, 5}; for(i=0; i<5; i++) { printf("V aponta para %p \n", v++); }
Exibindo:
V aponta para 0x10
V aponta para 0x11
V aponta para 0x12
V aponta para 0x13
V aponta para 0x14
E se quisermos pegar o valor:
int v[5] = {1, 2, 3, 4, 5}; for(i=0; i<5; i++) { printf("V aponta para o valor %i \n", *v++); }
Exibindo:
V aponta para o valor 1
V aponta para o valor 2
V aponta para o valor 3
V aponta para o valor 4
V aponta para o valor 5
Exemplo Prático
Juntando tudo que você provavelmente aprendeu nesse post, tente entender o código abaixo. Está simples e didático:
/* * LearningPointers.c * * @Linux Ubuntu 10.4 * @IDE Eclipse CDT * @Compiler Linux GCC * * Created on: Oct 1, 2010 * Author: idemax - www.idemax.net */ #include <stdio.h> #include <stdlib.h> int main() { int x; int i=2, *p_int=&i; char str[5]="test", *p_str=str; // ou *p=&str printf("i\t<-\t%i\n*p_int\t<-\t%i\np_int\t<-\t%p", i, *p_int, p_int); printf("\np_str:\t"); for(x=0; x<5; x++) { printf("%c", *p_str++); // percorrendo por ponteiro } return EXIT_SUCCESS; }
Conclusão
Espero ter esclarecido suas dúvidas com ponteiro em C. Qualquer dúvida me mande um e-mail no:
idemax@gmail.com
Até a próxima...
domingo, 22 de novembro de 2009
Enviando e Recuperando Dados por HTTPService usando PHP
Infelizmente não conseguir fazer o PHP realmente enviar porque o
Bom, vamos ao que interessa. No exemplo, eu fiz um formulário simples em que o usuário insere o nome, e-mail, assunto por combobox e a mensagem, e travei os campos usando os Validators do próprio Flex. Também fiz um bom uso do Declarations, para deixar as coisas mais explícitas.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
width="400"
height="400"
applicationComplete="applicationCompleteHandler()"
viewSourceURL="srcview/index.html">
<fx:Script>
<![CDATA[
import mx.managers.PopUpManager;
import mx.rpc.events.ResultEvent;
import mx.validators.Validator;
private var _validadores:Array;
private function applicationCompleteHandler():void
{
_validadores = [ campoNomeValidator, campoEmailValidator, comboAssuntoValidator, campoMensagemValidator ];
campoNome.setFocus();
}
private function btnEnviar_clickHandler():void
{
if( Validator.validateAll( _validadores ).length )
return;
PopUpManager.addPopUp( progressEnviando, this, true );
PopUpManager.centerPopUp( progressEnviando );
httpServiceSendMail.send();
}
private function btnLimpar_clickHandler():void
{
campoNome.text = campoEmail.text = campoMensagem.text = '';
comboAssunto.selectedIndex = -1;
campoNome.setFocus();
}
private function httpServiceSendMail_resultHandler( $event:ResultEvent ):void
{
PopUpManager.removePopUp( progressEnviando );
PopUpManager.addPopUp( titleRetornoPhp, this, true );
textRetorno.htmlText = $event.result as String;
PopUpManager.centerPopUp( titleRetornoPhp );
}
private function titleRetornoPhp_closeHandler():void
{
PopUpManager.removePopUp( titleRetornoPhp );
}
]]>
</fx:Script>
<fx:Declarations>
<mx:TitleWindow id="titleRetornoPhp"
title="Retorno do PHP"
showCloseButton="true"
close="titleRetornoPhp_closeHandler()"
minWidth="200">
<mx:Text id="textRetorno" />
</mx:TitleWindow>
<mx:ProgressBar id="progressEnviando"
indeterminate="true"
label="enviando mensagem..." />
<s:HTTPService id="httpServiceSendMail"
method="POST"
resultFormat="text"
result="httpServiceSendMail_resultHandler(event)"
url="php/enviaEmail.php">
<s:request>
<nome>
{campoNome.text}
</nome>
<email>
{campoEmail.text}
</email>
<assunto>
{comboAssunto.selectedItem.@label}
</assunto>
<mensagem>
{campoMensagem.text}
</mensagem>
</s:request>
</s:HTTPService>
<fx:XMLList id="xmlAssuntos">
<assunto label="Informação" />
<assunto label="Reclamação" />
<assunto label="Crítica" />
<assunto label="Dúvida" />
<assunto label="Outro" />
</fx:XMLList>
<mx:StringValidator id="campoNomeValidator"
source="{campoNome}"
property="text"
tooShortError="Digite seu nome!"
tooLongError="Digite somente seu primeiro nome!"
minLength="4"
maxLength="20" />
<mx:EmailValidator id="campoEmailValidator"
source="{campoEmail}"
property="text" />
<mx:NumberValidator id="comboAssuntoValidator"
source="{comboAssunto}"
lowerThanMinError="Selecione um assunto!"
property="selectedIndex"
minValue="0"
thousandsSeparator="."
decimalSeparator=","
trigger="{comboAssunto}"
triggerEvent="{Event.CHANGE}" />
<mx:StringValidator id="campoMensagemValidator"
source="{campoMensagem}"
property="text"
tooShortError="Digite uma mensagem relevante!"
tooLongError="Vá direto ao assunto!"
minLength="10"
maxLength="255" />
</fx:Declarations>
<s:Rect width="100%"
height="100%">
<s:fill>
<s:RadialGradient>
<s:GradientEntry color="#ffffff" />
<s:GradientEntry color="#cccccc" />
</s:RadialGradient>
</s:fill>
</s:Rect>
<s:Panel title="Formulário de Contato"
horizontalCenter="0"
verticalCenter="0">
<mx:Form horizontalCenter="0"
verticalCenter="0">
<mx:FormHeading label="Preencha o formulário abaixo." />
<mx:FormItem label="Nome:"
required="true"
width="100%">
<s:TextInput id="campoNome"
width="100%" />
</mx:FormItem>
<mx:FormItem label="E-Mail:"
required="true"
width="100%">
<s:TextInput id="campoEmail"
width="100%" />
</mx:FormItem>
<mx:FormItem label="Assunto:"
required="true"
width="100%">
<mx:ComboBox id="comboAssunto"
prompt="Selecione um assunto..."
selectedIndex="-1"
width="100%"
dataProvider="{xmlAssuntos}"
labelField="@label" />
</mx:FormItem>
<mx:FormItem label="Mensagem:"
required="true">
<s:TextArea id="campoMensagem" />
</mx:FormItem>
<mx:FormItem direction="horizontal"
width="100%">
<s:Button id="btnEnviar"
label="enviar"
click="btnEnviar_clickHandler()" />
<mx:Spacer width="100%" />
<s:Button id="btnLimpar"
label="limpar"
click="btnLimpar_clickHandler()" />
</mx:FormItem>
</mx:Form>
</s:Panel>
</s:Application>
O PHP está bem simples, o foco é mostrar como vem e vão os valores.
<?
echo '<b>Nome: </b>'.$_POST['nome'].'<br />'.
'<b>E-Mail: </b><a href="mailto:'.$_POST['email'].'">'.$_POST['email'].'</a><br />'.
'<b>Assunto: </b>'.$_POST['assunto'].'<br />'.
'<b>Mensagem: </b>'.$_POST['mensagem'];
?>
É simplesmente um echo nos Posts, veja que a chave é a mesma do nó no request que é passado no HTTPService.
Como eu setei resultFormat="text" no HTTPService, é só pergar no evento a propriedade result como String e escrever onde quiser.
O ver / baixar o projeto / código-fonte, clique com o botão direito na aplicação ou clique aqui.
sábado, 31 de outubro de 2009
Usando Path no Flex 4
"The Path class is a filled graphic element that draws a series of path segments. In vector graphics, a path is a series of points connected by straight or curved line segments. Together the lines form an image. In Flex, you use the Path class to define a complex vector shape constructed from a set of line segments."
Não vou arriscar uma tradução, mas basicamente fala que o Path é um elemento gráfico de preenchimento que desenha uma série de formas. Em vetores gráficos, o Path é uma série de pontos conectados por linhas retas e curvas. Juntas formando uma imagem. No Flex, você pode usar a classe Path para definir a construção de um vetor complexo a partir de um conjunto de linhas.
Bom, pelo menos viram que o curso de inglês está rendendo alguma coisa!
Continuado, fiz um exemplo bem simples usando o máximo que o framework possível, para mostrar também algumas outras facilidades que o novo SDK tráz:
No exemplo, eu fiz um Path com o data contendo váriaveis Bindable, e o preenchimento, borda e filtro, todos por MXML.
A animação, eu usei o framework TweenMax, vale a pena estudá-lo. É parecido com a Tweener do Zeh Fernando, mas com várias funcionalidades que fazem diferença.
Não usei nenhuma fórmula para o Path parecer elástico, o foco é como ficou fácil desenhar e animar vetores complexos.
Path.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
width="400"
height="400"
applicationComplete="applicationCompleteHandler()"
viewSourceURL="srcview/index.html">
<fx:Script>
<![CDATA[
import com.greensock.TimelineMax;
import com.greensock.TweenMax;
import com.greensock.easing.Bounce;
import com.greensock.easing.Elastic;
[Bindable]
private var _timelineMax:TimelineMax;
[Bindable]
public var pathY:Number = 10;
[Bindable]
public var pathWidth:Number = 200;
[Bindable]
public var pathHeight:Number = pathWidth + pathY;
private function applicationCompleteHandler():void
{
_timelineMax = new TimelineMax();
_timelineMax.addChild( new TweenMax( this, 12, { pathY:height - myPath.height, ease:Elastic.easeOut } ) );
_timelineMax.addChild( new TweenMax( this, 2, { pathHeight:height, ease:Bounce.easeOut } ) );
_timelineMax.pause();
}
private function playClickHandler():void
{
_timelineMax.play();
}
protected function stopClickHandler():void
{
_timelineMax.currentTime = 0;
_timelineMax.stop();
}
protected function labelClickHandler():void
{
navigateToURL( new URLRequest( 'http://www.idemax.net/' ), '_blank' );
}
]]>
</fx:Script>
<s:Rect width="100%"
height="100%">
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="#ffffff" />
<s:GradientEntry color="#cccccc" />
</s:LinearGradient>
</s:fill>
</s:Rect>
<mx:Image horizontalCenter="0"
verticalCenter="0"
source="@Embed('/assets/images/idemax.jpg')">
<mx:filters>
<mx:BlurFilter quality="3" />
</mx:filters>
</mx:Image>
<s:VGroup top="10"
left="10">
<s:Button label="play"
click="playClickHandler()" />
<s:Button label="stop"
click="stopClickHandler()" />
</s:VGroup>
<s:Path id="myPath"
data="m 0 {pathY}
q {pathWidth/2} {-((pathHeight-pathY)-pathWidth)} {pathWidth} 0
Q {pathWidth+((pathHeight-pathY)-pathWidth)} {(pathHeight-(pathWidth/2))-((pathHeight-pathY)-pathWidth)} {pathWidth} {pathHeight}
h {-pathWidth}
Q {-((pathHeight-pathY)-pathWidth)} {(pathHeight-(pathWidth/2))-((pathHeight-pathY)-pathWidth)} 0 {pathY}
z"
horizontalCenter="0">
<s:stroke>
<s:SolidColorStroke color="#333333"
weight="1" />
</s:stroke>
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="#a8d848" />
<s:GradientEntry color="#63802a"
alpha=".5" />
</s:LinearGradient>
</s:fill>
<s:filters>
<s:DropShadowFilter angle="90"
distance="20"
quality="3"
blurX="20"
blurY="20" />
</s:filters>
</s:Path>
<s:Label right="10"
bottom="10"
text="www.idemax.net"
fontWeight="bold"
alpha=".25"
click="labelClickHandler()"
buttonMode="true" />
</s:Application>
O ver ou baixar o projeto / código-fonte, clique com o botão direito na aplicação e depois em "View Source", ou clique aqui.
Qualquer dúvida, enviem para idemax@gmail.com.
segunda-feira, 3 de agosto de 2009
Seguindo o Mouse com Trigonometria
public function Main()
{
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
}
private function onMouseMoveHandler($event:MouseEvent):void
{
graphics.clear();
rotateEye(eye1);
rotateEye(eye2);
$event.updateAfterEvent();
}
var catAdj:Number = mouseX - $eye.x;
var catOp:Number = mouseY - $eye.y;
var hipot:Number = Math.sqrt((catAdj * catAdj) + (catOp * catOp));
var radians:Number = Math.asin(catOp / hipot);
var degree:Number = radians * (180 / Math.PI);
if (catAdj >= 0)
{
$eye.rotation = degree;
}
else
{
$eye.rotation = 180 - degree;
}
log.text = 'catAdj: ' + catAdj;
log.appendText('\ncatOp: ' + catOp);
log.appendText('\nhipot: ' + hipot);
log.appendText('\nradians: ' + radians);
log.appendText('\ndegree: ' + degree);
graphics.lineStyle(1, 0xff0000);
graphics.moveTo($eye.x, $eye.y);
graphics.lineTo(mouseX, mouseY);
graphics.lineStyle(1, 0xcccccc);
graphics.lineTo(mouseX, $eye.y);
graphics.lineTo($eye.x, $eye.y);
private function rotateEye($eye:MovieClip):void
{
var catAdj:Number = mouseX - $eye.x;
var catOp:Number = mouseY - $eye.y;
var hipot:Number = Math.sqrt((catAdj * catAdj) + (catOp * catOp));
var radians:Number = Math.asin(catOp / hipot);
var degree:Number = radians * (180 / Math.PI);
if (catAdj >= 0)
{
$eye.rotation = degree;
}
else
{
$eye.rotation = 180 - degree;
}
log.text = 'catAdj: ' + catAdj;
log.appendText('\ncatOp: ' + catOp);
log.appendText('\nhipot: ' + hipot);
log.appendText('\nradians: ' + radians);
log.appendText('\ndegree: ' + degree);
graphics.lineStyle(1, 0xff0000);
graphics.moveTo($eye.x, $eye.y);
graphics.lineTo(mouseX, mouseY);
graphics.lineStyle(1, 0xcccccc);
graphics.lineTo(mouseX, $eye.y);
graphics.lineTo($eye.x, $eye.y);
}
package
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField;
/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var eye1:MovieClip;
public var eye2:MovieClip;
public var log:TextField;
public function Main()
{
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
}
private function onMouseMoveHandler($event:MouseEvent):void
{
graphics.clear();
rotateEye(eye1);
rotateEye(eye2);
$event.updateAfterEvent();
}
private function rotateEye($eye:MovieClip):void
{
var catAdj:Number = mouseX - $eye.x;
var catOp:Number = mouseY - $eye.y;
var hipot:Number = Math.sqrt((catAdj * catAdj) + (catOp * catOp));
var radians:Number = Math.asin(catOp / hipot);
var degree:Number = radians * (180 / Math.PI);
if (catAdj >= 0)
{
$eye.rotation = degree;
}
else
{
$eye.rotation = 180 - degree;
}
log.text = 'catAdj: ' + catAdj;
log.appendText('\ncatOp: ' + catOp);
log.appendText('\nhipot: ' + hipot);
log.appendText('\nradians: ' + radians);
log.appendText('\ndegree: ' + degree);
graphics.lineStyle(1, 0xff0000);
graphics.moveTo($eye.x, $eye.y);
graphics.lineTo(mouseX, mouseY);
graphics.lineStyle(1, 0xcccccc);
graphics.lineTo(mouseX, $eye.y);
graphics.lineTo($eye.x, $eye.y);
}
}
}
quarta-feira, 15 de julho de 2009
Rotação 3D no Flash Player 10
package
{
import fl.controls.Slider;
import fl.events.SliderEvent;
import flash.display.MovieClip;
/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var avatar:MovieClip;
public var xAxis:Slider;
public var yAxis:Slider;
public var zAxis:Slider;
public function Main()
{
xAxis.addEventListener(SliderEvent.CHANGE, onSliderChange);
yAxis.addEventListener(SliderEvent.CHANGE, onSliderChange);
zAxis.addEventListener(SliderEvent.CHANGE, onSliderChange);
}
private function onSliderChange(event:SliderEvent):void
{
var slider:Slider = event.target as Slider;
switch(slider)
{
case xAxis:
avatar.rotationX = slider.value;
break;
case yAxis:
avatar.rotationY = slider.value;
break;
case zAxis:
avatar.rotationZ = slider.value;
break;
}
}
}
}
quarta-feira, 1 de julho de 2009
Criando e Disparando Eventos Customizados - 2ª Parte
- Cada botão no MouseEvent.CLICK dispara um evento dizendo que é para girar um certo elemento.
- O método listener do evento que o botão disparou verifica em qual elemento deve ser feito o bloco de comandos (no caso, girar)
package
{
import flash.events.Event;
/**
* ...
* @author www.idemax.net
*/
public class MeuEvento extends Event
{
public static const GIRAR_ELEMENTO:String = 'girarElemento';
public function MeuEvento(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
public var instancia:String;
public var elemento:MovieClip;
package
{
import flash.display.MovieClip;
import flash.events.Event;
/**
* ...
* @author www.idemax.net
*/
public class MeuEvento extends Event
{
public static const GIRAR_ELEMENTO:String = 'girarElemento';
public var instancia:String;
public var elemento:MovieClip;
public function MeuEvento(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
public function Main()
{
addEventListener(MeuEvento.GIRAR_ELEMENTO, onGirarElementoHandler);
btnAzul.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVerde.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVermelho.addEventListener(MouseEvent.CLICK, onBtnClick);
}
var buttonClicked:Button = event.target as Button;
var evt:MeuEvento = new MeuEvento(MeuEvento.GIRAR_ELEMENTO);
switch(buttonClicked)
{
case btnAzul:
evt.elemento = azul;
break;
case btnVerde:
evt.instancia = 'verde';
break;
case btnVermelho:
evt.elemento = vermelho;
break;
}
dispatchEvent(evt);
private function onBtnClick(event:MouseEvent):void
{
var buttonClicked:Button = event.target as Button;
var evt:MeuEvento = new MeuEvento(MeuEvento.GIRAR_ELEMENTO);
switch(buttonClicked)
{
case btnAzul:
evt.elemento = azul;
break;
case btnVerde:
evt.instancia = 'verde';
break;
case btnVermelho:
evt.elemento = vermelho;
break;
}
dispatchEvent(evt);
}
if (event.elemento == null && event.instancia == null) return; // Se não for declarado algum elemento para ser girado
if (event.elemento != null && event.instancia != null) return; // Se os dois argumentos forem declarados, deve-se escolher um
var girarElemento:MovieClip;
if (event.elemento != null)
{
girarElemento = event.elemento as MovieClip;
}
else if (event.instancia != null)
{
girarElemento = this[event.instancia as String] as MovieClip;
}
girarElemento.rotation = Math.random() * 360;
private function onGirarElementoHandler(event:MeuEvento):void
{
if (event.elemento == null && event.instancia == null) return; // Se não for declarado algum elemento para ser girado
if (event.elemento != null && event.instancia != null) return; // Se os dois argumentos forem declarados, deve-se escolher um
var girarElemento:MovieClip;
if (event.elemento != null)
{
girarElemento = event.elemento as MovieClip;
}
else if (event.instancia != null)
{
girarElemento = this[event.instancia as String] as MovieClip;
}
girarElemento.rotation = Math.random() * 360;
}
package
{
import fl.controls.Button;
import flash.display.MovieClip;
import flash.events.MouseEvent;
/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var vermelho:MovieClip;
public var verde:MovieClip;
public var azul:MovieClip;
public var btnVermelho:Button;
public var btnVerde:Button;
public var btnAzul:Button;
public function Main()
{
addEventListener(MeuEvento.GIRAR_ELEMENTO, onGirarElementoHandler);
btnAzul.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVerde.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVermelho.addEventListener(MouseEvent.CLICK, onBtnClick);
}
private function onBtnClick(event:MouseEvent):void
{
var buttonClicked:Button = event.target as Button;
var evt:MeuEvento = new MeuEvento(MeuEvento.GIRAR_ELEMENTO);
switch(buttonClicked)
{
case btnAzul:
evt.elemento = azul;
break;
case btnVerde:
evt.instancia = 'verde';
break;
case btnVermelho:
evt.elemento = vermelho;
break;
}
dispatchEvent(evt);
}
private function onGirarElementoHandler(event:MeuEvento):void
{
if (event.elemento == null && event.instancia == null) return; // Se não for declarado algum elemento para ser girado
if (event.elemento != null && event.instancia != null) return; // Se os dois argumentos forem declarados, deve-se escolher um
var girarElemento:MovieClip;
if (event.elemento != null)
{
girarElemento = event.elemento as MovieClip;
}
else if (event.instancia != null)
{
girarElemento = this[event.instancia as String] as MovieClip;
}
girarElemento.rotation = Math.random() * 360;
}
}
}
terça-feira, 23 de junho de 2009
Argumentos Adicionais no Compiler
Obs.: Testado somente no Flex SDK 3.3.
Cedido com exclusividade para esse blog pelo Mateus Pádua.
segunda-feira, 22 de junho de 2009
Criando e Disparando Eventos Customizados - 1ª Parte
public class MeuEvento extends Event
public static const GIRAR_FORMA_AZUL:String = 'girarFormaAzul';
public static const GIRAR_FORMA_VERMELHA:String = 'girarFormaVermelha';
package
{
import flash.events.Event;
/**
* ...
* @author www.idemax.net
*/
public class MeuEvento extends Event
{
public static const GIRAR_FORMA_AZUL:String = 'girarFormaAzul';
public static const GIRAR_FORMA_VERMELHA:String = 'girarFormaVermelha';
public function MeuEvento(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
public class Main extends MovieClip
botao.addEventListener(MouseEvent.CLICK, onClickBotao);
addEventListener(MeuEvento.GIRAR_FORMA_AZUL, girarFormaAzul);
addEventListener(MeuEvento.GIRAR_FORMA_VERMELHA, girarFormaVermelha);
private function onClickBotao(event:MouseEvent):void
{
switch(radioButtonGroup.selection.value)
{
case 'forma1':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_AZUL));
break;
case 'forma2':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_VERMELHA));
break;
}
}
private function girarFormaAzul(event:MeuEvento):void
{
forma1.rotation += 45;
}
private function girarFormaVermelha(event:MeuEvento):void
{
forma2.rotation -= 45;
}
package
{
import fl.controls.Button;
import fl.controls.CheckBox;
import fl.controls.RadioButton;
import fl.controls.RadioButtonGroup;
import flash.display.MovieClip;
import flash.events.MouseEvent;
/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var botao:Button;
public var radioButtonGroup:RadioButtonGroup = new RadioButtonGroup('radioButtonGroup');
public var radioButtonAzul:RadioButton;
public var radioButtonVermelho:RadioButton;
public var forma1:MovieClip;
public var forma2:MovieClip;
public function Main()
{
addEventListener(MeuEvento.GIRAR_FORMA_AZUL, girarFormaAzul);
addEventListener(MeuEvento.GIRAR_FORMA_VERMELHA, girarFormaVermelha);
botao.addEventListener(MouseEvent.CLICK, onClickBotao);
}
private function onClickBotao(event:MouseEvent):void
{
switch(radioButtonGroup.selection.value)
{
case 'forma1':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_AZUL));
break;
case 'forma2':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_VERMELHA));
break;
}
}
private function girarFormaAzul(event:MeuEvento):void
{
forma1.rotation += 45;
}
private function girarFormaVermelha(event:MeuEvento):void
{
forma2.rotation -= 45;
}
}
}
domingo, 17 de maio de 2009
Loader do Stage e de aquivos externos (Preloader)
package
{
import fl.controls.ProgressBarMode;
import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
private var externalLoader:Loader;
public function Main()
{
stop();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
loaderInfo.addEventListener(Event.INIT, onStageLoaderInit);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, onStageLoaderProgress);
loaderInfo.addEventListener(Event.COMPLETE, onStageLoaderComplete);
}
/**
* Iniciou o carregamento do STAGE
* @param event
*/
private function onStageLoaderInit(event:Event):void
{
event.target.removeEventListener(Event.INIT, onStageLoaderInit);
stageLoader.label.text = '0%';
}
/**
* Enquando está carregando o STAGE
* @param event
*/
private function onStageLoaderProgress(event:ProgressEvent):void
{
var pct:Number = Math.round((event.bytesLoaded / event.bytesTotal) * 100);
stageLoader.label.text = pct + '%';
}
/**
* O STAGE acabou de carregar
* @param event
*/
private function onStageLoaderComplete(event:Event):void
{
event.target.removeEventListener(Event.COMPLETE, onStageLoaderComplete);
addFrameScript(1, onFrame2);
gotoAndStop(2);
}
/**
* Linha do tempo no FRAME 2
*/
private function onFrame2():void
{
botao.label = 'carregar imagem externa';
botao.addEventListener(MouseEvent.CLICK, onButtonClick);
externalLoader = new Loader();
externalLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onExternalLoaderProgress);
externalLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onExternalLoaderComplete);
}
/**
* Quando o botão de 'carregar imagem externa' é clicaco
* É iniciado o Loader
* @param event
*/
private function onButtonClick(event:MouseEvent):void
{
botao.enabled = false;
barra.mode = ProgressBarMode.MANUAL;
externalLoader.load(new URLRequest('imagem_externa.jpg'));
}
/**
* Enquando carrega a imagem externa
* @param event
*/
private function onExternalLoaderProgress(event:ProgressEvent):void
{
barra.setProgress(event.bytesLoaded, event.bytesTotal);
}
/**
* A imagem externa está carregada
* @param event
*/
private function onExternalLoaderComplete(event:Event):void
{
event.target.removeEventListener(Event.COMPLETE, onExternalLoaderComplete);
externalLoader.width = 550;
externalLoader.height = 400;
addChild(externalLoader);
}
}
}
Paint em Actionscript 3.0
package
{
import fl.controls.Button;
import fl.controls.ColorPicker;
import fl.controls.Slider;
import fl.events.ColorPickerEvent;
import fl.events.SliderEvent;
import flash.display.MovieClip;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.text.TextField;
import flash.ui.Mouse;
/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
private var margin:Number = 10;
private var rounding:Number = 20;
private var border:Number = 5;
private var defaultWord:String = 'desenhe na área branca acima';
private var brushMinimum:Number = 1;
private var brushCurrent:Number = 10;
private var brushMaximum:Number = 100;
private var drawEnable:Boolean = false;
private var startDrawingEnable:Boolean = false;
private var container:MovieClip;
private var panel:MovieClip;
private var panelTitle:TextField;
private var infoLabel:TextField;
private var drawStage:MovieClip;
private var tools:MovieClip;
private var toolsTitle:TextField;
private var labelColorPicker:TextField;
private var colorPicker:ColorPicker;
private var currentColor:uint;
private var slider:Slider;
private var labelSlider:TextField;
private var currentBrushSize:Number;
private var brushCicle:MovieClip;
private var drawMask:MovieClip;
private var drawContainer:MovieClip;
private var lineDraw:MovieClip;
private var button:Button;
private var linesDraw:Array;
private var drawMouseInspector:MovieClip;
/**
* Construtora da Classe
* Adiciona os listeners necessários e aplica as configurações básicas
* Os eventos "MainEvents" são personalizados
*/
public function Main()
{
loaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
stage.align = 'TL';
//stage.scaleMode = StageScaleMode.NO_SCALE;
stage.addEventListener(Event.RESIZE, onResizeStage);
addEventListener(MouseEvent.ROLL_OUT, onRollOutApplication);
addEventListener(MainEvents.CREATE_PANEL, onCreatePanelHandler);
addEventListener(MainEvents.CREATE_TOOLS, onCreateToolsHandler);
addEventListener(MainEvents.UPDATE_INFO_LABEL, onUpdateInfoLabelHandler);
addEventListener(MainEvents.UPDATE_BRUSH, onUpdateBrushHandler);
addEventListener(MainEvents.UPDATE_COMPLETE_BRUSH, onUpdateCompleBrushHandler);
addEventListener(MainEvents.UPDATE_COMPLETE_INFO_LABEL, onUpdateCompleInfoLabelHandler);
addEventListener(MainEvents.DRAW_START, onDrawStartHandler);
addEventListener(MainEvents.DRAWING, onDrawingHandler);
addEventListener(MainEvents.DRAW_COMPLETE, onDrawCompleteHandler);
}
/**
* Inicia a criação da aplicação quando a mesma foi totalmente carregada
* @param e
*/
private function onCompleteHandler(e:Event):void
{
dispatchEvent(new MainEvents(MainEvents.CREATE_PANEL));
}
/**
* Re-cria a aplicação quando as dimensões do STAGE são alteradas
* OBS.: Se houver desenho, ele será perdido
* @param e
*/
private function onResizeStage(e:Event):void
{
dispatchEvent(new MainEvents(MainEvents.CREATE_PANEL));
}
/**
* ANTI-BUG: Se o usuário rolar para fora da aplicação ele para de desenhar se estiver do modo DESENHO
* @param e
*/
private function onRollOutApplication(e:MouseEvent):void
{
dispatchEvent(new MainEvents(MainEvents.DRAW_COMPLETE));
}
/**
* Cria e configura os listeners dos elementos visuais, exceto os componentes das ferramentas
* @param e
*/
private function onCreatePanelHandler(e:MainEvents):void
{
if (container != null)
{
removeChild(container);
container = null;
}
container = new MovieClip();
addChild(container);
panel = new MovieClip();
panel.graphics.beginFill(0xcccccc);
panel.graphics.drawRoundRect(0, 0, stage.stageWidth - (margin * 2), stage.stageHeight - (margin * 2), rounding, rounding);
panel.graphics.endFill();
panel.x = panel.y = margin;
container.addChild(panel);
panelTitle = new TextField();
panelTitle.autoSize = 'left';
panelTitle.htmlText = 'Desenhando com o actionscript 3.0';
panelTitle.x = panelTitle.y = margin;
panel.addChild(panelTitle);
infoLabel = new TextField();
infoLabel.autoSize = 'left';
infoLabel.text = defaultWord;
infoLabel.x = margin;
infoLabel.y = panel.height - infoLabel.textHeight - margin;
panel.addChild(infoLabel);
drawStage = new MovieClip();
drawStage.graphics.lineStyle(border, 0x000000, .25);
drawStage.graphics.beginFill(0xffffff);
drawStage.graphics.drawRoundRect(0, 0, stage.stageWidth / 100 * 75, infoLabel.y - (panelTitle.y + panelTitle.textHeight + (margin * 2)), rounding, rounding);
drawStage.graphics.endFill();
drawStage.x = margin;
drawStage.y = panelTitle.y + panelTitle.textHeight + margin;
panel.addChild(drawStage);
drawContainer = new MovieClip();
panel.addChild(drawContainer);
drawMask = new MovieClip();
drawMask.graphics.beginFill(0x000000);
drawMask.graphics.drawRoundRect(0, 0, stage.stageWidth / 100 * 75, infoLabel.y - (panelTitle.y + panelTitle.textHeight + (margin * 2)), rounding, rounding);
drawMask.graphics.endFill();
drawMask.x = margin;
drawMask.y = panelTitle.y + panelTitle.textHeight + margin;
panel.addChild(drawMask);
drawContainer.mask = drawMask;
drawMouseInspector = new MovieClip();
drawMouseInspector.addEventListener(MouseEvent.ROLL_OVER, onRollOverMouseInspector);
drawMouseInspector.addEventListener(MouseEvent.ROLL_OUT, onRollOutMouseInspector);
drawMouseInspector.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownMouseInspector);
drawMouseInspector.addEventListener(MouseEvent.MOUSE_UP, onMouseUpMouseInspector);
drawMouseInspector.graphics.beginFill(0xff0000, 0);
drawMouseInspector.graphics.drawRoundRect(0, 0, stage.stageWidth / 100 * 75, infoLabel.y - (panelTitle.y + panelTitle.textHeight + (margin * 2)), rounding, rounding);
drawMouseInspector.graphics.endFill();
drawMouseInspector.x = margin;
drawMouseInspector.y = panelTitle.y + panelTitle.textHeight + margin;
panel.addChild(drawMouseInspector);
tools = new MovieClip();
tools.graphics.lineStyle(border, 0x000000, .25);
tools.graphics.beginFill(0xffffff);
tools.x = drawStage.x + drawStage.width + margin;
tools.y = drawStage.y;
toolsTitle = new TextField();
toolsTitle.autoSize = 'left';
toolsTitle.htmlText = 'Ferramentas';
toolsTitle.x = toolsTitle.y = margin;
tools.addChild(toolsTitle);
container.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownContainer);
container.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveContainer);
container.addEventListener(MouseEvent.MOUSE_UP, onMouseUpContainer);
dispatchEvent(new MainEvents(MainEvents.CREATE_TOOLS));
}
/**
* Crias e configuras os listeners dos componentes das ferramentas
* @param e
*/
private function onCreateToolsHandler(e:MainEvents):void
{
linesDraw = new Array();
labelColorPicker = new TextField();
labelColorPicker.autoSize = 'left';
labelColorPicker.text = 'Selecione a cor:';
labelColorPicker.x = margin;
labelColorPicker.y = toolsTitle.y + toolsTitle.textHeight + (margin * 3);
tools.addChild(labelColorPicker);
colorPicker = new ColorPicker();
colorPicker.addEventListener(ColorPickerEvent.CHANGE, onColorPickerChange);
colorPicker.x = labelColorPicker.x + labelColorPicker.textWidth + margin;
colorPicker.y = labelColorPicker.y;
tools.addChild(colorPicker);
currentColor = colorPicker.selectedColor;
labelSlider = new TextField();
labelSlider.autoSize = 'left';
labelSlider.text = 'Tamanho do pincel:';
labelSlider.x = margin;
labelSlider.y = colorPicker.y + colorPicker.height + (margin * 3);
tools.addChild(labelSlider);
slider = new Slider();
slider.addEventListener(SliderEvent.CHANGE, onSliderChange);
slider.minimum = brushMinimum;
slider.maximum = brushMaximum;
slider.x = margin * 2;
slider.y = labelSlider.y + labelSlider.textHeight + margin;
slider.value = brushCurrent;
tools.addChild(slider);
currentBrushSize = slider.value;
button = new Button();
button.addEventListener(MouseEvent.CLICK, onClickButtonCleanScreean);
button.label = 'limpar tela';
button.x = margin;
button.y = slider.y + slider.height + (margin * 3);
tools.addChild(button);
tools.graphics.drawRoundRect(0, 0, stage.stageWidth - drawStage.width - (margin * 5), button.y + button.height + margin, rounding, rounding);
tools.graphics.endFill();
panel.addChild(tools);
}
/**
* O usuário rolou para dentro da área de desenho
* @param e
*/
private function onRollOverMouseInspector(e:MouseEvent):void
{
var mc:MovieClip = e.target as MovieClip;
mc.addEventListener(Event.ENTER_FRAME, onEnterFrameDrawStage);
}
/**
* O usuário rolou para fora da área de desenho
* @param e
*/
private function onRollOutMouseInspector(e:MouseEvent):void
{
var mc:MovieClip = e.target as MovieClip;
mc.removeEventListener(Event.ENTER_FRAME, onEnterFrameDrawStage);
dispatchEvent(new MainEvents(MainEvents.UPDATE_COMPLETE_BRUSH));
dispatchEvent(new MainEvents(MainEvents.UPDATE_COMPLETE_INFO_LABEL));
}
/**
* O usuário começa a desenhar na área de desenho
* @param e
*/
private function onMouseDownMouseInspector(e:MouseEvent):void
{
startDrawingEnable = true;
}
/**
* O usuário parou de desenhar
* @param e
*/
private function onMouseUpMouseInspector(e:MouseEvent):void
{
startDrawingEnable = false;
}
/**
* O usuário soltou o botão esquerdo do mouse dentro da aplicação
* @param e
*/
private function onMouseUpContainer(e:MouseEvent):void
{
dispatchEvent(new MainEvents(MainEvents.DRAW_COMPLETE));
}
/**
* O usuário está movimentando o mouse dentro da aplicação
* @param e
*/
private function onMouseMoveContainer(e:MouseEvent):void
{
dispatchEvent(new MainEvents(MainEvents.DRAWING));
}
/**
* O usuário tenta desenhar dentro da aplicação
* A aplicação verifica se o usuário está tentando
* dentro da área de desenho
* @param e
*/
private function onMouseDownContainer(e:MouseEvent):void
{
if (!startDrawingEnable) return;
dispatchEvent(new MainEvents(MainEvents.DRAW_START));
}
/**
* Dispara enquanto o usuário está com o mouse dentro da área de desenho
* @param e
*/
private function onEnterFrameDrawStage(e:Event):void
{
dispatchEvent(new MainEvents(MainEvents.UPDATE_INFO_LABEL));
dispatchEvent(new MainEvents(MainEvents.UPDATE_BRUSH));
}
/**
* Posiciona o ponteiro de desenho na mesma posição do mouse do usuário
* enquanto o mesmo se encontra na área de desenho
* @param e
*/
private function onUpdateBrushHandler(e:MainEvents):void
{
if (infoLabel == null) return;
if (brushCicle != null) drawContainer.removeChild(brushCicle);
Mouse.hide();
brushCicle = new MovieClip();
brushCicle.graphics.lineStyle(border, 0x000000, .5);
brushCicle.graphics.beginFill(currentColor);
brushCicle.graphics.drawCircle(drawContainer.mouseX, drawContainer.mouseY, currentBrushSize);
brushCicle.graphics.endFill();
drawContainer.addChild(brushCicle);
}
/**
* Atualiza o LOG de posição cartesiana do ponteiro do mouse na área de desenho
* enquanto o mesmo se encontra na área de desenho
* @param e
*/
private function onUpdateInfoLabelHandler(e:MainEvents):void
{
if (infoLabel == null) return;
infoLabel.text = 'x: ' + drawStage.mouseX + ' - y: ' + drawStage.mouseY;
}
/**
* Seta a mensagem padrão quando o usuário não está com o
* ponteiro do mouse sobre a área de desenho
* @param e
*/
private function onUpdateCompleInfoLabelHandler(e:MainEvents):void
{
infoLabel.text = defaultWord;
}
/**
* Quando o ponteiro do mouse sai da área de desenho, o ponteiro de desenho some
* e da lugar novamente ao ponteiro do mouse
* @param e
*/
private function onUpdateCompleBrushHandler(e:MainEvents):void
{
if (brushCicle != null)
{
drawContainer.removeChild(brushCicle);
brushCicle = null;
}
Mouse.show();
}
/**
* Fecha a linha desenhada pelo usuário e deixa a variável preparada para uma nova
* @param e
*/
private function onDrawCompleteHandler(e:MainEvents):void
{
drawEnable = false;
if (lineDraw == null) return;
lineDraw.graphics.endFill();
lineDraw = null;
}
/**
* Desenha as linhas referente ao ponteiro do mouse
* @param e
*/
private function onDrawingHandler(e:MainEvents):void
{
if (!drawEnable) return;
lineDraw.graphics.lineTo(drawContainer.mouseX, drawContainer.mouseY);
}
/**
* Cria um ponto caso o usuário somente queira pontilhar
* e inicia a nova linha
* @param e
*/
private function onDrawStartHandler(e:MainEvents):void
{
var dot:MovieClip = new MovieClip();
dot.graphics.beginFill(currentColor);
dot.graphics.drawCircle(drawContainer.mouseX, drawContainer.mouseY, currentBrushSize);
linesDraw.push(drawContainer.addChild(dot));
lineDraw = new MovieClip();
lineDraw.graphics.moveTo(drawContainer.mouseX, drawContainer.mouseY);
lineDraw.graphics.lineStyle(currentBrushSize * 2, currentColor);
linesDraw.push(drawContainer.addChild(lineDraw));
drawEnable = true;
}
/**
* Guarda a cor escolhida
* @param e
*/
private function onColorPickerChange(e:ColorPickerEvent):void
{
var cp:ColorPicker = e.target as ColorPicker;
currentColor = cp.selectedColor;
}
/**
* Guarda o tamanho do pincel escolhido
* @param e
*/
private function onSliderChange(e:SliderEvent):void
{
var sld:Slider = e.target as Slider;
currentBrushSize = sld.value;
}
/**
* Limpa os desenho feitos
* @param e
*/
private function onClickButtonCleanScreean(e:MouseEvent):void
{
for (var i:int = 0; i < linesDraw.length; i++)
{
var mc:MovieClip = linesDraw[i] as MovieClip;
drawContainer.removeChild(mc);
}
linesDraw = new Array();
}
}
}
package
{
import flash.events.Event;
/**
* ...
* @author www.idemax.net
*/
public class MainEvents extends Event
{
public static const CREATE_PANEL:String = 'createPanel';
public static const CREATE_TOOLS:String = 'createTools';
public static const UPDATE_INFO_LABEL:String = 'updateInfoLabel';
public static const UPDATE_BRUSH:String = 'updateBrush';
public static const UPDATE_COMPLETE_INFO_LABEL:String = 'updateCompleteInfoLabel';
public static const UPDATE_COMPLETE_BRUSH:String = 'updateCompleteBrush';
public static const DRAW_START:String = 'drawStart';
public static const DRAWING:String = 'drawing';
public static const DRAW_COMPLETE:String = 'drawComplete';
public function MainEvents(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
domingo, 29 de março de 2009
Trigonometria com Actionscript
"O ângulo definido no centro de um círculo por um arco de circunferência com o mesmo comprimento que o raio do círculo é 1 radiano".
Fonte: Wikipédia - 29/03/2009 - http://pt.wikipedia.org/wiki/Radianos
6,28 radianos (360º).
meuMc.rotation = 270;
trace(meuMc.rotation);
//Retorna: -90
Px = cosseno(radiano) * raio;
Py = seno(radiano) * raio;
var radius:Number = 100;
var circle:Shape = new Shape();
circle.graphics.lineStyle(1);
circle.graphics.moveTo(radius, 0);
for (var i:int = 0; i <= 360; i++)
{
var radian:Number = i * (Math.PI / 180);
var xPoint:Number = Math.cos(radian) * radius;
var yPoint:Number = Math.sin(radian) * radius;
circle.graphics.lineTo(xPoint, yPoint);
}
circle.graphics.endFill();
circle.x = stage.stageWidth / 2;
circle.y = stage.stageHeight / 2;
addChild(circle);
clique aqui