as3.0打造音乐控制光的变化

这个例子展示的是一个球体,它上面由很多小三角面组成,这些小的三角面可以随着音乐的变化进而变换色彩。下面是这个例子的源代码。

import flash.display.*;
import flash.events.*;
import flash.media.Sound;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;

import flash.display.Bitmap;
import flash.display.BitmapData;

import org.papervision3d.scenes.*;
import org.papervision3d.objects.*;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
import org.papervision3d.events.*;
import org.papervision3d.core.proto.DisplayObjectContainer3D;

import com.mrdoob.pv3d_phunky.objects.*;
import com.mrdoob.utils.*;

import caurina.transitions.Tweener;

// .. VARS .....................................................................................................               

var container                :Sprite;
var containerPos        :Sprite;
var bitmapPos                :BitmapData;

var mtr                                :Matrix;

var scene                     :MovieScene3D;
var camera                    :Camera3D;
var root3D                           :DisplayObject3D;
var sound                          :Sound;
var bytes                          :ByteArray;
var amount                          :Number = 15;
var values                          :Array;

var resetPos        :Number = 0;

// .............................................................................................................

stage.quality = "MEDIUM";
stage.scaleMode = "noScale";
stage.align = "TL";

stage.addEventListener(Event.RESIZE, resizeHandler);

function resizeHandler(e)
{
        mtr = new Matrix();
        mtr.translate(stage.stageWidth * .5,stage.stageHeight * .5);
        mtr.scale(.01,.01);
        container.x = stage.stageWidth * .5;
        container.y = stage.stageHeight * .5;
        containerPos.width = stage.stageWidth;
        containerPos.height = stage.stageHeight;               
}

init3D();
init();       
resizeHandler(null);
generateCameraPath();
this.addEventListener( Event.ENTER_FRAME, loop3D );

// .. INIT .....................................................................................................               

function init()
{
        addChild(np);
        np.buttonMode = true;
        np.addEventListener(MouseEvent.CLICK, goToURL);
}

// .. CUSTOM FUNCTIONS .........................................................................................               

function generateCameraPath()
{
        var bz = new Array();
        var bz_t = new Array();
       
        for (var i = 0; i < 100; i++)
        {
                bz.push({x:Math.random()*3000-1500,y:Math.random()*3000-1500,z:Math.random()*3000-1500});
                bz_t.push({x:Math.random()*2000-1000,y:Math.random()*200-100,z:Math.random()*2000-1000});               
        }
       
        Tweener.addTween(camera,{x:2000,y:2000,z:0,_bezier:bz,time:1000,transition:"linear"});
        Tweener.addTween(camera.target,{x:0,y:0,z:0,_bezier:bz_t,time:1000,transition:"linear"});
        Tweener.addTween(this,{time:1000,onComplete:function(){generateCameraPath()}});
}

function goToURL(e)
{
        navigateToURL(new URLRequest("http://www.scene.org/~gloom/"));
}

// .. INIT 3D ...................................................................................................       

function init3D():void
{
        // Create canvas movieclip and center it
        container = new Sprite();
        addChild( container );
       
        containerPos = new Sprite();
        bitmapPos = new BitmapData(Math.floor(stage.stageWidth * .01), Math.floor(stage.stageHeight * .01), false, 0x000000);
        containerPos.addChild(new Bitmap(bitmapPos,"auto", true));
        containerPos.blendMode = BlendMode.ADD;
        addChild( containerPos );

        // Create scene
        scene = new MovieScene3D( this.container );

        // Create camera
        camera = new Camera3D();
        camera.x = 2000;
        camera.y = 500;
        camera.z = 500;
        camera.zoom = 5;
        camera.focus = 100;
        camera.sort = false;

        var sound:Sound = new Sound();
        sound.load(new URLRequest("gloom_and_flipside-evoid_droid.mp3"));
        sound.play();               
        bytes = new ByteArray();
       
        var p:DisplayObject3D;
        var spacingx:Number = 0;
        var spacingz:Number = 0;
       
        values = new Array();
        this.scene.renderCamera( this.camera );               

        for (var x:Number = 0; x < amount; x++) {
                for (var z:Number = 0; z < amount; z++) {
                        values[x+(z*100)] = 0;
                        p = scene.addChild( new Pyramid( new ColorMaterial( 0xffffff ), 100, 100, 1, 1 ), "tile"+x+"_"+z );
                        p.container.blendMode = BlendMode.ADD;
                       
                        p.x = Math.random()*1000 - 500;
                        p.y = Math.random()*1000 - 500;
                        p.z = Math.random()*1000 - 500;
                       
                        var l:DisplayObject3D = new DisplayObject3D();
                        l.x = 0;
                        l.y = 0;
                        l.z = 0;
                        p.lookAt(l);

                        p.pitch(-90);
                }
        }
       
}

// .. LOOP 3D ...................................................................................................

function loop3D( event :Event ):void
{
        SoundMixer.computeSpectrum( bytes, true, 0 );
        var value: Number = 0;
        var scale: Number = 3;
        var bias:  Number = 1;
       
        for (var x:Number = 0; x < amount; x++) {
                for (var z:Number = 0; z < amount; z++) {

                        value = bytes.readFloat()* (scale+bias);
                        bias += 0.1;
                        var tile:DisplayObject3D = scene.getChildByName("tile"+x+"_"+z);
                        values[x+(z*100)] += 1;
                       
                        if (-value < values[x+(z*100)]) {
                                values[x+(z*100)] = -value;
                        } else if (values[x+(z*100)] > 0) {
                                values[x+(z*100)] = 0;
                        }

                        tile.geometry.vertices[3].y = -values[x+(z*100)]*50;
                        tile.material = new ColorMaterial(ColorTools.getHex(tile.geometry.vertices[3].y*.002+.1,tile.geometry.vertices[3].y*.0008,tile.geometry.vertices[3].y*.0002+.05));

                }               
        }
       
        scene.renderCamera( camera );
        bitmapPos.colorTransform(new Rectangle(0,0,bitmapPos.width,bitmapPos.height),new ColorTransform(1,1,1,1,-100,-100,-100,0));
        bitmapPos.draw(container,mtr,null,null,new Rectangle(0,0,stage.stageWidth,stage.stageHeight));

}

时间: 2024-10-02 18:46:04

as3.0打造音乐控制光的变化的相关文章

Flash实例教程:AS3.0打造漂亮水纹效果

在这个Flash AS3.0实例教程中,我们将用到置换图滤镜(DisplacementMapFilter)和BitmapData类的的杂点功能(perlinNoise),这两个家伙常常给我们带一些令人兴奋的效果,它们今天的合作为我们创造了一个漂亮的的水汶 现在我开始来构建这个漂亮的水纹: 既然是水纹,我想首先要找一张含水的图片吧,百度一下吧,河道,湖泊,水池,你喜欢就行. 1.新建一AS3.0文档,将帧频设为30,将你刚百度到的图片导入到库中,点右键,在属性面板中将"使用JPEG导入品质&quo

As3.0 鼠标滚轮控制文本滚动代码

 代码如下 复制代码 bar.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel); if (e.delta < 0) { //如果是向下滚动 moveScroll(bar[type.attribute] + bar[type.type] / 2 + _scrollNum); }else { //如果向上滚动 moveScroll(bar[type.attribute] + bar[type.type] / 2 - _scrollNum); }

Flash编程基础:As3.0概要

编程 随着一些相关资料对as3.0的介绍,有人可能认为它是另一种语言.它的根本改变在哪呢,它是什么呢?现在我们要放松一点.如果你熟知as2.0,那么它的变化并不是很大,甚至增加了一些命令你可以使用.     从我们第一眼看as3.0,它并不是一个全新的语言,它的架构要好于AS2.0,你将从FLASH8开始发现这些.任何东西都有自已的类和整洁的子类.类的继承关系看起来很复杂,但是它却是很容易理解.     主要的改变:     1.不在有_global范围了,但是你可以通过在预先的public,p

AS3.0概要–了解AS3.0的改变

随着一些相关资料对as3.0的介绍,有人可能认为它是另一种语言.它的根本改变在哪呢,它是什么呢?现在我们要放松一点.如果你熟知as2.0,那么它的变化并不是很大,甚至增加了一些命令你可以使用. 从我们第一眼看as3.0,它并不是一个全新的语言,它的架构要好于AS2.0,你将从FLASH8开始发现这些.任何东西都有自已的类和整洁的子类.类的继承关系看起来很复杂,但是它却是很容易理解. 主要的改变: 1.不在有_global范围了,但是你可以通过在预先的public,private和internal

As3.0 概要–了解AS3.0的改变

随着一些相关资料对as3.0的介绍,有人可能认为它是另一种语言.它的根本改变在哪呢,它是什么呢?现在我们要放松一点.如果你熟知as2.0,那么它的变化并不是很大,甚至增加了一些命令你可以使用. 从我们第一眼看as3.0,它并不是一个全新的语言,它的架构要好于AS2.0,你将从FLASH8开始发现这些.任何东西都有自已的类和整洁的子类.类的继承关系看起来很复杂,但是它却是很容易理解. 主要的改变: 1.不在有_global范围了,但是你可以通过在预先的public,private和internal

Flash AS3.0 强大的事件机制

ActionScript 3.0系列教程(4):爽快使用XML ActionScript 3.0系列教程(5):强大的事件机制 回顾和比较 AS1.0玩家最爱用onClipEvent(), on(),又方便又直接.缺点在于逻辑分散到了各个舞台元件中,难以管理和维护.更加别说代码重用了.别跟俺说可以Copy, Paste,这不叫重用,这叫低级. AS2.0中,增加了一些事件处理机制: (1)回调函数: onLoad, onComplete等.相信兄弟们最熟悉的应该就是XML.onload回调函数了

“AS3.0高级动画编程”学习:第三章等角投影(下)

在上一篇的最后,我们成功的用"等角投影"模拟出了立体空间的盒子模型,但是很快你就会发现这个示例的bug bug1:在已经有box的地方,再点击,将会重复创建box新实例. bug2:后面添加的box,会挡住前面添加的box. bug3:在边缘部分,如果用鼠标小心的点击,可以创建出很多超出world范围之外的盒子(即:看起来好象挂出去了) 我们按轻重缓急来处理吧: bug2最严重,它直接影响了最终的3D视觉效果.产生它的原因是显示列表中,后添加的物体,其index值会比 前面添加物体的i

探索F9 As3.0 Preview

探索Flash Professional Actionscript 3.0 Preview 声明:本教程英文版源自Adobe的:http://www.adobe.com/devnet/flash/articles/flash9_as3_preview.html原作者:Jen deHaan和Peter deHaan本站对其进行了翻译整理,此教程转载请注明出处.并标有活动链接,谢谢合作. Adobe Flash Professional 9 ActionScript 3.0 Preview(以下简称

Flash AS3.0的类及绑定

作者的blog: www.kingda.org ActionScript 3.0系列教程(1):与Flash9先来一次亲密接触! ActionScript 3.0系列教程(2):AS3.0的类及绑定 这次我们开始介绍AS3.0中的类如何和库中元件绑定,和特殊的Document Class设计. 总共4步: 1.建一个标准的AS3.0类 (暂命名为KingdaMC,多么伟大的名字啊,简称"有名")2.新建一个元件,并设置它的Linkage和上面的类绑定.3.在时间轴上写代码,用AS3.0