Você está na página 1de 8

Fórmulas Essenciais de ActionScript

--------------------------------------------------------------------------------------------------------------------------------------------------

A. Introdução
Muitas vezes a gente pensa que usar formulas em Flash requere um grande conhecimento de matemática e
programação orientada a objetos. Na realidade é algo distinto. Basta ter alguns conhecimentos básicos e uma
grande disposição para achar soluções.
Neste artigo, vamos tratar de algumas fórmulas essenciais e seu emprego para criar efeitos e aplicações mais
complexas.

B. As favoritas
A seguir vamos descrever 3 fórmulas que são muito usadas pelos desenvolvedores em Flash e que devem
ser as as primeiras (principalmente) a serem aprendidas

B.1 Easing. Esta fórmula é a mais comum e umas das primeiras a se aprender:

v += ( vf - va ) / d
v valor
vf valor final
va valor atual
d fator da divisão

O q essa fórmula faz é passar um valor para outro, diminuindo a velocidade a medida que alcança o valor
final.

Exemplo 1: Para criar um mouse trailer simples, pode-se usar esta formula. Substituindo as variáveis na
formula baseado no eixo X e supondo q as ações estão dentro de uma instacia de filme (movie clip), nós
temos a seguinte formula:

_x += ( _parent._xmouse -_x ) / 10;

Fazendo o mesmo para o eixo Y:

_y += ( _parent._ymouse - _y ) / 10 ;

O script completo ficaria assim:

onClipEvent(enterFrame){
_x += ( _parent._xmouse -_x ) / 10;
_y += ( _parent._ymouse -_y ) / 10;
}

B.2 Bounce. Esta formula faz basicamento o mesmo da fórmula anterior, para um valor para outro, porém,
dando um efeito de elasticidade.

v += (vt = vt * f + (vf - va) * r)


v valor
vr valor temporal
f fricção
vf valor final
va valor atual
r raio

Exemplo 2: Se substituirmos a fórmula de easing do exemplo anterior com a fórmula BOUNCE, o script ficaria
assim:

onClipEvent(load){
f = 0.9 ;
r = 0.03 ;
}
onClipEvent(enterFrame){
_x += ( xt = xt * f + ( _parent._xmouse - _x ) * r ) ;
_y += ( xt = xt * f + ( _parent._ymouse - _y ) * r ) ;
}

B.3 Gravity. Há mais que uma opção, neste caso nós usaremos a forma simples. Há de se tomar em conta
que o stage (área de trabalho) do Flash, se compararmos com um plano cartesiano, ele se encontra no
quadrante inferior direito. É por esta razão q para orientar um clip para o lado direito, aumentamos
apropriedade _x, e para orienta-lo para esquerda diminuímos a mesma propriedade. Para orientar o clip para
cima precisamos diminuir a propriedade _y, e para baixo, aumentamos o _y.

A fórmula:
y += (yvel = (yvel+g)* f)
y coordenada y
yvel velocidade em y
g gravidade
f fricção

Exemplo 3: Este é um exemplo simples em que inicamos com uma velocidade de -15:

onClipEvent(load){
yvel=-15
gravidade=3
friccao=0.96
}
onClipEvent(enterFrame){
_y += (yvel = (yvel+gravedad)* friccion)
}

C. O que eu faço com isso?

Aqui é onde vem o difícil, você terá que pensar em soluções. Suponhamos que queremos fazer um sistema
de navegação como do Barneys.com, em que o fundo se move para chegarmos a seção desejada.

Exemplo 4: Temos duas fórmulas para mover clipes especificando o ponto final....easing e bounce. Usemos
easing...obviamente o fundo terá q ser um movie clip para poder ser movido. Se a área de trabalho é de
300x150 e temos 3 seções, e queremos que se movam de maneira horizontal, então necessitamos um movie
clip fundo de 900x150. Edite o seu movie clip de forma q o seu centro fique no canto esquerdo superior que
será o ponto (0,0).
Como a imagem começa em (0,0) e a largura é de 300.... isso será a unidade para mover o fundo. Asim, a
primeira seção estará em (0,0), a segunda em (-300,0) e a terceira em (-600,0).

Por que movemos em números negativos no eixo x? Porque a imagem se movimentará para a esquerda.
(explicação do plano cartesiano acima, lembra?)

Então, vamos ao script. Teremos uma variavel com nome "x" que será a que nos dirá a que posição o movie
clip irá. Como a posição inicial em X (0), iniciaremos o script que deverá ser posto no único clip que tem na
cena, ou seja, o fundo a ser movido.

onClipEvent(load){
x=0
}

Agora, poremos o script que fará que todo o clip se mova, neste caso somente no eixo x:

onClipEvent(enterFrame){
_x += (x-_x)/4;
}
Tudo isso....!!!! Isso é tudo para que todo o movie clipe se mova. Agora nós mudaremos o valor de "x" de
forma que os movimentos do movie clipe de fundo se mova para a posição que nós queremos.

Primeiro nós temos que pôr um nome de instância para o fundo, neste caso estará "back". Agora nós
precisamos 3 botões e cada botão terão o script a seguir:

on(press){
back.x = 0 // para bt 1
}
on(press){
back.x = -300 // para bt 2
}
on(press){
back.x = -600 // para bt 1
}

Isso é tudo que precisamos para o sistema de navegação......

No exemplo acima, nós mudamos a propriedade _x, mas que tal se nós também mudássemos outras
propriedades, como a posição em Y (_y) e a rotação (_rotation).

Exemplo 5: Suponhamos que nosso stage tenha 300x150 e a imagem de fundo tem 400x400 e temos
também 3 posições diferentes, que levam em conta as propriedades _x, _y, _rotation.
Realizaremos o mesmo procedimento do exemplo anterior:

onClipEvent(load){
x = 200
y = -50
rot = 0
}

onClipEvent(enterFrame){
_x += (x-_x)/4;
_y += (y-_y)/4;
_rotation += (rot-_rotation)/4;
}

Na instancia deste clip poremos o nome de "back" e nos botões, poremos o seguinte codigo com os
parâmetros que escolhemos:

on(press){ // bt1
back.x = 200
back.y = -50
back.rot = 0
}

on(press){ // bt 2
back.x = 176
back.y = 70
back.rot = -45
}

on(press){ // bt3
back.x = 148
back.y = 45
back.rot = 40
}

O efeite se será mais interessante q o anterior. Pode-se ver que o script tem várias propriedades, você só terá
que acostumar-se para usa-las adequadamente. Bem, como haviamos comentado antes, é importante
esboçar os problemas e organizar uma solução. Para isso teremos uma pergunta básica: O que eu preciso?
... esta pergunta sempre nos ajudará a começar um esboço do que nós queremos. Outra ferramenta boa é ter
livrarias de scripts, isto nos ajuda a reduzir o tempo que nos ocupamos a desenvolver um script, de forma que
nao precisemos reescrevê-lo.

D. Criando prototypes.

No Flash, os objetos tem uma propriedade chama Prototype , esta propriedade (que tambem e um objeto) é
usada para para nomear outras propriedades a uma classe. Quer dizer, levemos em conta que MovieClip é
uma classe, e nós queremos nomear um método novo à classe inteira MovieClip:

MovieClip.prototype.mensagem = "O mundo vai se acabar..!!"

Assim, estamos criando uma propriedade chamada "mensagem" à clase MovieClip, quer dizer que todos os
movie clips que existem vao ter essa propriedade. Se há dois clipes chamados "um" e "dois" respectivamente,
ambos possuiriam aquela propriedade, quer dizer, um.mensagem e dois.mensagem conteriam a cadeia "O
mundo terminará!!."

Isto também se aplica para funcões que construem métidos. Por exemplo:

MovieClip.prototype.mover = function () {
_x++
}

No script acima (que pode ser posto no 1º frame ou dentro de um movie clip, não importa...) cria um método
chamado "mover()" que vai funcionar para todos os movie clips

Exemplo 6: Construiremos um prototype utilizando a fórmula Bounce:

MovieClip.prototype.bounce = function(x, y){


var f= 0.7; var r= 0.3;
_x+= ( xvel= xvel * f + ( x - _x ) * r )
_y+= ( yvel= yvel * f + ( y - _y ) * r )
}

Este novo metodo já pode ser usado em qualquer movie clip, basta especificar a localização (x,y), para onde
você quer que ele vá. Usaremos as coordenadas do mouse:

onClipEvent( enterFrame ){
bounce( _parent._xmouse, _parent._ymouse )
}

Este é um modo para ter um pouco melhor organizado o seu script, ou simplesmente um modo para usar de
novo os scripts que nós já fizemos anteriormente.

Exemplo7: Suponhamos que queremos fazer um menu que tenha 5 botões de maneira vertical, separados
por 20 pixels um do outro, e que tambem esse menu seja arrastável, dando a impressão que os bts estejam
unidos por uma corta invisível.

O que precisamos?
Precisamos fazer um drag no bt que puxará os outros. Nós precisamos também que os outros bts continuem
unidos ao primeiro, em forma de uma cadeia.

Ok, primeiro inserimos um bt dentro de um movie clip e nele pomos o seguinte script:

on(press){
this.startDrag()
}
on(release,releaseOutside){
stopDrag()
}

Agora, o que continua... nós precisamos mover ao outro.... nós usamos o protótipo Bounce, que nós já temos,
com uma modificação pequena ao valor "f" e de "r":

MovieClip.prototype.bounce = function(x, y){


var f= 0.7; var r= 0.2;
_x+= ( xvel= xvel * f + ( x - _x ) * r )
_y+= ( yvel= yvel * f + ( y - _y ) * r )
}

E por último, é necessário lhes falar onde eles têm que se mover. Vamos resolver isto da seguinte maneira:
nós poremos os 5 clipes dentro de uma Array, para ficar mais fácil de manipular os dados... (há as pessoas
que preferem não usar Arrays).

onClipEvent(load){
a= _root.a
a._visible= 0
num= 4
dist= 20
clips= [this]
for(var i= 1; i<= 4; i++){
a.duplicateMovieClip("a"+i,i)
clips[i]= _root["a"+i]
}
}
onClipEvent(enterFrame){
for(var i= 1; i<= 4; i++){
clips[i].bounce(clips[i-1]._x, clips[i-1]._y + dist )
}
}

Neste caso, o clipe arrastado é o que controla todos os demais, e é o que diz que os outros continuam presos
a este.

E. Complicando a vida

Bom... agora nós vamos fazer algo mais complexo... que tal um redemoinho de letras? E que essas letras
saiam do redemoinho, caindo, e formando uma palavra, quando você fizer um rollOver sobre um bt.

Exemplo 8: Para fazer um redemoinho, precisamos de uma fórmula que descreva uma circunferência, coisa
que qualquer livro de matematica basica tem.
No caso, usaremos estas:

x = cos(ang) * radio
y = sin (ang) * radio

Assim, nós usaremos métodos "sin" e "cos" do objeto "Math" (Math.cos (), Math.sin ()). é importante se
lembrar daquele Flash usa radianes e graus de non na Matemática de objeto. Assim nós precisamos
converter de graus a radianes se é que nós queremos ter uma base em graus.
Para isso, construiremos dois metidos no objeto Math

Para isto nós construiremos dois métodos no objeto Math que nos farão o trabalho de transcurso de graus
para radianos.
Math.sin2 = function (angulo) { return Math.sin(angulo*Math.PI/180) }
Math.cos2 = function (angulo) { return Math.cos(angulo*Math.PI/180) }

Agora Bom... agora é necessário criar um método que nos dê movimento circular.

movieClip.prototype.circular= function(){
if(!ang) ang = Math.floor(Math.random() * 360)
if(!radio) radio = Math.floor(Math.random() * 50) + 25
if(!sentido) sentido = (Math.random() * 10) - 5
xC = Math.cos2 (ang) * radio
yC = M ath.sin2 (ang) * radio
ang+= sentido
}

O método acima cria 3 variáveis (ang, radio e sentido), que realizam um movimento circular, e armazenam os
valores em outras 2 variáveis "xC" e "yC".

movieClip.prototype.easing= function( x, y){


var x= x; var y= y
_x+= (x - _x) / 3
_y+= (y - _y) / 3
}

E por último, usaremos um método de gravidade:

movieClip.prototype.gravity= function(){
var friccao= 0.96; var gravidade= 3
if(!yvel) yvel = -(Math.random()*20)
if(_y+yvel+gravidade > 100) {
_y=100; yvel *= -1
} else{
_y += (yvel = (yvel+gravidade)* friccao)
}
}

O que o script acima faz, é gerar a gravidade, mas descobrir quando você chega à coordenada 100 para fazer
um recuo que inverte a velocidade em "yvel." E terminar, é necessário amarrar todos os eventos:
duplicar clipes usando as palavras e os pondo em ordens

onClipEvent (load) {
//duplicar clips usando as palavras e inserindo-os em arrays
letra._visible = 0;
count = 0;
espacio = 10;
palavras = ["FoxSux", "PanSux", "ProvidaSux"];
// array das palavras
clips = [];
// array que irá conter cada grupo de letras por palavra
for (var i = 0; i
clips[i] = [];
// array que contendrá cada letra
clips[i]["accion"] = "girar";
// array noNumérico, con acción a realizar
for (var j = 0; j
count++;
letra.duplicateMovieClip("letra"+count, count);
clips[i][j] = this["letra"+count];
clips[i][j].letra = substring(palabras[i], (j+1), 1);
clips[i][j].xF = (-(espacio*palabras[i].length)/2)+espacio*j;
clips[i][j].yF = i*espacio;
}
}
}
onClipEvent (enterFrame) {
for (var i = 0; i
for (var j = 0; j
// verificar acaoa realizar
if (clips[i]["accion"] == "girar") {
clips[i][j].circular();
clips[i][j].easing(clips[i][j].xC, clips[i][j].yC);
} else if (clips[i]["accion"] == "acomodar") {
clips[i][j].easing(clips[i][j].xF, clips[i][j].yF);
} else {
clips[i][j].gravity();
}
}
}
}

As ações vão se mudando de acordo com o estado dos botões

on(rollOver){
letras.clips[0]["accion"] = "acomodar"
}
on(rollOut){
letras.clips[0]["accion"] = "girar"
}
on(press){
letras.clips[0]["accion"] = "caer"
}

A única coisa que vai e muda entre os botões, é o número: de 0 à 1, e à 2.

F. Livrarias
Criar protótipos e objetos pré-definidos é muito útil, o que nos evita ter que reescrever o mesmo script toda
vez que precisarmos dele. Há muitos lugares onde se encontram livrarias públicas de prototypes e objetos.
Uma delas é http://www.layer51.com/proto/

Exemplo 9: Logo um protótipo que simula um movimento sinuoide em 3D:

// Math functions by Robert Penner


Math.sind = function (theta) { return Math.sin(theta*Math.PI/180) }
Math.cosd = function (theta) { return Math.cos(theta*Math.PI/180) }
Math.atan2d = function (y, x) { return Math.atan2(y, x)*180/Math.PI }
Math.dist = function (a, b) { return Math.sqrt((a*a) + (b*b) ) }
Math.r3 = function (a, b){ return b * 100 / a }

// 3D prototype by Rolf Ruiz


MovieClip.prototype.tresD3 = function ( angleXY, ratioXY, angleXZ , ratioXZ, id ){
za = Math.sind(angleXZ) * ratioXZ
zT = 300 + (za * 2)
zb = ( zT < 1 ) ? 1 : zT
_x = (Math.cosd(angleXY) * ratioXY) + (Math.cosd(angleXZ) * ratioXZ)
_y = Math.sind(angleXY) * ratioXY
_xscale = 300+zb
_yscale = 300+zb
depth = (int( _xscale * 100 ) * 100 ) + id
thie.swapDepths ( depth )
}

Um exemplo de seu emprego:

onClipEvent (load) {
num = 20;
f = 0.9;
r = 0.03;
w = 600;
h = 300;
bola._visible = 0;
for (i=1; i<=num; i++) {
bola.duplicateMovieClip("b"+i, i);
b = this["b"+i];
b.id = i;
b.angleXY = random(360);
b.ratioXY = 100;
b.angleXZ = random(360);
b.ratioXZ = 100;
b.tresD3(b.angleXY, b.ratioXY, b.angleXZ, b.ratioXZ, id);
}
}
onClipEvent (enterFrame) {
x = (Math.r3(w, _root._xmouse)-50)/10;
y = (Math.r3(h, _root._ymouse)-50)/10;
for (i=1; i<=num; i++) {
b = this["b"+i];
b.angleXZ += x;
b.angleXY += y;
b.tresD3(b.angleXY, b.ratioXY, b.angleXZ, b.ratioXZ, id);
}
}

// Rubiano Patrick Basquera

Você também pode gostar