Ecualizador 3D (AS 3.0 + Papervision 2.0)
July 4th, 2008

Hola de nuevo,
aquà os dejo otro ejercicio en AS3 y Papervision, esta vez jugando con el sonido, unos cubos que interactuan segun la clase SoundMixer.computeSpectrum.
He creado un deslizador para que podáis rotarlo. Las clases estan en la carpeta com.kaax.clases.* , una es la clase Ecualizador, con
todo lo que necesitáis para el 3D, el drag del deslizador, y el movimiento por sonido. Y luego, la clase MiStage, que es tan solo para
reposicionar.
Este seria la clase Ecualizador
/*
* ECUALIZADOR 3D
*
* @author Isaac León (KAAX)
* @version 1.0.0
* @code AS 3.0
* @email hola@isaacleon.com
* @url www.isaacleon.com
* @blog www.isaacleon.com/blog
*/
package com.kaax.clases {
import org.papervision3d.scenes.*;
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.objects.special.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.special.*;
import org.papervision3d.materials.shaders.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.lights.*;
import org.papervision3d.render.*;
import org.papervision3d.view.*;
import org.papervision3d.events.*;
import org.papervision3d.core.utils.*;
import org.papervision3d.core.utils.virtualmouse.VirtualMouse;
import flash.display.*;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.media.*;
import flash.display.Stage;
import flash.utils.*;
import caurina.transitions.*;
public class Ecualizador{
private var cancion:String;
private var _background:MovieClip;
private var _mc:Sprite;
private var logo:MovieClip;
private var cubo:MovieClip;
private var cubo2:MovieClip;
private var request:URLRequest;
private var sonido:Sound;
private var chan:SoundChannel;
private var mcStage:Stage;
private var bt_desliza:MovieClip;
private var duracion:MovieClip;
private var carril:MovieClip;
private var viewport:Viewport3D;
private var render:BasicRenderEngine;
private var scene:Scene3D;
private var camera:Camera3D;
private var miMaterial1:MovieMaterial;
private var miMaterial2:MovieMaterial;
private var currentTime:Number;
private var arrayCubos:Array;
private var bits:ByteArray;
private var totalSpacio:int;
private var anchura:Number;
private var arrayClips:Array;
private var cuantosCubosSpectrum:Number;
private var tiempo:Timer;
private var xDist:int;
private var yDist:int;
private var deslizando:Boolean;
private var xFinal:int;
private var yFinal:int;
private var mX:int;
private var soundMixer:SoundMixer;
public function Ecualizador(_mc:Sprite,_background:MovieClip,cancion:String,logo:MovieClip,cubo:MovieClip,cubo2:MovieClip,bt_desliza:MovieClip,duracion:MovieClip,carril:MovieClip):void{
this._mc = _mc;
this.mcStage = _mc.stage;
this._background = _background;
this.logo = logo;
this.cubo = cubo;
this.cubo2 = cubo2;
this.cubo = cubo;
this.bt_desliza = bt_desliza;
this.duracion = duracion;
this.carril = carril;
this.cancion=cancion;
initStage();
initVariables();
construye2carasCubo();
construyeSpectrum();
}
public function initStage():void {
var miStage:com.kaax.clases.MiStage=new com.kaax.clases.MiStage(this._mc,_background,bt_desliza,logo,duracion,carril);
}
private function initVariables():void {
this.viewport= new Viewport3D(0, 0, true, true);
this._mc.addChild(viewport);
this.render= new BasicRenderEngine();
this.scene= new Scene3D();
this.camera= new Camera3D();
this.camera.zoom = 4;
this.camera.focus = 100;
this.camera.y = 500;
this.camera.x = -2000;
this.currentTime=0;
this.arrayCubos=new Array();
this.bits= new ByteArray();
this.totalSpacio=1760;
this.arrayClips=new Array();
this.request= new URLRequest(this.cancion);
this.sonido= new Sound();
this.sonido.load(this.request);
this.chan= this.sonido.play();
this.cuantosCubosSpectrum=6;
this.deslizando=false;
//this.soundMixer=new SoundMixer();
this.tiempo=new Timer(100);
}
private function rango(numeroMin:Number, numeroMax:Number):Number {
return Math.floor(Math.random() * numeroMax - numeroMin + 1) + numeroMin;
}
private function construye2carasCubo():void{
miMaterial1= new MovieMaterial(this.cubo);
miMaterial1.interactive = false;
miMaterial1.smooth = false;
miMaterial1.animated = false;
miMaterial2= new MovieMaterial(this.cubo2);
miMaterial2.interactive = false;
miMaterial2.smooth = false;
miMaterial2.animated = false;
}
private function construyeSpectrum():void{
for (i:int=0; i < cuantoscubosspectrum ; i+=1) {
var miCubo:Cube = new Cube(new MaterialsList({front:miMaterial1, back:miMaterial1, all:miMaterial2}), 1420, 1450, 1450, 6,6,6);
scene.addChild(miCubo);
var miX=i*100;
miCubo.scaleX=cubo.scaleY=0.1;
Tweener.addTween(miCubo, {x:miX,scaleX:1,scaleY:1, z:2900, delay:i*0.2, time: 1.2, transition:"easeinoutquint"});
render.renderScene(scene, camera, viewport);
arrayCubos[i]=miCubo;
}
iniciaTemporizadorSpectrum();
iniciaDrag();
}
private function iniciaTemporizadorSpectrum():void{
this.tiempo.addEventListener(TimerEvent.TIMER, refrescarSpectrum);
this.tiempo.start();
}
private function refrescarSpectrum(event:TimerEvent):void{
SoundMixer.computeSpectrum(bits, true);
currentTime = chan.position;
duracion.scaleX=currentTime/sonido.length;
var j:int;
var anchura:uint = 1;
for (j=0; j < cuantosCubosSpectrum; j+=1) {
var conversion_:Number = bits.readFloat();
var desplazamiento:Number = (conversion_ * 5);
var cubo:Cube=arrayCubos[j];
cubo.x=3400+j*1760;
Tweener.addTween(cubo, {scaleY:desplazamiento, time: 0.3, transition:"easeinoutquint"});
render.renderScene(scene, camera, viewport);
}
}
private function desliza(deslizador:Sprite):void{
if (deslizando){
deslizador.x = this._mc.mouseX;
camera.zoom=+this._mc.mouseX/300+5;
for(var i:Number=0 ; i < cuantosCubosSpectrum ; i++){
var cubo=arrayCubos[i];
cubo.rotationX = -this._mc.mouseY/4;
cubo.rotationY = -this._mc.mouseX/4;
}
}
}
private function iniciaDrag():void{
this.mcStage.addEventListener(Event.ENTER_FRAME, dragEnterFrame)
this.mcStage.addEventListener(MouseEvent.MOUSE_DOWN, dragMouseDown)
this.mcStage.addEventListener(MouseEvent.MOUSE_UP, dragMouseUp)
bt_desliza.buttonMode=true;
}
private function dragEnterFrame(event:Event) {
desliza(this.bt_desliza)
}
private function dragMouseDown(event:MouseEvent):void {
deslizando = true;
}
private function dragMouseUp(event:MouseEvent) {
deslizando = false;
}
}
}
Y nada, espero que os guste.
Aquà os dejo los enlaces.
Un saludo!








