自動でネギ振り
サウンドのスペクトラム(周波数ごとの大きさ)がFlexでは簡単に取れるので、それでなにかしらのアクションができるだろうってことで、はちゅねにネギを振らせてみました。
http://moeten.info/flex/20080405_mikuNegi/bin-release/main.html
今回ちょっとポイントなのが、回転エフェクト中に回転を呼ばれたときに無視する方法
<!--ネギ振りエフェクト--> <mx:Sequence id="myRotate" effectStart="{nowPlay=true}" effectEnd="{nowPlay=false}" target="{negi}"> <mx:Pause duration="10"/> <mx:Rotate easingFunction="Back.easeOut" originX="{negi.width-5}" originY="5" duration="300" angleFrom="10" angleTo="50"/> <mx:Pause duration="10"/> </mx:Sequence>
エフェクトがスタートしたらフラグを立てておいて、あとはActionScript側でif文での判定をする。
if( ! nowPlay ){
myRotate.play();
}
こうしないと常に回転エフェクトが呼び出されて、ネギが吹っ飛んで行きます。
あと、もしかしたらエフェクトのプロパティのenableとかでエフェクト中の呼び出しを制御できるかも?
全部のソースはこちら
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #619F94]" viewSourceURL="srcview/index.html"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.effects.easing.*; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.utils.ByteArray; //初期化関数 private function init():void{ this.addEventListener(Event.ENTER_FRAME , soundGraphe ); } //サウンドヒストグラム作成 private var nowPlay:Boolean; private var bytes:ByteArray = new ByteArray(); private var spectrum:Array = new Array(256); public function soundGraphe(e:Event):void{ SoundMixer.computeSpectrum(bytes, true, 0); //ヒストグラム用変数作成 for (var i:int = 0; i < 256; ++i) { spectrum[i] = bytes.readFloat(); } var linedata:ArrayCollection = new ArrayCollection(); var values:Array = new Array(); for (var x:int = 0; x < 256; ++x) { linedata.addItem({ "color" : x , "sum": spectrum[x] / 300 } ); //ネギ振るか判定 if( spectrum[x] != 0 && x >= 100 ){ if( ! nowPlay ){ myRotate.play(); } } } linedata.addItem({"color":0,"sum":0.008}); //チャートに代入 spec.dataProvider = linedata; } ]]> </mx:Script> <!--ネギ振りエフェクト--> <mx:Sequence id="myRotate" effectStart="{nowPlay=true}" effectEnd="{nowPlay=false}" target="{negi}"> <mx:Pause duration="10"/> <mx:Rotate easingFunction="Back.easeOut" originX="{negi.width-5}" originY="5" duration="300" angleFrom="10" angleTo="50"/> <mx:Pause duration="10"/> </mx:Sequence> <!--コンポーネント--> <mx:VideoDisplay id="myFlv" x="10" y="10" width="403" height="287" source="miku.flv" visible="false"/> <mx:Image id="body" x="10" y="10" width="414" height="287" source="body.png"/> <mx:Image id="negi" x="133" y="129" width="157" height="115" source="negi.png"/> <!--ヒストグラム--> <mx:ColumnChart x="10" y="305" id="spec" height="191" width="380"> <mx:series> <mx:ColumnSeries xField="color" yField="sum" displayName="Gold"/> </mx:series> </mx:ColumnChart> </mx:Application>