Archive

Posts Tagged ‘Estudo’

Manipulação de audio

June 21st, 2010 No comments

Entre as novidades do Flash Player 10.1 existe a possibilidade de trabalhar a manipulação de som vinda do microfone. Dê uma olhada no estudo abaixo e deixe sua sugestão.

Ligue seu microfone e fone (é importante usar o fone), a webcam e dê uma olhada.

*Requer Flash Player 10.1

The Flash plugin is required to view this object.

Quer saber mais sobre transformações de audio, veja os links abaixo.

http://labs.hellokeita.com/

http://tv.adobe.com/watch/adc-presents/microphone-access-in-flash-player-101/

http://blog.onebyonedesign.com/?p=416

http://www.nickkuh.com/flash-flex-air/pitching-the-microphone-with-flash-player-10-1-beta/2010/03/

http://blog.andre-michelle.com/2009/pitch-mp3/

http://blog.onebyonedesign.com/?p=416

http://www.smart-page.net/blog/2009/12/30/sing-like-hal-with-the-flash-player-101/

Categories: ActionScript Tags: ,

Multitouch – Parte I

June 9th, 2010 No comments

Como (quase) todo mundo sabe, o Flash Player 10.1 e AIR 2.0 trazem suporte ao Multitouch, isso torna inúmeras possibilidades de interação viáveis. Ainda existe um grande problema que é a ausência de dispositivos preparados para este tipo de interação.

Para quem tem um Macbook Pro (entre outros dispositivos), já pode utilizar o Multitouch. No caso do Macbook, ainda existe a necessidade da aplicação estar rodando no AIR. Apesar disso, o desenvolvimento é extremamente simples, porém, é preciso muito cuidado com o que o dispositivo suporta.

Uma maneira simples de saber quais eventos o dispositivo suporta é usando:

trace(Multitouch.supportsTouchEvents, Multitouch.supportsGestureEvents);

Neste trace você poderá avaliar que tipo de eventos o dispositivo suporta, caso ele tenha suporte a Gestures, você ainda pode verificar quais eventos estão disponíveis.

trace(Multitouch.supportedGestures);

O código abaixo mostra as fases dos eventos, como não faria sentido disponibilizar um aplicativo em AIR para isso, depois do código está o print do retorno.

package net.brunoribeiro.multitouch
{
  import flash.display.Sprite;
  import flash.display.StageScaleMode;
  import flash.events.Event;
  import flash.events.TouchEvent;
  import flash.events.TransformGestureEvent;
  import flash.ui.Multitouch;
  import flash.ui.MultitouchInputMode;

  /**
   * @author Bruno Ribeiro
   */


  [SWF(backgroundColor="#FFFFFF", frameRate="31", width="800", height="600")]
  public class Main extends Sprite
  {
    public function Main()
    {
      Multitouch.inputMode = MultitouchInputMode.GESTURE;
      stage ?_init(null) : addEventListener(Event.ADDED_TO_STAGE, _init);
    }

    private function _init(event : Event) : void
    {
      stage.scaleMode = StageScaleMode.NO_SCALE;
      txtTouch.text   = Multitouch.supportsTouchEvents ? "disponível" : "indisponível";
      txtGesture.text = Multitouch.supportsGestureEvents ? "disponível" : "indisponível" ;
     
      if(Multitouch.supportsGestureEvents)
      {
        stage.addEventListener(TransformGestureEvent.GESTURE_ZOOM, _updateInfo, false, 0, true);
        stage.addEventListener(TransformGestureEvent.GESTURE_ROTATE, _updateInfo, false, 0, true);
        stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE, _updateInfo, false, 0, true);
        stage.addEventListener(TransformGestureEvent.GESTURE_PAN, _updateInfo, false, 0, true);
      }
    }
   
    private function _updateInfo (e:*) : void
    {
      txtTipo.text = e.type;
     
      txtLog.text += "\n--------";
      txtLog.text += "\n Tipo: " + e.type;
      txtLog.text += "\n Fase: " + e.phase;
     
      if(e.type == TransformGestureEvent.GESTURE_ZOOM)
      {
        txtLog.text += "\n Valor: " + e.scaleX;     }
      else if (e.type == TransformGestureEvent.GESTURE_ROTATE)
      {
        txtLog.text += "\n Valor: " + e.rotation;
      }
   
      txtLog.scrollV  = txtLog.maxScrollV;
    }
  }
}

Fases do evento

Categories: ActionScript Tags: ,

Puzzle em AS3

February 2nd, 2009 No comments

Um bom costume para programadores em geral, é buscar alguns desafios e tentar executá-los. Não necessariamente você precisa buscar algo extremamente complexo, só o fato de fazer algo já é um exercício e sempre positivo.

Há algumas semanas me pediram para criar um Puzzle, eu nunca havia criado um e fiquei imaginando como poderia para fazer isso. No caso existia a limitação do Flash Player, era necessário publicar no máximo, na versão 6.

Depois de entregue, resolvi portar para o AS3 e publicar aqui uma versão reduzida do código. Abaixo você pode vê-lo rodando.

The Flash plugin is required to view this object.

Como já havia um layout definido para as peças do puzzle, eu as aproveitei. Como o foco nesse caso não é a estrutura do Fla, vamos direto pro código.

 

package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.MovieClip;

import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;

import flash.events.MouseEvent;
import flash.events.Event;

import flash.net.URLRequest;

/**
* ...
* @author Bruno Ribeiro
* @link 	www.brunoribeiro.net
* @email 	contato@brunoribeiro.net
*/
public class Main extends MovieClip
{
private var _url			: URLRequest;
private var _loader			: Loader;

private var _bmp			: BitmapData;
private var _mcImg			: MovieClip;
private var _currentPiece 	: DisplayObject;

private var _item			: int;
private var _inPosition		: int;

public function Main()
{
_loadImage();
}

/**
* Carrega a imagem
*/
private function _loadImage() : void
{
_url	= new URLRequest("http://www.brunoribeiro.net/blog/img/imgBase.jpg");
_loader	= new Loader();
_mcImg	= addChildAt(new MovieClip(), 0) as MovieClip;

_loader.load(_url);

_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _init, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_UP, _handlerRelease, false, 0, true);
}

/**
* Monta o quebra-cabeça
* @param	e
*/
private function _init ( e : Event ) : void
{
_mcImg.addChild(_loader.content) as MovieClip;
var i 			: int = 0;
var j 			: int;
var bmp_temp 	: BitmapData;
var mc 			: MovieClip;
var target 		: MovieClip;

/**
* Pega o bitmapdata da imagem base
*/
_bmp = new BitmapData(_mcImg.width, _mcImg.height, true);
_bmp.draw(_mcImg, new Matrix());

for(i; i < 5; i++)
{
for( j =0; j <6; j++)
{
_item++;

mc 		= getChildByName("mc_" + i + "" + j) as MovieClip;
target 	= mc.mcTarget as MovieClip;

/**
* Cropa o trecho da imagem que importa
* A mascara já estava definida na timeline que recebi
*/
bmp_temp = new BitmapData(mc.width, mc.height, true);
bmp_temp.copyPixels(_bmp, new Rectangle(mc.x, mc.y, mc.width, mc.height), new Point(0, 0));

/**
* Adiciona a imagem ao target
*/
target.addChild(new Bitmap(bmp_temp));

/**
* Guarda a posição inicial para usar depois no hit
*/
mc.posX 	= mc.x;
mc.posY 	= mc.y;

/**
* Adiciona Listeners para o drag'n drop
*/
mc.addEventListener(MouseEvent.MOUSE_DOWN, _handlerClick, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_UP , _handlerRelease, false, 0, true);
}
}

/**
* Ao final troca a profundidade da imagem base
* reduz o alpha
* reposiciona as peças
*/
_mcImg.alpha = .3;
swapChildren(_mcImg, MovieClip(getChildByName("mc_00")));
_posicionaAleatorio();
}

/**
* Quando o usuário solta a peça
* Para o drag e verifica o posicionamento,
* se estiver dentro da área aceitável para
* o hit, a peça assume a posição correta
*
* @param	e
*/
private function _handlerRelease(e:MouseEvent):void
{
/**
* Trata o releaseOutside
* caso o release não seja feito na peça
* eu removo o drag do objeto corrente
*/
var obj : MovieClip = e.currentTarget as MovieClip;
if (obj == null)
{
obj = _currentPiece as MovieClip;
}

obj.stopDrag();

/**
* Teste do hit
* Você pode aumentar/reduzir a sensibilidade
* modificando o valor 10
*/
if (obj.x >= (obj.posX - 10) && obj.x <= (obj.posX + 10))
{
if (obj.y >= (obj.posY - 10) && obj.y <= (obj.posY + 10))
{
obj.x = obj.posX;
obj.y = obj.posY;

obj.removeEventListener(MouseEvent.MOUSE_DOWN, _handlerClick, false);
obj.removeEventListener(MouseEvent.MOUSE_UP, _handlerRelease, false);

/**
* Adiciona 1 nos itens que estão em posicão
* e verifica se era a última peça
* em caso positivo, game over
*/
_inPosition++;
if(_inPosition == _item)
{
trace('game over');
}
}
}
}

/**
* No click, inicia o drag da peça
* @param	e
*/
private function _handlerClick(e:MouseEvent):void
{
MovieClip(e.currentTarget).startDrag(false, new Rectangle(0, 0, stage.stageWidth, stage.stageHeight));
_currentPiece  = e.currentTarget as DisplayObject;
}

/**
* joga as peças para a parte de baixo, onde você pode manipulá-las
* o posicionamento é aleatório
*/
private function _posicionaAleatorio () : void
{
var i : int = 0;
var j : int = 0;
for (i; i < 5; i++)
{
for (j = 0; j < 6; j++)
{
var mc : MovieClip = getChildByName("mc_" + i + "" + j) as MovieClip;
mc.x = randRange(0, (stage.stageWidth - mc.width));
mc.y = randRange(440, (stage.stageHeight - mc.height));
}
}
}

/**
* Gera número aleatório dentro de um ranger
* @param	min
* @param	max
* @return
*/
function randRange(min:Number, max:Number):Number
{
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
}
}

Essa talvez seja a forma mais fácil de fazer o puzzle com as peças em formato curvilíneo.

[UPDATE]

Esse post deveria ter sido publicado há 4 meses, no entanto, mais uma vez o WP me enganou.

Categories: ActionScript Tags: ,

Integração de tecnologias

December 19th, 2008 5 comments

Eu não programo em PHP por não gostar da linguagem (é gratuito. Tá, eu só tento evitar), isso algumas vezes é um problema, noutras uma solução. 

Essa antipatia vem desde que comecei a programar, mas graças a isso, passo boa parte do tempo buscando soluções interessantes que me permitam não desenvolver nessa linguagem.

O WordPress, por exemplo, me permite ter sites dinâmicos sem esforço na parte client. Em um dos projetos em que estou trabalhando há uma grande integração com o WordPress, daí comecei a desenvolver um framework pra facilitar essa integração.

Abaixo você pode ver um exemplo simples dessa integração.


wp

describeType

December 13th, 2008 1 comment

Num dos projetos que estou trabalhando, tive a necessidade de fazer um dump numa classe, depois de procurar um pouco na web, encontrei a função describeType.

Um exemplo rápido do uso:

Describe.as

package
{
public class Describe
{
private var _name	: String;
private var _value	: String;

public function Describe( name : String, value : String)
{
_name	= this.name;
_value	= this.value;
}

public function get value():String { return _value; }
public function set value(value:String):void
{
_value = value;
}

public function get name():String { return _name; }
public function set name(value:String):void
{
_name = value;
}

}
}

Main.as

package
{
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.utils.describeType;

[SWF(width=800, height=800, backgroundColor=0x000000, frameRate=30)]

public class Main extends MovieClip
{

private var _describe	: Describe;
public function Main()
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

_describe	= new Describe("Nome", "valor");

trace(describeType(_describe));
}

}
}

O retorno disso é:

 

Uma das coisas bacanas de se fazer como exercício, usando essa função, é uma espécie de navegador para suas classes.

** Neste exemplo estou compilando usando o SDK do Flex.

Categories: ActionScript Tags: ,

Espiral

November 28th, 2008 1 comment

Há algumas semanas chegaram na agência com um desafio, criar um portfolio para um diretor de criação.

Fizemos um rápido brainstorm e baseado no que tinham me passado, sugeri usarmos alguns vídeos combinados com uma espiral, onde seria exibido o trabalho do diretor de criação. Comecei o processo e criei a espiral, mas na hora de produzir os vídeos… algo deu errado. Pra complementar, o Rodrigo Freire achou o portfolio de um diretor de arte que usava uma espiral, então abandonamos a idéia.

Pensei em reutilizar a espiral para exibir – tudo de maneira experimental, claro – resultado de busca, fazer filtro de dados, mostrar os posts desse blog de uma maneira diferente… enfim, eu queria usar isso para alguma coisa.

Como não cheguei a uma conclusão, estou publicando aqui o swf para que possam dar uma olhada, se houver alguma idéia, é só avisar.

O código fonte devo liberar em breve, só quero refatorar ele para que possam utilizar por aí, clique na imagem para ver um exemplo.

Fonte das imagens: www.artluzstudio.com.br

Fonte das imagens: www.artluzstudio.com.br

Categories: Idéias Tags: , ,

FlashVars com AS3

November 24th, 2008 2 comments

FlashVars é uma forma simples de parametrizar suas aplicações em Flash. O problema é que no AS2 as coisas eram relativamente mais simples, porém, menos organizadas.

A passagem do parâmetro a partir do HTML vai variar de acordo com a forma que você adiciona seu swf. Na maneira mais antiga de fazer isso, é só lembrar de adicionar ao fim das chamadas do SWF os parâmetros no seguinte formato:


param name="movie" value="sample.swf?param1=nome1&param2=nome2"
embed src="sample.swf?param1=nome1&param2=nome2"

 

Já no AS3 você pode recuperar todos os valores neste loop simples.

var key:String;
var params:Object = LoaderInfo(root.loaderInfo).parameters;

for (key in params) {
trace(key, String(params[key]))
}

Daí para frente basta armazenar os dados para que você possa trabalhar sua personalização.

Categories: ActionScript Tags: ,

Trabalhando com cores no AS3

November 11th, 2008 No comments

Uma classe extremamente útil quando você está construindo um site, é a classe ColorTransform. Ela traz uma grande diversidade de possibilidades, desde pequenos efeitos de rollover até efeitos mais complexos, na verdade, o limite é a criatividade.  

Abaixo alguns exemplos, esses códigos foram feitos apenas para ilustrar e não foram refatorados, em todo caso servem como material de estudo.

package
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.text.TextColorType;

public class Sample extends MovieClip
{
private var _mc  : MovieClip;

private const COLOROVER : Number = 0XCCFF00;
private const COLOROUT : Number = 0XCCCCCC;

public function Sample()
{
_mc  = addChild(new MovieClip()) as MovieClip;

_mc.addEventListener(MouseEvent.ROLL_OVER, handlerOver, false, 0, true);
_mc.addEventListener(MouseEvent.ROLL_OUT, handlerOut, false, 0, true);

_drawRectangle();
}

public function _drawRectangle ():void
{
_mc.graphics.clear();
_mc.graphics.beginFill(0xCCCCCC, 1);
_mc.graphics.drawRect(0, 0, 200, 200);
_mc.graphics.endFill();
}

public fnction handlerOut(e:MouseEvent = null):void
{
var cor : ColorTransform = new ColorTransform()
cor.color = COLOROUT;
_mc.transform.colorTransform = cor;
}

public function handlerOver(e:MouseEvent = null):void
{
var cor : ColorTransform = new ColorTransform()
cor.color = COLOROVER;
_mc.transform.colorTransform = cor;
}
}
}

Outro Exemplo

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.text.TextColorType;

public class Sample2 extends MovieClip
{
private var _mc  : MovieClip;

private var _transform : ColorTransform;

private const COLOROVER : Number = 0XCCFF00;
private const COLOROUT : Number = 0XCCCCCC;

public function Sample2()
{
_mc  = addChild(new MovieClip()) as MovieClip;

_mc.addEventListener(MouseEvent.ROLL_OVER, handlerOver, false, 0, true);
_mc.addEventListener(MouseEvent.ROLL_OUT, handlerOut, false, 0, true);

_transform = new ColorTransform();

_drawRectangle();
}

public function _drawRectangle ():void
{
_mc.graphics.clear();
_mc.graphics.beginFill(0xCCCCCC, 1);
_mc.graphics.drawRect(0, 0, 200, 200);
_mc.graphics.endFill();
}

public function handlerOut(e:MouseEvent = null):void
{
addEventListener(Event.ENTER_FRAME, _handlerEventOut, false, 0, true);
removeEventListener(Event.ENTER_FRAME, _handlerEventOver);

}

public function handlerOver(e:MouseEvent = null):void
{
addEventListener(Event.ENTER_FRAME, _handlerEventOver, false, 0, true);
removeEventListener(Event.ENTER_FRAME, _handlerEventOut);
}

private function _handlerEventOut(e:Event):void
{
_transform.redOffset -= 10;
_mc.transform.colorTransform = _transform;
if (_mc.transform.colorTransform.redOffset <= -10)
{
removeEventListener(Event.ENTER_FRAME, _handlerEventOut);
}
}

private function _handlerEventOver(e:Event):void
{
_transform.redOffset += 10;
_mc.transform.colorTransform = _transform;
if (_mc.transform.colorTransform.redOffset >= 250)
{
removeEventListener(Event.ENTER_FRAME, _handlerEventOver);
}
}
}
}

Outra classe que pode dar uma ajuda é a TextFormat segue um exemplo:

public class Item extends MovieClip
{
private var _label	 	: TextField;
private var _txtFormatOver	: TextFormat;
private var _txtFormatOut	: TextFormat;

public function Item()
{
buttonMode	= true;

_txtFormatOver	 = new TextFormat();
_txtFormatOver.color	= 0xFFFFFF;

_txtOut	 = new TextFormat();
_txtOut.color	= 0x767676;

_label	 = addChild(new TextField());

addEventListener(MouseEvent.ROLL_OVER, _handlerOver, false, 0, true);
addEventListener(MouseEvent.ROLL_OUT, _handlerOut, false, 0, true);
}

private function _handlerOut(e:MouseEvent = null):void
{
_label.setTextFormat(_txtFormatOut);
}

private function _handlerOver(e:MouseEvent = null):void
{
_label.setTextFormat(_txtFormatOver);
}
}
Categories: ActionScript Tags: ,

Passando parâmetros através de eventos

November 7th, 2008 No comments

Muita gente tem me perguntado sobre como passar parâmetros através de eventos no AS3.

No AS2 eu, assim como muitos outros, havia criado uma classe Delegate que permitia a passagem de parâmetros, agora é hora de dar uma olhada em como fazer o mesmo no AS3.

Acho que a forma mais fácil de fazer isso é criar uma classe que estenda a Event, então, segue o código.

CustomEvent.as

package com.ribeiro.events {

import flash.events.Event;

public class CustomEvent extends Event {

/**
* Não estou tipando o argumento para que possa ser passado qualquer
* Tipo de objeto;
*/
public var argumment : *;

/**
* Construtor
*
* @param	type
* @param	bubbles
* @param	cancelable
* @param	... a
*/
public function CustomEvent ( type : String, bubbles : Boolean = false,
cancelable : Boolean = false, ... a : * )
{
super(type, bubbles, cancelable);
argumment = a;
}
}
}

Classe que dispara o evento:

/**
*  Sua classe precisa estender MovieClip, Sprite ou EventDispatcher
**/
public class SuaClasse extends MovieClip

/**
*  No momento do disparo do evento
**/
dispatchEvent(new CustomEvent(SuaClasse.Evento, false, false, "agrumento1", "argumento2"));

Na classe listener:

/**tag.addEventListener(SuaClasse.Evento, _handler, false, 0, true);
private function _handlerTest(e:CustomEvent):void
{
trace(e.argumment[0], e.argumment[1]);
}
Categories: ActionScript Tags: ,