‘as3’ カテゴリーのアーカイブ

Tweenerで音量をトゥイーンさせる

2008 年 6 月 24 日 火曜日

自分用のメモ。サウンドの音量をトゥイーンさせるには、SoundShortcutsクラスをインポートしてinit()で初期化してから使う。Tweenerの対象オブジェクトはSoundChannel型の変数にする。音量を変化させたいときは_sound_volumeプロパティ、音量をパンさせたい時は_sound_panプロパティをそれぞれ弄くる。

ACTIONSCRIPT:
  1. import caurina.transitions.Tweener;
  2. import caurina.transitions.properties.SoundShortcuts;
  3.  
  4. SoundShortcuts.init();
  5.  
  6. var bgm:Sound = new soundBgm();
  7. var channel:SoundChannel = bgm.play(0);
  8.  
  9. Tweener.addTween(channel, {_sound_volume:0, time:1, transition:"linear"});

Zip Libraryで複数ファイルを圧縮してみる

2008 年 5 月 16 日 金曜日

テキストファイルをzip圧縮してサーバーに保存してみる。今回はnochump.comのライブラリを使わせてもらう。ここからダウンロードしてクラスパスを通しておく。

流れとしてはまず、ファイル名を任意に決めてバイトストリームにUTF-8ストリングを書き込む。putNextEntry()でファイルにしたいエントリーをぶち込む。write()メソッドで実際のデータを書き込み、zipOut.closeEntry()で閉じる。複数のテキストファイルをまとめてzip圧縮するには、下のコードのように文字列を書き込んだ後にzipOut.closeEntry()をそれぞれに実行してやればよい。後はZipOutputクラスからbyteArrayを取り出してPHPに送信してやるだけ。送信の際はBase64エンコードをかける。

Main.as

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.ProgressEvent;
  5.     import flash.events.Event;
  6.     import flash.net.URLRequest;
  7.     import flash.net.URLRequestMethod;
  8.     import flash.net.URLLoader;
  9.     import flash.net.URLVariables;
  10.     import flash.utils.ByteArray;
  11.    
  12.     import mx.utils.Base64Encoder;
  13.     import nochump.util.zip.ZipOutput;
  14.     import nochump.util.zip.ZipEntry;
  15.    
  16.    
  17.     public class Main extends Sprite
  18.     {
  19.         private var url:String = "generateZip.php5";
  20.        
  21.         //------------------------------
  22.         //   コンストラクタ
  23.         //------------------------------
  24.         public function Main()
  25.         {
  26.             var fileName1:String = "helloworld1.txt";
  27.             var fileName2:String = "helloworld2.txt";
  28.             var fileData1:ByteArray = new ByteArray();
  29.             var fileData2:ByteArray = new ByteArray();
  30.             var ze1:ZipEntry = new ZipEntry(fileName1);
  31.             var ze2:ZipEntry = new ZipEntry(fileName2);
  32.             var zipOut:ZipOutput = new ZipOutput();
  33.            
  34.             //-----[ファイル1]
  35.             fileData1.writeUTFBytes("ハローワールド1!");
  36.             zipOut.putNextEntry(ze1);
  37.             zipOut.write(fileData1);
  38.             zipOut.closeEntry();
  39.            
  40.             //-----[ファイル2]
  41.             fileData2.writeUTFBytes("ハローワールド2!");
  42.             zipOut.putNextEntry(ze2);
  43.             zipOut.write(fileData2);
  44.             zipOut.closeEntry();
  45.            
  46.             zipOut.finish();
  47.            
  48.             var zipData:ByteArray = zipOut.byteArray;
  49.             sendZip(zipData);
  50.         }
  51.        
  52.         //------------------------------
  53.         //   zipデータの送信
  54.         //------------------------------
  55.         private function sendZip(byteArr:ByteArray):void
  56.         {
  57.             //-----[Base64エンコード] 
  58.             var enc:Base64Encoder = new Base64Encoder();
  59.             enc.encodeBytes(byteArr);
  60.            
  61.             //-----[送信変数のセット]
  62.             var variables:URLVariables = new URLVariables();
  63.             variables.data = String(enc.flush());
  64.             variables.type = "zip";
  65.            
  66.             //-----[リクエストの発行]
  67.             var urlRequest:URLRequest = new URLRequest();
  68.             urlRequest.url = url;
  69.             urlRequest.method = URLRequestMethod.POST;
  70.             urlRequest.data = variables;
  71.            
  72.             //-----[送信]
  73.             var urlLoader:URLLoader = new URLLoader();
  74.             urlLoader.addEventListener(ProgressEvent.PROGRESS, onProress);
  75.             urlLoader.addEventListener(Event.COMPLETE, onComplete);
  76.             urlLoader.load(urlRequest);
  77.         }
  78.        
  79.        
  80.         //------------------------------
  81.         //   読み込み途中
  82.         //------------------------------
  83.         private function onProress(e:ProgressEvent):void
  84.         {
  85.             trace(e.bytesLoaded + " / " + e.bytesTotal);
  86.         }
  87.        
  88.        
  89.         //------------------------------
  90.         //   読み込み完了
  91.         //------------------------------
  92.         private function onComplete(e:Event):void
  93.         {
  94.             e.target.removeEventListener(ProgressEvent.PROGRESS, onProress);
  95.             e.target.removeEventListener(Event.COMPLETE, onComplete);
  96.            
  97.             trace("complete");
  98.         }
  99.     }
  100. }

PHPではbase64デコードで復元した後に受け取った拡張子でファイルを生成する。zipファイルはdataフォルダの中に出来上がる。解凍してみるとhelloworld1.txtとhelloworld2.txtの2ファイルが展開され、それぞれの文字列が書き込まれている。

generateZip.php5

PHP:
  1. <?php
  2.     $imgdata = base64_decode($_POST['data']);
  3.     $type = $_POST['type'];
  4.     $fileName = time()."-".round(rand(1,10000)).".".$type;
  5.     $fp = fopen("data/".$fileName, 'wb');
  6.     fwrite($fp, $imgdata);
  7.     fclose($fp);
  8.     print $fileName;
  9. ?>

最近ちょっとずつバイナリが分かってきて弄れるようになってきた。バイナリ触ってると変に快感があるなー。

PHP経由でBASIC認証を通過する

2008 年 5 月 15 日 木曜日

FlashPlayerのセキュリティー制限でAuthorizationのヘッダーを作成することは禁止されている。swfからBASIC認証を通過するにはいつものごとくPHPとかでproxyするしかないのかな(オーサリング環境からはBASIC認証を通過できる)。以下のコードはswfから「url」、「id」、「pass」をPOST通信でPHPに渡し、BASIC認証を通過する。認証通過後はサーバーから受け取ったデータをechoで出力させてswfに返してやる。これでswfとBASIC認証の先にあるAPIとやり取りできるようになる。

Main.as

ACTIONSCRIPT:
  1. package
  2. package
  3. {
  4.     import flash.display.Sprite;
  5.     import flash.net.URLLoader;
  6.     import flash.net.URLLoaderDataFormat;
  7.     import flash.net.URLRequest;
  8.     import flash.net.URLRequestMethod
  9.     import flash.net.URLVariables;
  10.     import flash.events.Event;
  11.     import flash.text.TextField;
  12.    
  13.     public class Main extends Sprite
  14.     {
  15.         private var url:String = "http://***/basicproxy.php";
  16.         private var id:String = "id";
  17.         private var pass:String = "password";
  18.        
  19.         //------------------------------
  20.         //   コンストラクタ
  21.         //------------------------------
  22.         public function Main()
  23.         {
  24.             //-----[送信するデータを格納]
  25.             var variables:URLVariables = new URLVariables();
  26.             variables.id = id;
  27.             variables.pass = pass;
  28.            
  29.             //-----[リクエストの発行]
  30.             var request:URLRequest = new URLRequest();
  31.             request.url = url;
  32.             request.method = URLRequestMethod.POST;
  33.             request.data = variables;
  34.            
  35.             //-----[ローダーの設定]
  36.             var loader:URLLoader = new URLLoader();
  37.             loader.dataFormat = URLLoaderDataFormat.TEXT;
  38.             loader.addEventListener(Event.COMPLETE, onComplete);
  39.             loader.load(request);
  40.         }
  41.        
  42.         //------------------------------
  43.         //   読み込み完了
  44.         //------------------------------
  45.         private function onComplete(e:Event):void
  46.         {
  47.             var loader:URLLoader = e.target as URLLoader;
  48.             loader.removeEventListener(Event.COMPLETE, onComplete);
  49.            
  50.             trace(loader.data);
  51.         }
  52.     }
  53. }

basicproxy.php

PHP:
  1. <?php
  2.     $url = $_POST["url"];
  3.     $id = $_POST["id"];
  4.     $pass  = $_POST["pass"];
  5.    
  6.     $ch = curl_init();
  7.     curl_setopt($ch, CURLOPT_URL, $url);
  8.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9.     curl_setopt($ch, CURLOPT_USERPWD, "$id:$pass");
  10.     curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
  11.     $data= curl_exec($ch);
  12.     curl_close($ch);
  13.    
  14.     echo $data;
  15. ?>

curlを使うと簡単に認証を通過できる。あとは受け取ったデータを出力するだけ。

音波形に対応したサウンドボタン

2008 年 4 月 28 日 月曜日

※soundボタンをクリックすると音が鳴るので注意。
サウンドスペクトラムを使って、音にシンクロしたサウンドボタン用のクラスを作ってみた。最初にsetPixel()でピクセルを描画しておいて、スペクトラム波形に合わせてscaleYを変化させてます。下記がそのクラスファイル。

SoundSpectrum.as

ACTIONSCRIPT:
  1. package info.five.ui
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.display.Bitmap;
  5.     import flash.display.BitmapData;
  6.     import flash.events.Event;
  7.     import flash.media.SoundMixer;
  8.     import flash.utils.ByteArray;
  9.    
  10.     public class SoundSpectrum extends Sprite
  11.     {
  12.         private var lineNum:uint;
  13.         private var lineHeight:uint;
  14.         private var lineInterval:uint;
  15.         private var bmAry:Array = [];
  16.        
  17.         //------------------------------
  18.         //   コンストラクタ
  19.         //------------------------------
  20.         public function SoundSpectrum(targetNum:uint = 5, targetHeight:uint = 20, targetInterval:uint = 1, targetColor:uint = 0x000000)
  21.         {
  22.             lineNum = targetNum;
  23.             lineHeight = targetHeight;
  24.             lineInterval = targetInterval;
  25.            
  26.             this.addEventListener(Event.ENTER_FRAME, onRender);
  27.            
  28.             //-----[ピクセルの描画]
  29.             var bmd:BitmapData;
  30.             var bm:Bitmap;
  31.            
  32.             for (var i = 0; i <lineNum; i++)
  33.             {
  34.                 bmd = new BitmapData(1, 100);
  35.                 bm = new Bitmap(bmd);
  36.                 this.addChild(bm);
  37.                 bm.x = i * (lineInterval + 1);
  38.                
  39.                 bmd.setPixel(0, 0, targetColor);
  40.                 bmAry.push(bm);
  41.             }
  42.             bmd.dispose();
  43.         }
  44.        
  45.        
  46.         //------------------------------
  47.         //   レンダー
  48.         //------------------------------
  49.         private function onRender(e:Event):void
  50.         {
  51.             var count:uint = 256 / lineNum;
  52.             var value:Number;
  53.             var ba:ByteArray = new ByteArray();
  54.            
  55.             SoundMixer.computeSpectrum(ba, false, 0);
  56.            
  57.             for (var i:uint = 0; i <256; i++)
  58.             {
  59.                 value = -ba.readFloat() * lineHeight - 1;
  60.                
  61.                 for (var j:uint = 0; j <lineNum; j++)
  62.                 {
  63.                     if (i == Math.floor(count * j)) bmAry[j].scaleY = value;
  64.                 }
  65.             }
  66.         }
  67.     }
  68. }

続いてドキュメントクラスには以下のように記述します。引数はSoundSpectrum(ラインを何本にするか, ラインの最大高さ, ラインの間隔, ラインの色)となります。インスタンス化した後にx,yプロパティを与えてaddChild()でステージに配置。デフォルトで数値を持たしているので、カスタマイズしたくない場合は引数なしでも大丈夫です。

ACTIONSCRIPT:
  1. var sp:SoundSpectrum = new SoundSpectrum(8, 30, 1, 0x000000);
  2. soundBtn.addChild(sp);
  3. sp.x = 32;
  4. sp.y = 10;

PHPに複数データを渡してみる

2008 年 4 月 23 日 水曜日

AS3ではURLRequest.dataで送信できるデータは1つなので、複数の変数をPHPに渡したい場合はURLVariablesを使う。URLVariablesをインスタンス化した後に、通常のオブジェクトと同様、任意のプロパティに値を格納していく。ここでは「title」、「url」、「text」の3つの要素を各プロパティに入れている。URLVariablesに格納した後は、URLRequestにて呼び出したいPHPのパスと通信方法を指定(今回はPOST通信)し、URLRequest.dataにURLVariablesを突っ込む。最後にnavigateToURL()でPHPを表示させ、Flashからデータを受け取っているか確認する。

Main.as

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Stage;
  4.     import flash.display.Sprite;
  5.     import flash.net.URLVariables;
  6.     import flash.net.URLRequest;
  7.     import flash.net.URLRequestMethod;
  8.     import flash.net.navigateToURL;
  9.    
  10.    
  11.     public class Main extends Sprite
  12.     {
  13.         //------------------------------
  14.         //   コンストラクタ
  15.         //------------------------------
  16.         public function Main()
  17.         {
  18.             sendData();
  19.         }
  20.        
  21.         //------------------------------
  22.         //   データ送信
  23.         //------------------------------
  24.         public function sendData():void
  25.         {
  26.             var variables:URLVariables = new URLVariables();
  27.             variables.title = "5ive.blog";
  28.             variables.url = "http://www.5ive.info/blog/";
  29.             variables.text = "PHPに複数のデータを渡す方法";
  30.            
  31.             var urlRequest:URLRequest = new URLRequest();
  32.             urlRequest.url = "variables.php";
  33.             urlRequest.method = URLRequestMethod.POST;
  34.             urlRequest.data = variables;
  35.            
  36.             //phpに送信
  37.             navigateToURL(urlRequest , "_self");
  38.         }
  39.     }
  40. }

variables.php

PHP:
  1. <?php
  2.     $title = $_POST['title'];
  3.     $url = $_POST['url'];
  4.     $text = $_POST['text'];
  5.    
  6.     echo "title = ".$title."<br />";
  7.     echo "url = ".$url."<br />";
  8.     echo "text = ".$text."<br />";
  9. ?>

mouseChildrenとmouseEnabledについて

2008 年 4 月 18 日 金曜日

今更ながら知ったのでメモ。AS2でいうenabled = falseをしたくて調べたら、AS3ではもっと使い勝手が良くなっているようだ。

mouseEnabled
これはマウスイベントを受け取るかどうかを判断するプロパティ。こいつをfalseにするとマウスイベントを受け取らなくなるので、一時的にリスナーを切りたいけどremoveEventListenerするのが面倒とか、あるタイミングだけマウスに反応させたくない時に使用する。

mouseChildren
これと合わせて覚えておきたいのがmouseChildrenだ。mouseChildrenはオブジェクトの子に対してマウスが有効かどうかを判断するプロパティ。つまり親MCにぶらさがる子MCすべてのマウスイベントの伝播を止めることができる。一括してマウスイベントを受け取りたくない時に使うとかなりの手間が省ける。

ACTIONSCRIPT:
  1. mc.mouseChildren = false;
  2. mc.mouseEnabled = false;

こうするとmc以下のオブジェクトにマウスイベントが伝わらなくなるので便利ですよと。

REMOVEDとREMOVED_FROM_STAGEの違い

2008 年 4 月 10 日 木曜日

2つのイベントの違いで困惑したのでメモ。

REMOVED
自身、もしくは内包している子供のDisplayObjectがremoveChild()された時。

REMOVED_FROM_STAGE
自身がremoveChild()された時。タイミングとしてはREMOVED_FROM_STAGEの前に REMOVEDイベントが発生する。

RGBとCMYに色分解

2008 年 4 月 8 日 火曜日

画像処理の勉強としてRGBとCMYの色分解をやってみた。色々試したけどCMYKの4色に分解する方法がまだ良く分かんない。といことで画像処理入門の本をamazonで購入した。明日届いたらもうちょいやってみる。

パーティクルクラスを作ってみた

2008 年 4 月 2 日 水曜日

勉強用に自作で作ってみたので公開してみる。4月なので桜の花びらをパーティクルで散らしてみた。使い方はドキュメントクラスに下記のように記述する。

Main.as

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.MovieClip;
  4.     import flash.display.Sprite;
  5.     import flash.events.MouseEvent;
  6.     import info.five.filters.Particle;
  7.    
  8.     public class Main extends Sprite
  9.     {
  10.         private var p:Particle;
  11.        
  12.         //------------------------------
  13.         //   コンストラクタ
  14.         //------------------------------
  15.         public function Main():void
  16.         {
  17.             this.stage.addEventListener(MouseEvent.CLICK, onClick);
  18.            
  19.             //-----[パーティクル]
  20.             p = new Particle("flower", this);
  21.             p.gravity = -0.2;
  22.             p.wind = -0.5;