Felica & Adobe Flashアプリケーションコンテスト

Felica イベント概要
img_question img_schedule

イベント審査対象(FORKルール)
本イベントでは、felicacontest2010というアカウント名にてお題となるサンプルのActionScriptをご用意しております。 イベントにご参加いただく皆様は、felicacontest2010 が投稿しているActionScriptをFORK(投稿)ください。 ※Felicacontest2010 以外のユーザーの投稿作品を FORKしても審査対象には入りません。 ご注意くださいませ。

FeliCa & Adobe® AIR®/Adobe® Flash®アプリケーションコンテスト(以下「コンテスト」とします)に、wonderflからもエントリーできるようになりました! ソニー株式会社が提供するSDK for FeliCa & Adobe AIR/Adobe Flashを活用して、今までにないワンダフルなFeliCaの活用アイデアを投稿ください。本コンテストにエントリーされた優秀作品制作者には豪華賞品を贈呈!
下記、応募規約をご覧いただき、技術的に優れた作品からアイデアあふれる作品、面白一発芸的な作品など、さまざまな作品のエントリーをお待ちしております。
FeliCaライブラリに関する詳細なドキュメントはこちら[wonderfl.net]からダウンロードしていただける他、こちらのサンプルプログラム[felicalauncher.com]SDK for FeliCa & Adobe AIR / Adobe Flash用ソフトウェア開発キット[sony.co.jp]を参考にしてください。wonderflで書くコード内で使用できるFeliCaライブラリはStandard版になります。
user:felicacontest2010の投稿したコードをFORKしたコードが今回のイベント審査対象になります。
尚、本イベントは、FeliCaカード、およびFeliCaリーダーを利用したイベントです。FeliCaカード、FeliCaリーダーは、以下のサイトよりお買い求めいただけます。
【FeliCaカード】 【FeliCaリーダー】

尚、本イベントへの参加作品は、ライセンスレベルを「other license, write as code comments」にご選択いただき、投稿(FORK)ください。

felica

※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


FORKED
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- forked from felicacontest2010's FeliCa Flash Contest - FeliCa Search sample -->
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  4.     <mx:Button x="10" y="10" label="FeliCa を検出する" id="button1" click="buttonClick();"/>
  5.     <mx:TextArea x="10" y="40" width="581" height="310" id="textArea1" editable="false"/>
  6.     
  7.     <mx:Script>
  8.         <![CDATA[
  9.             // イベント概要,エントリー規約をご確認ください
  10.             // http://wonderfl.net/event/felica
  11.             // see http://wonderfl.net/event/felica for contest regulation, only in Japanese for now, sorry
  12.             // copyright sony corp. all rights reserved.
  13.             // copied from http://www.felicalauncher.com/sdk4air/#menu_02 with permission :-)
  14.             import com.sony.jp.felica.FeliCaControl;
  15.             
  16.             import com.sony.jp.felica.FeliCaSessionRequest;
  17.             import com.sony.jp.felica.FeliCaSessionResponse;
  18.             import com.sony.jp.felica.FeliCaOpenReaderWriterAutoRequest;
  19.             import com.sony.jp.felica.FeliCaOpenReaderWriterAutoResponse;
  20.             import com.sony.jp.felica.FeliCaPollingAndGetCardInformationRequest;
  21.             import com.sony.jp.felica.FeliCaPollingAndGetCardInformationResponse;
  22.             import com.sony.jp.felica.FeliCaCloseReaderWriterRequest;
  23.             import com.sony.jp.felica.FeliCaCloseReaderWriterResponse;
  24.             
  25.             import com.sony.jp.felica.event.OpenStatusEvent;
  26.             import com.sony.jp.felica.event.FeliCaStatusEvent;
  27.             import com.sony.jp.felica.error.FeliCaAccessError;
  28.             
  29.             //  FeliCaProxy との通信を行うコントロールクラス
  30.             private var fc:FeliCaControl = new FeliCaControl();
  31.             
  32.             //  [FeliCa を検出する] ボタンクリック時
  33.             private function buttonClick():void
  34.             {
  35.                 //  リスナー登録
  36.                 fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
  37.                 fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
  38.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete);
  39.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure);
  40.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError);             
  41.                 
  42.                 //  FeliCaProxy の認証
  43.                 //  wonderflの中ではこのキーをお使いください wonderfl外では使用できません
  44.                 //  use this Standard key in wonderfl, it doesn't work outside wonderfl
  45.                 fc.open(10250,"__FELICA_STANDARD_KEY__""");
  46.             }
  47.             
  48.             //  FeliCaProxy との認証完了時
  49.             private function onOpenComplete(evt:OpenStatusEvent):void
  50.             {
  51.                 displayMessage("FeliCaProxy との認証に成功しました。");
  52.                 
  53.                 //  リーダ/ライタの専有
  54.                 RwLock();
  55.             }
  56.             
  57.             //  FeliCaProxy との認証処理でエラー発生時
  58.             private function onOpenFailure(evt:OpenStatusEvent):void
  59.             {
  60.                 var error:Error =   evt.object as Error;
  61.                 displayMessage( "FeliCaProxy との相互認証に失敗しました。\n" +
  62.                                 "   ERROR : (" + error.errorID + ") " + error.message);
  63.             }
  64.             
  65.             //  FeliCa アクセス成功時
  66.             private function onFeliCaAccessComplete(evt:FeliCaStatusEvent):void
  67.             {
  68.                 if (evt.object is FeliCaSessionResponse)
  69.                 {
  70.                     var session:FeliCaSessionResponse = evt.object as FeliCaSessionResponse;
  71.                     
  72.                     //  リーダ/ライタの専有
  73.                     if (session.type == FeliCaSessionResponse.HOLD)
  74.                     {
  75.                         displayMessage("リーダ/ライタの専有しました。");
  76.                         
  77.                         //  リーダ/ライタのオープンを実行
  78.                         RwOpen();
  79.                     }
  80.                     //  リーダ/ライタの開放
  81.                     else
  82.                     {
  83.                         displayMessage("リーダ/ライタの専有を開放しました。");
  84.                         
  85.                         //  FeliCaProxy の切断
  86.                         FeliCaProxyClose();
  87.                     }
  88.                 }
  89.                 else if (evt.object is FeliCaOpenReaderWriterAutoResponse)
  90.                 {
  91.                     displayMessage("リーダ/ライタのオープンに成功しました。");
  92.                     
  93.                     //  FeliCa を検出するために、Polling の実行
  94.                     Polling();
  95.                 }
  96.                 else if (evt.object is FeliCaPollingAndGetCardInformationResponse)
  97.                 {
  98.                     var response:FeliCaPollingAndGetCardInformationResponse = evt.object as FeliCaPollingAndGetCardInformationResponse;
  99.                     
  100.                     //  検出した FeliCa の情報を表示
  101.                     displayMessage( "FeliCa を検出しました。\n" +
  102.                                             "  idm = " + response.idm + "\n" +
  103.                                             "  pmm = " + response.pmm);
  104.                     
  105.                     //  リーダ/ライタのクローズを実行
  106.                     RwClose();  
  107.                 }
  108.                 else if (evt.object is FeliCaCloseReaderWriterResponse)
  109.                 {
  110.                     displayMessage("リーダ/ライタのクローズに成功しました。");
  111.                     
  112.                     //  リーダ/ライタ専有の開放
  113.                     RwUnlock();
  114.                 }
  115.             }
  116.             
  117.             //  FeliCa アクセス失敗時
  118.             private function onFeliCaAccessFailure(evt:FeliCaStatusEvent):void
  119.             {
  120.                 var errorMsg:String;
  121.                 if (evt.object is FeliCaAccessError)
  122.                 {
  123.                     var error1:FeliCaAccessError = evt.object as FeliCaAccessError;
  124.                     errorMsg =  "   ERROR: (" + error1.errorID + ")" + error1.message + "\n" +
  125.                                 "     FeliCa Error Code (" + error1.felicaError + ")\n" +
  126.                                 "     RW Error Code (" + error1.rwError + ")\n" +
  127.                                 "     FeliCaProxy Error Code (" + error1.felicaProxyError + ")";  
  128.                 }
  129.                 else if (evt.object is Error)
  130.                 {
  131.                     var error2:Error = evt.object as Error;
  132.                     errorMsg = "   ERROR : (" + error2.errorID + ") " + error2.message;
  133.                 }
  134.                 
  135.                 displayMessage("FeliCa アクセスに失敗しました\n" + errorMsg);
  136.                 
  137.                 //  FeliCaProxy の切断
  138.                 FeliCaProxyClose();
  139.             }
  140.             
  141.             //  FeliCa アクセスパラメータ設定エラー発生時
  142.             private function onFeliCaAccessParameterError(evt:FeliCaStatusEvent):void
  143.             {
  144.                 var error:Error = evt.object as Error;
  145.                 displayMessage( "FeliCa アクセスでパラメータエラーが発生しました。\n" +
  146.                                         "   ERROR: (" + error.errorID + ")" + error.message);
  147.                 
  148.                 //  FeliCaProxy の切断
  149.                 FeliCaProxyClose();
  150.             }
  151.             
  152.             //  FeliCaProxy の切断
  153.             private function FeliCaProxyClose():void
  154.             {
  155.                 if (fc.close() == true)
  156.                 {
  157.                     displayMessage("FeliCaProxy との接続を切断しました。");
  158.                 }
  159.                 else
  160.                 {
  161.                     displayMessage("FeliCaProxy との接続を切断に失敗しました。");
  162.                 }
  163.             }
  164.             
  165.             //  リーダ/ライタの専有を実行
  166.             private function RwLock():void
  167.             {
  168.                 //  リーダ/ライタを専有する為の情報の設定
  169.                 var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  170.                 
  171.                 request.type            = FeliCaSessionRequest.HOLD;    // リーダ・ライタ専有要求
  172.                 request.lockTimeout     = 10;                           // 専有(Lock)するまでのタイムアウト時間(秒)
  173.                 request.unlockTimeout   = 60;                           // 専有(Lock)してから開放(Unlock)するまでの見込み時間(秒) 
  174.                                                                         // FeliCaProxyは、このunlockTimeout時間経過した場合自動でR/W開放を行う。
  175.                 
  176.                 //  リーダ/ライタ専有を実行
  177.                 fc.access(request);
  178.             }
  179.             
  180.             //  リーダ/ライタ専有の開放を実行
  181.             private function RwUnlock():void
  182.             {
  183.                 //  リーダ/ライタ専有を開放する為の情報の設定
  184.                 var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  185.                 
  186.                 request.type = FeliCaSessionRequest.RELEASE;    // リーダ・ライタ開放要求
  187.                 
  188.                 //  リーダ/ライタ専有開放を実行
  189.                 fc.access(request);
  190.             }
  191.             
  192.             //  リーダ/ライタのオープンを実行
  193.             private function RwOpen():void
  194.             {
  195.                 //  [open_reader_writer_auto] コマンドを実行
  196.                 fc.access(new FeliCaOpenReaderWriterAutoRequest());
  197.             }
  198.             
  199.             //  FeliCa を検出するために、Polling の実行
  200.             private function Polling():void
  201.             {
  202.                 //  [polling_and_get_card_information] コマンドを実行する為の情報の設定
  203.                 var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest();
  204.                 
  205.                 request.systemCode  = "FFFF";       // ポーリングするシステムコード
  206.                 
  207.                 //  [polling_and_get_card_information] コマンドを実行
  208.                 fc.access(request);
  209.             }
  210.             
  211.             //  リーダ/ライタのクローズを実行
  212.             private function RwClose():void
  213.             {
  214.                 //  [close_reader_writer] コマンドを実行
  215.                 fc.access(new FeliCaCloseReaderWriterRequest());
  216.             }
  217.             
  218.             //  メッセージの表示
  219.             private function displayMessage(msg:String):void
  220.             {
  221.                 textArea1.text += msg;
  222.                 textArea1.text += "\n";
  223.                 
  224.                 this.callLater(setScroll);  //  一番下にスクロールさせる
  225.             }
  226.             
  227.             //  テキストエリアを一番下にスクロールさせる
  228.             private function setScroll():void
  229.             {
  230.                 textArea1.verticalScrollPosition = textArea1.maxVerticalScrollPosition;
  231.             }
  232.         ]]>
  233.     </mx:Script>
  234.     
  235. </mx:Application>
noswf
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- forked from felicacontest2010's FeliCa Flash Contest - FeliCa Search sample -->
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  4.     <mx:Button x="10" y="10" label="FeliCa を検出する" id="button1" click="buttonClick();"/>
  5.     <mx:TextArea x="10" y="40" width="581" height="310" id="textArea1" editable="false"/>
  6.     
  7.     <mx:Script>
  8.         <![CDATA[
  9.             // イベント概要,エントリー規約をご確認ください
  10.             // http://wonderfl.net/event/felica
  11.             // see http://wonderfl.net/event/felica for contest regulation, only in Japanese for now, sorry
  12.             // copyright sony corp. all rights reserved.
  13.             // copied from http://www.felicalauncher.com/sdk4air/#menu_02 with permission :-)
  14.             import com.sony.jp.felica.FeliCaControl;
  15.             
  16.             import com.sony.jp.felica.FeliCaSessionRequest;
  17.             import com.sony.jp.felica.FeliCaSessionResponse;
  18.             import com.sony.jp.felica.FeliCaOpenReaderWriterAutoRequest;
  19.             import com.sony.jp.felica.FeliCaOpenReaderWriterAutoResponse;
  20.             import com.sony.jp.felica.FeliCaPollingAndGetCardInformationRequest;
  21.             import com.sony.jp.felica.FeliCaPollingAndGetCardInformationResponse;
  22.             import com.sony.jp.felica.FeliCaCloseReaderWriterRequest;
  23.             import com.sony.jp.felica.FeliCaCloseReaderWriterResponse;
  24.             
  25.             import com.sony.jp.felica.event.OpenStatusEvent;
  26.             import com.sony.jp.felica.event.FeliCaStatusEvent;
  27.             import com.sony.jp.felica.error.FeliCaAccessError;
  28.             
  29.             //  FeliCaProxy との通信を行うコントロールクラス
  30.             private var fc:FeliCaControl = new FeliCaControl();
  31.             
  32.             //  [FeliCa を検出する] ボタンクリック時
  33.             private function buttonClick():void
  34.             {
  35.                 //  リスナー登録
  36.                 fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
  37.                 fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
  38.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete);
  39.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure);
  40.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError);             
  41.                 
  42.                 //  FeliCaProxy の認証
  43.                 //  wonderflの中ではこのキーをお使いください wonderfl外では使用できません
  44.                 //  use this Standard key in wonderfl, it doesn't work outside wonderfl
  45.                 fc.open(10250,"__FELICA_STANDARD_KEY__""");
  46.             }
  47.             
  48.             //  FeliCaProxy との認証完了時
  49.             private function onOpenComplete(evt:OpenStatusEvent):void
  50.             {
  51.                 displayMessage("FeliCaProxy との認証に成功しました。");
  52.                 
  53.                 //  リーダ/ライタの専有
  54.                 RwLock();
  55.             }
  56.             
  57.             //  FeliCaProxy との認証処理でエラー発生時
  58.             private function onOpenFailure(evt:OpenStatusEvent):void
  59.             {
  60.                 var error:Error =   evt.object as Error;
  61.                 displayMessage( "FeliCaProxy との相互認証に失敗しました。\n" +
  62.                                 "   ERROR : (" + error.errorID + ") " + error.message);
  63.             }
  64.             
  65.             //  FeliCa アクセス成功時
  66.             private function onFeliCaAccessComplete(evt:FeliCaStatusEvent):void
  67.             {
  68.                 if (evt.object is FeliCaSessionResponse)
  69.                 {
  70.                     var session:FeliCaSessionResponse = evt.object as FeliCaSessionResponse;
  71.                     
  72.                     //  リーダ/ライタの専有
  73.                     if (session.type == FeliCaSessionResponse.HOLD)
  74.                     {
  75.                         displayMessage("リーダ/ライタの専有しました。");
  76.                         
  77.                         //  リーダ/ライタのオープンを実行
  78.                         RwOpen();
  79.                     }
  80.                     //  リーダ/ライタの開放
  81.                     else
  82.                     {
  83.                         displayMessage("リーダ/ライタの専有を開放しました。");
  84.                         
  85.                         //  FeliCaProxy の切断
  86.                         FeliCaProxyClose();
  87.                     }
  88.                 }
  89.                 else if (evt.object is FeliCaOpenReaderWriterAutoResponse)
  90.                 {
  91.                     displayMessage("リーダ/ライタのオープンに成功しました。");
  92.                     
  93.                     //  FeliCa を検出するために、Polling の実行
  94.                     Polling();
  95.                 }
  96.                 else if (evt.object is FeliCaPollingAndGetCardInformationResponse)
  97.                 {
  98.                     var response:FeliCaPollingAndGetCardInformationResponse = evt.object as FeliCaPollingAndGetCardInformationResponse;
  99.                     
  100.                     //  検出した FeliCa の情報を表示
  101.                     displayMessage( "FeliCa を検出しました。\n" +
  102.                                             "  idm = " + response.idm + "\n" +
  103.                                             "  pmm = " + response.pmm);
  104.                     
  105.                     //  リーダ/ライタのクローズを実行
  106.                     RwClose();  
  107.                 }
  108.                 else if (evt.object is FeliCaCloseReaderWriterResponse)
  109.                 {
  110.                     displayMessage("リーダ/ライタのクローズに成功しました。");
  111.                     
  112.                     //  リーダ/ライタ専有の開放
  113.                     RwUnlock();
  114.                 }
  115.             }
  116.             
  117.             //  FeliCa アクセス失敗時
  118.             private function onFeliCaAccessFailure(evt:FeliCaStatusEvent):void
  119.             {
  120.                 var errorMsg:String;
  121.                 if (evt.object is FeliCaAccessError)
  122.                 {
  123.                     var error1:FeliCaAccessError = evt.object as FeliCaAccessError;
  124.                     errorMsg =  "   ERROR: (" + error1.errorID + ")" + error1.message + "\n" +
  125.                                 "     FeliCa Error Code (" + error1.felicaError + ")\n" +
  126.                                 "     RW Error Code (" + error1.rwError + ")\n" +
  127.                                 "     FeliCaProxy Error Code (" + error1.felicaProxyError + ")";  
  128.                 }
  129.                 else if (evt.object is Error)
  130.                 {
  131.                     var error2:Error = evt.object as Error;
  132.                     errorMsg = "   ERROR : (" + error2.errorID + ") " + error2.message;
  133.                 }
  134.                 
  135.                 displayMessage("FeliCa アクセスに失敗しました\n" + errorMsg);
  136.                 
  137.                 //  FeliCaProxy の切断
  138.                 FeliCaProxyClose();
  139.             }
  140.             
  141.             //  FeliCa アクセスパラメータ設定エラー発生時
  142.             private function onFeliCaAccessParameterError(evt:FeliCaStatusEvent):void
  143.             {
  144.                 var error:Error = evt.object as Error;
  145.                 displayMessage( "FeliCa アクセスでパラメータエラーが発生しました。\n" +
  146.                                         "   ERROR: (" + error.errorID + ")" + error.message);
  147.                 
  148.                 //  FeliCaProxy の切断
  149.                 FeliCaProxyClose();
  150.             }
  151.             
  152.             //  FeliCaProxy の切断
  153.             private function FeliCaProxyClose():void
  154.             {
  155.                 if (fc.close() == true)
  156.                 {
  157.                     displayMessage("FeliCaProxy との接続を切断しました。");
  158.                 }
  159.                 else
  160.                 {
  161.                     displayMessage("FeliCaProxy との接続を切断に失敗しました。");
  162.                 }
  163.             }
  164.             
  165.             //  リーダ/ライタの専有を実行
  166.             private function RwLock():void
  167.             {
  168.                 //  リーダ/ライタを専有する為の情報の設定
  169.                 var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  170.                 
  171.                 request.type            = FeliCaSessionRequest.HOLD;    // リーダ・ライタ専有要求
  172.                 request.lockTimeout     = 10;                           // 専有(Lock)するまでのタイムアウト時間(秒)
  173.                 request.unlockTimeout   = 60;                           // 専有(Lock)してから開放(Unlock)するまでの見込み時間(秒) 
  174.                                                                         // FeliCaProxyは、このunlockTimeout時間経過した場合自動でR/W開放を行う。
  175.                 
  176.                 //  リーダ/ライタ専有を実行
  177.                 fc.access(request);
  178.             }
  179.             
  180.             //  リーダ/ライタ専有の開放を実行
  181.             private function RwUnlock():void
  182.             {
  183.                 //  リーダ/ライタ専有を開放する為の情報の設定
  184.                 var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  185.                 
  186.                 request.type = FeliCaSessionRequest.RELEASE;    // リーダ・ライタ開放要求
  187.                 
  188.                 //  リーダ/ライタ専有開放を実行
  189.                 fc.access(request);
  190.             }
  191.             
  192.             //  リーダ/ライタのオープンを実行
  193.             private function RwOpen():void
  194.             {
  195.                 //  [open_reader_writer_auto] コマンドを実行
  196.                 fc.access(new FeliCaOpenReaderWriterAutoRequest());
  197.             }
  198.             
  199.             //  FeliCa を検出するために、Polling の実行
  200.             private function Polling():void
  201.             {
  202.                 //  [polling_and_get_card_information] コマンドを実行する為の情報の設定
  203.                 var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest();
  204.                 
  205.                 request.systemCode  = "FFFF";       // ポーリングするシステムコード
  206.                 
  207.                 //  [polling_and_get_card_information] コマンドを実行
  208.                 fc.access(request);
  209.             }
  210.             
  211.             //  リーダ/ライタのクローズを実行
  212.             private function RwClose():void
  213.             {
  214.                 //  [close_reader_writer] コマンドを実行
  215.                 fc.access(new FeliCaCloseReaderWriterRequest());
  216.             }
  217.             
  218.             //  メッセージの表示
  219.             private function displayMessage(msg:String):void
  220.             {
  221.                 textArea1.text += msg;
  222.                 textArea1.text += "\n";
  223.                 
  224.                 this.callLater(setScroll);  //  一番下にスクロールさせる
  225.             }
  226.             
  227.             //  テキストエリアを一番下にスクロールさせる
  228.             private function setScroll():void
  229.             {
  230.                 textArea1.verticalScrollPosition = textArea1.maxVerticalScrollPosition;
  231.             }
  232.         ]]>
  233.     </mx:Script>
  234.     
  235. </mx:Application>
noswf
  1. /*
  2.    複数のFeliCaを使って図形を描画します。
  3.    (一回りを勤務時間にして、休憩や作業時間のビジュアル化を試みたのですが、実用的なレベルまでになってないです。)
  4.  */
  5. package {
  6.     import com.sony.jp.felica.FeliCaCloseReaderWriterRequest;
  7.     import com.sony.jp.felica.FeliCaCloseReaderWriterResponse;
  8.     import com.sony.jp.felica.FeliCaControl;
  9.     import com.sony.jp.felica.FeliCaOpenReaderWriterAutoRequest;
  10.     import com.sony.jp.felica.FeliCaOpenReaderWriterAutoResponse;
  11.     import com.sony.jp.felica.FeliCaPollingAndGetCardInformationRequest;
  12.     import com.sony.jp.felica.FeliCaPollingAndGetCardInformationResponse;
  13.     import com.sony.jp.felica.FeliCaSessionRequest;
  14.     import com.sony.jp.felica.FeliCaSessionResponse;
  15.     import com.sony.jp.felica.error.FeliCaAccessError;
  16.     import com.sony.jp.felica.event.FeliCaStatusEvent;
  17.     import com.sony.jp.felica.event.OpenStatusEvent;
  18.     import flash.display.Graphics;
  19.     import flash.display.MovieClip;
  20.     import flash.display.Sprite;
  21.     import flash.events.Event;
  22.     import flash.events.MouseEvent;
  23.     import flash.text.TextField;
  24.     import flash.text.TextFieldAutoSize;
  25.     import flash.text.TextFormat;
  26.     import flash.utils.clearInterval;
  27.     import flash.utils.setInterval;
  28.     [SWF(width="465", height="465", backgroundColor="#111111", frameRate="60")]
  29.     public class FeliCaContest extends MovieClip {
  30.         private const TIMESCALE:int = 30;
  31.         private var txtLog:TextField = new TextField();
  32.         private var logFormat:TextFormat = new TextFormat();
  33.         public function FeliCaContest() {
  34.             trace("###################");
  35.             format.color = 0xDDDDDD;
  36.             txtIDm.text = "txtIDm:";
  37.             txtIDm.autoSize = TextFieldAutoSize.LEFT;
  38.             txtIDm.defaultTextFormat = format;
  39.             txtIDm.x = 10;
  40.             txtIDm.y = 10;
  41.             this.addChild(txtIDm);
  42.             this.logFormat.color = 0x333333;
  43.             this.logFormat.size = 9;
  44.             txtLog.text = "";
  45.             txtLog.autoSize = TextFieldAutoSize.LEFT;
  46.             txtLog.defaultTextFormat = logFormat;
  47.             txtLog.x = this.stage.stageWidth / 2;
  48.             txtLog.y = 10;
  49.             this.addChild(txtLog);
  50.             graphInit();
  51.             init();
  52.             pollingStart();
  53.         }
  54.         private var counter:int = 1;
  55.         //    エラー情報
  56.         private var error:Object = {felica: "0", rw: "0", proxy: "0"};
  57.         //    連続 Polling 終了フラグ
  58.         private var exitPollingFlag:Boolean = false;
  59.         //    FeliCaProxy との通信を行うコントロールクラス
  60.         private var fc:FeliCaControl = new FeliCaControl();
  61.         private var format:TextFormat = new TextFormat();
  62.         private var g:Graphics;
  63.         private var g2:Graphics;
  64.         private var idm:String//Felica製造ID
  65.         private const r:int = 200//半径
  66. //        private var runFlag:Boolean = false;
  67.         private var s:Sprite;
  68.         private var s2:Sprite;
  69.         //        private var textArea1:TextField = new TextField();
  70.         private var txtIDm:TextField = new TextField();
  71.         private var txtPMm:TextField = new TextField();
  72.         //    連続 Polling を行なう間隔に対する一意の数値識別子(呼び出しID)
  73.         private var waitIntervalId:uint = 0;
  74.         //    FeliCaProxy の切断
  75.         private function FeliCaProxyClose():void {
  76.             if(fc.close() == true) {
  77.                 displayMessage("FeliCaProxy との接続を切断しました。");
  78.             } else {
  79.                 displayMessage("FeliCaProxy との接続を切断に失敗しました。");
  80.             }
  81.             idm = null;
  82.         }
  83.         /**
  84.          * FeliCa を検出するために、Polling の実行
  85.          */
  86.         private function Polling():void {
  87.             //    [polling_and_get_card_information] コマンドを実行する為の情報の設定
  88.             var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest();
  89.             request.systemCode = "FFFF"// ポーリングするシステムコード
  90.             //    [polling_and_get_card_information] コマンドを実行
  91.             fc.access(request);
  92.         }
  93.         //    リーダ/ライタのクローズを実行
  94.         private function RwClose():void {
  95.             //    [close_reader_writer] コマンドを実行
  96.             fc.access(new FeliCaCloseReaderWriterRequest());
  97.         }
  98.         //    リーダ/ライタの専有を実行
  99.         private function RwLock():void {
  100.             //    リーダ/ライタを専有する為の情報の設定
  101.             var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  102.             request.type = FeliCaSessionRequest.HOLD; // リーダ・ライタ専有要求
  103.             request.lockTimeout = 10// 専有(Lock)するまでのタイムアウト時間(秒)
  104.             request.unlockTimeout = 60// 専有(Lock)してから開放(Unlock)するまでの見込み時間(秒) 
  105.             // FeliCaProxyは、このunlockTimeout時間経過した場合自動でR/W開放を行う。
  106.             //    リーダ/ライタ専有を実行
  107.             fc.access(request);
  108.         }
  109.         //    リーダ/ライタのオープンを実行
  110.         private function RwOpen():void {
  111.             //    [open_reader_writer_auto] コマンドを実行
  112.             fc.access(new FeliCaOpenReaderWriterAutoRequest());
  113.         }
  114.         //    リーダ/ライタ専有の開放を実行
  115.         private function RwUnlock():void {
  116.             //    リーダ/ライタ専有を開放する為の情報の設定
  117.             var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  118.             request.type = FeliCaSessionRequest.RELEASE; // リーダ・ライタ開放要求
  119.             //    リーダ/ライタ専有開放を実行
  120.             fc.access(request);
  121.         }
  122.         private function clickHandler(e:MouseEvent = null):void {
  123.             trace("clickHandler");
  124.             if(exitPollingFlag == false) {
  125.                 //    連続 Polling 終了フラグのセット
  126.                 this.exitPollingFlag = true;
  127.             } else {
  128.                 this.txtLog.text = "";
  129.                 counter = 0;
  130.                 reStart();
  131.                 resetGraph();
  132.             }
  133.         }
  134.         //    [FeliCa を検出を開始する] ボタンクリック時
  135.         private function reStart():void {
  136.             //    連続 Polling 終了フラグの初期化
  137.             this.exitPollingFlag = false;
  138.             //    連続 Polling を行なう間隔に対する一意の数値識別子の初期化
  139.             this.waitIntervalId = 0;
  140.             fcOpen();
  141.         }
  142.         //    メッセージの表示
  143.         private function displayMessage(msg:String):void {
  144.             trace(msg);
  145.         }
  146.         private function drawTriangle(x1:int, y1:int, x2:int, y2:int, x3:int, y3:int, c:uint):void {
  147.             g.beginFill(c);
  148.             g.moveTo(x1, y1);
  149.             g.lineTo(x2, y2);
  150.             g.lineTo(x3, y3);
  151.             g.lineTo(x1, y1);
  152.         }
  153.         private function enterFrameHandler(e:Event):void {
  154.             //            trace("enterFrameHandler");
  155.             //trace(i % 180)
  156.             if(counter % (360 * TIMESCALE) == 0) {
  157.                 //    連続 Polling 終了フラグのセット
  158.                 this.exitPollingFlag = true;
  159. //                runFlag = false;
  160.             }
  161.             if(exitPollingFlag == false) {
  162.                 if(counter % 360 == 0) {
  163.                     resetGraph();
  164.                 }
  165.                 g2.lineTo(Math.cos(counter * Math.PI / 180) * r, Math.sin(counter * Math.PI / 180) * r);
  166.                 //g.moveTo(0,0);
  167.                 //g.lineTo(Math.sin(i* Math.PI / 180)*r,Math.cos(i* Math.PI / 180)*r);
  168.                 //radian = from 0 to Math.PI *2
  169.                 if(counter % TIMESCALE == 0) {
  170.                     var c:int = counter / TIMESCALE;
  171.                     var x1:int = Math.cos((c - 1) * Math.PI / 180) * r;
  172.                     var y1:int = Math.sin((c - 1) * Math.PI / 180) * r;
  173.                     var x2:int = Math.cos(c * Math.PI / 180) * r;
  174.                     var y2:int = Math.sin(c * Math.PI / 180) * r;
  175.                     if(idm != null) {
  176.                         var n:Number = Number("0x" + idm) >> 12 & 0xffffff;
  177.                         drawTriangle(00, x1, y1, x2, y2, n);
  178.                     }
  179.                 }
  180.             }
  181.             counter++;
  182.         }
  183.         /**
  184.          * 連続 Polling 実行待ち合わせ完了時
  185.          */
  186.         private function execPolling():void {
  187.             //    指定した setInterval() 呼び出しをキャンセル
  188.             clearInterval(this.waitIntervalId);
  189.             //    FeliCa を検出するために、Polling の実行
  190.             Polling();
  191.         }
  192.         private function graphInit():void {
  193. //            runFlag = true;
  194.             s = new Sprite();
  195.             g = s.graphics;
  196.             s2 = new Sprite();
  197.             g2 = s2.graphics;
  198.             s2.x = this.stage.stageWidth / 2;
  199.             s2.y = this.stage.stageHeight / 2;
  200.             this.addChild(s2);
  201.             s.x = this.stage.stageWidth / 2;
  202.             s.y = this.stage.stageHeight / 2;
  203.             this.addChild(s);
  204.             resetGraph();
  205.         }
  206.         private function init():void {
  207.             fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
  208.             fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
  209.             fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete);
  210.             fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure);
  211.             fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError);
  212.         }
  213.         /**
  214.          *    次の実行処理を行なう
  215.          *        連続 Polling をそのまま行なうか
  216.          *        連続 Polling を終了してリーダ/ライタのクローズを行なう
  217.          */
  218.         private function nextProcess():void {
  219.             if(this.exitPollingFlag == true) {
  220.                 //    リーダ/ライタのクローズを実行
  221.                 RwClose();
  222.             } else {
  223.                 //    次の Polling まで 500 ミリ秒待ち合わせる
  224.                 this.waitIntervalId = setInterval(execPolling, 500);
  225.             }
  226.         }
  227.         /**
  228.          * FeliCa アクセス成功時
  229.          * @param evt
  230.          */
  231.         private function onFeliCaAccessComplete(evt:FeliCaStatusEvent):void {
  232.             this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  233.             this.stage.addEventListener(MouseEvent.CLICK, clickHandler);
  234.             if(evt.object is FeliCaSessionResponse) {
  235.                 var session:FeliCaSessionResponse = evt.object as FeliCaSessionResponse;
  236.                 //    リーダ/ライタの専有
  237.                 if(session.type == FeliCaSessionResponse.HOLD) {
  238.                     displayMessage("リーダ/ライタの専有しました。");
  239.                     //    リーダ/ライタのオープンを実行
  240.                     RwOpen();
  241.                 } else {
  242.                     //    リーダ/ライタの開放
  243.                     displayMessage("リーダ/ライタの専有を開放しました。");
  244.                     //    FeliCaProxy の切断
  245.                     FeliCaProxyClose();
  246.                 }
  247.             } else if(evt.object is FeliCaOpenReaderWriterAutoResponse) {
  248.                 displayMessage("リーダ/ライタのオープンに成功しました。");
  249.                 //    連続 Polling を終了させる関数をミリ秒単位で指定した間隔ごとに実行
  250.                 //        ※ 今回は 30 秒とする
  251.                 //                this.pollingIntervalId = setInterval(exitPolling, 60*1000);
  252.                 //    FeliCa を検出するために、Polling の実行
  253.                 Polling();
  254.             } else if(evt.object is FeliCaPollingAndGetCardInformationResponse) {
  255.                 var response:FeliCaPollingAndGetCardInformationResponse = evt.object as FeliCaPollingAndGetCardInformationResponse;
  256.                 if(idm != response.idm) {
  257.                     //    FeliCa を検出した時の画像に変更する
  258.                     //                    this.imgAutoPolling.source = "./image/find.gif";
  259.                     //    検出した FeliCa の情報を表示
  260.                     idm = response.idm;
  261.                     this.txtIDm.text = response.idm;
  262.                     this.txtPMm.text = response.pmm;
  263.                     displayMessage("FeliCa を検出しました。\n" + "  idm = " + response.idm + "\n" + "  pmm = " + response.pmm);
  264.                     var d:Date = new Date();
  265.                     this.txtLog.appendText("LOGIN:" + response.idm + "(" + d.toLocaleTimeString() + ")\n");
  266.                 }
  267.                 //    エラー情報のクリア
  268.                 this.error["felica"] = response.felicaError;
  269.                 this.error["rw"] = response.rwError;
  270.                 this.error["proxy"] = response.felicaProxyError;
  271.                 //    次の実行処理を行なう
  272.                 this.nextProcess();
  273.             } else if(evt.object is FeliCaCloseReaderWriterResponse) {
  274.                 displayMessage("リーダ/ライタのクローズに成功しました。");
  275.                 //    リーダ/ライタ専有の開放
  276.                 RwUnlock();
  277.             }
  278.         }
  279.         /**
  280.          * FeliCa アクセス失敗時
  281.          * @param evt
  282.          */
  283.         private function onFeliCaAccessFailure(evt:FeliCaStatusEvent):void {
  284.             var errorMsg:String;
  285.             if(evt.object is FeliCaAccessError) {
  286.                 var error1:FeliCaAccessError = evt.object as FeliCaAccessError;
  287.                 if(error1.rwError == 157) {
  288.                     if(error1.rwError != this.error["rw"]) {
  289.                         if(idm != null) {
  290.                             var d:Date = new Date();
  291.                             this.txtLog.appendText("LOGOUT:" + idm + "(" + d.toLocaleTimeString() + ")\n");
  292.                         }
  293.                         //    検出した FeliCa の情報を表示するテキストエリアをクリア
  294.                         idm = null;
  295.                         this.txtIDm.text = "";
  296.                         this.txtPMm.text = "";
  297.                         //    メッセージの表示
  298.                         displayMessage("FeliCa を検出できませんでした。");
  299.                     }
  300.                     //    次の実行処理を行なう
  301.                     this.nextProcess();
  302.                 } else {
  303.                     if((this.error["felica"] != error1.felicaError) || (this.error["rw"] != error1.rwError) || (this.error["proxy"] != error1.felicaProxyError)) {
  304.                         //    エラー情報の表示
  305.                         errorMsg = "   ERROR: (" + error1.errorID + ")" + error1.message + "\n" + "     FeliCa Error Code (" + error1.felicaError + ")\n" + "     RW Error Code (" + error1.rwError + ")\n" + "     FeliCaProxy Error Code (" + error1.felicaProxyError + ")";
  306.                         displayMessage("FeliCa アクセスに失敗しました\n" + errorMsg);
  307.                     }
  308.                 }
  309.                 //    エラー情報のセット
  310.                 this.error["felica"] = error1.felicaError;
  311.                 this.error["rw"] = error1.rwError;
  312.                 this.error["proxy"] = error1.felicaProxyError;
  313.             } else if(evt.object is Error) {
  314.                 var error2:Error = evt.object as Error;
  315.                 //    エラー情報の表示
  316.                 errorMsg = "   ERROR : (" + error2.errorID + ") " + error2.message;
  317.                 displayMessage("FeliCa アクセスに失敗しました\n" + errorMsg);
  318.                 //    FeliCaProxy の切断
  319.                 FeliCaProxyClose();
  320.             }
  321.         }
  322.         /**
  323.          * FeliCa アクセスパラメータ設定エラー発生時
  324.          * @param evt
  325.          */
  326.         private function onFeliCaAccessParameterError(evt:FeliCaStatusEvent):void {
  327.             var error:Error = evt.object as Error;
  328.             displayMessage("FeliCa アクセスでパラメータエラーが発生しました。\n" + "   ERROR: (" + error.errorID + ")" + error.message);
  329.             //    FeliCaProxy の切断
  330.             FeliCaProxyClose();
  331.         }
  332.         /**
  333.          * FeliCaProxy との認証完了時
  334.          * @param evt
  335.          */
  336.         private function onOpenComplete(evt:OpenStatusEvent):void {
  337.             displayMessage("FeliCaProxy との認証に成功しました。");
  338.             //    リーダ/ライタの専有
  339.             RwLock();
  340.         }
  341.         /**
  342.          * FeliCaProxy との認証処理でエラー発生時
  343.          * @param evt
  344.          */
  345.         private function onOpenFailure(evt:OpenStatusEvent):void {
  346.             var error:Error = evt.object as Error;
  347.             displayMessage("FeliCaProxy との相互認証に失敗しました。\n" + "   ERROR : (" + error.errorID + ") " + error.message);
  348.         }
  349.         //    [FeliCa を検出を開始する] ボタンクリック時
  350.         private function pollingStart():void {
  351.             //    連続 Polling 終了フラグの初期化
  352.             this.exitPollingFlag = false;
  353.             //    連続 Polling を行なう間隔に対する一意の数値識別子の初期化
  354.             this.waitIntervalId = 0;
  355.             fcOpen();
  356.         }
  357.         private function fcOpen():void{
  358.             //    FeliCaProxy の認証
  359.             //fc.open(10250);
  360.             fc.open(10250"__FELICA_STANDARD_KEY__""");
  361.         }
  362.         private function resetGraph():void {
  363. //            trace(counter);
  364.             if(exitPollingFlag == false) {
  365.                 g2.clear();
  366.                 g2.lineStyle(1, 0xffffff);
  367.                 g2.moveTo(r, 0);
  368.                 if(counter % (TIMESCALE * 360) == 0) {
  369.                     counter = 1;
  370.                     g.clear();
  371.                     g.moveTo(r, 0);
  372.                 }
  373.             }
  374.         }
  375.     }
  376. }
noswf
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- forked from felicacontest2010's FeliCa Flash Contest - FeliCa Search sample -->
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  4.     <mx:Button x="10" y="10" label="FeliCa を検出する" id="button1" click="buttonClick();"/>
  5.     <mx:TextArea x="10" y="40" width="581" height="310" id="textArea1" editable="false"/>
  6.     
  7.     <mx:Script>
  8.         <![CDATA[
  9.         
  10.             // 間に合わなかったので、とりあえず記念エントリーだけ
  11.             // 時間があいたときにコンテストと関係ないかもですが
  12.             // デモを作って投稿して遊んでみます
  13.         
  14.         
  15.             // イベント概要,エントリー規約をご確認ください
  16.             // http://wonderfl.net/event/felica
  17.             // see http://wonderfl.net/event/felica for contest regulation, only in Japanese for now, sorry
  18.             // copyright sony corp. all rights reserved.
  19.             // copied from http://www.felicalauncher.com/sdk4air/#menu_02 with permission :-)
  20.             import com.sony.jp.felica.FeliCaControl;
  21.             
  22.             import com.sony.jp.felica.FeliCaSessionRequest;
  23.             import com.sony.jp.felica.FeliCaSessionResponse;
  24.             import com.sony.jp.felica.FeliCaOpenReaderWriterAutoRequest;
  25.             import com.sony.jp.felica.FeliCaOpenReaderWriterAutoResponse;
  26.             import com.sony.jp.felica.FeliCaPollingAndGetCardInformationRequest;
  27.             import com.sony.jp.felica.FeliCaPollingAndGetCardInformationResponse;
  28.             import com.sony.jp.felica.FeliCaCloseReaderWriterRequest;
  29.             import com.sony.jp.felica.FeliCaCloseReaderWriterResponse;
  30.             
  31.             import com.sony.jp.felica.event.OpenStatusEvent;
  32.             import com.sony.jp.felica.event.FeliCaStatusEvent;
  33.             import com.sony.jp.felica.error.FeliCaAccessError;
  34.             
  35.             //  FeliCaProxy との通信を行うコントロールクラス
  36.             private var fc:FeliCaControl = new FeliCaControl();
  37.             
  38.             //  [FeliCa を検出する] ボタンクリック時
  39.             private function buttonClick():void
  40.             {
  41.                 //  リスナー登録
  42.                 fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
  43.                 fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
  44.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete);
  45.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure);
  46.                 fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError);             
  47.                 
  48.                 //  FeliCaProxy の認証
  49.                 //  wonderflの中ではこのキーをお使いください wonderfl外では使用できません
  50.                 //  use this Standard key in wonderfl, it doesn't work outside wonderfl
  51.                 fc.open(10250,"__FELICA_STANDARD_KEY__""");
  52.             }
  53.             
  54.             //  FeliCaProxy との認証完了時
  55.             private function onOpenComplete(evt:OpenStatusEvent):void
  56.             {
  57.                 displayMessage("FeliCaProxy との認証に成功しました。");
  58.                 
  59.                 //  リーダ/ライタの専有
  60.                 RwLock();
  61.             }
  62.             
  63.             //  FeliCaProxy との認証処理でエラー発生時
  64.             private function onOpenFailure(evt:OpenStatusEvent):void
  65.             {
  66.                 var error:Error =   evt.object as Error;
  67.                 displayMessage( "FeliCaProxy との相互認証に失敗しました。\n" +
  68.                                 "   ERROR : (" + error.errorID + ") " + error.message);
  69.             }
  70.             
  71.             //  FeliCa アクセス成功時
  72.             private function onFeliCaAccessComplete(evt:FeliCaStatusEvent):void
  73.             {
  74.                 if (evt.object is FeliCaSessionResponse)
  75.                 {
  76.                     var session:FeliCaSessionResponse = evt.object as FeliCaSessionResponse;
  77.                     
  78.                     //  リーダ/ライタの専有
  79.                     if (session.type == FeliCaSessionResponse.HOLD)
  80.                     {
  81.                         displayMessage("リーダ/ライタの専有しました。");
  82.                         
  83.                         //  リーダ/ライタのオープンを実行
  84.                         RwOpen();
  85.                     }
  86.                     //  リーダ/ライタの開放
  87.                     else
  88.                     {
  89.                         displayMessage("リーダ/ライタの専有を開放しました。");
  90.                         
  91.                         //  FeliCaProxy の切断
  92.                         FeliCaProxyClose();
  93.                     }
  94.                 }
  95.                 else if (evt.object is FeliCaOpenReaderWriterAutoResponse)
  96.                 {
  97.                     displayMessage("リーダ/ライタのオープンに成功しました。");
  98.                     
  99.                     //  FeliCa を検出するために、Polling の実行
  100.                     Polling();
  101.                 }
  102.                 else if (evt.object is FeliCaPollingAndGetCardInformationResponse)
  103.                 {
  104.                     var response:FeliCaPollingAndGetCardInformationResponse = evt.object as FeliCaPollingAndGetCardInformationResponse;
  105.                     
  106.                     //  検出した FeliCa の情報を表示
  107.                     displayMessage( "FeliCa を検出しました。\n" +
  108.                                             "  idm = " + response.idm + "\n" +
  109.                                             "  pmm = " + response.pmm);
  110.                     
  111.                     //  リーダ/ライタのクローズを実行
  112.                     RwClose();  
  113.                 }
  114.                 else if (evt.object is FeliCaCloseReaderWriterResponse)
  115.                 {
  116.                     displayMessage("リーダ/ライタのクローズに成功しました。");
  117.                     
  118.                     //  リーダ/ライタ専有の開放
  119.                     RwUnlock();
  120.                 }
  121.             }
  122.             
  123.             //  FeliCa アクセス失敗時
  124.             private function onFeliCaAccessFailure(evt:FeliCaStatusEvent):void
  125.             {
  126.                 var errorMsg:String;
  127.                 if (evt.object is FeliCaAccessError)
  128.                 {
  129.                     var error1:FeliCaAccessError = evt.object as FeliCaAccessError;
  130.                     errorMsg =  "   ERROR: (" + error1.errorID + ")" + error1.message + "\n" +
  131.                                 "     FeliCa Error Code (" + error1.felicaError + ")\n" +
  132.                                 "     RW Error Code (" + error1.rwError + ")\n" +
  133.                                 "     FeliCaProxy Error Code (" + error1.felicaProxyError + ")";  
  134.                 }
  135.                 else if (evt.object is Error)
  136.                 {
  137.                     var error2:Error = evt.object as Error;
  138.                     errorMsg = "   ERROR : (" + error2.errorID + ") " + error2.message;
  139.                 }
  140.                 
  141.                 displayMessage("FeliCa アクセスに失敗しました\n" + errorMsg);
  142.                 
  143.                 //  FeliCaProxy の切断
  144.                 FeliCaProxyClose();
  145.             }
  146.             
  147.             //  FeliCa アクセスパラメータ設定エラー発生時
  148.             private function onFeliCaAccessParameterError(evt:FeliCaStatusEvent):void
  149.             {
  150.                 var error:Error = evt.object as Error;
  151.                 displayMessage( "FeliCa アクセスでパラメータエラーが発生しました。\n" +
  152.                                         "   ERROR: (" + error.errorID + ")" + error.message);
  153.                 
  154.                 //  FeliCaProxy の切断
  155.                 FeliCaProxyClose();
  156.             }
  157.             
  158.             //  FeliCaProxy の切断
  159.             private function FeliCaProxyClose():void
  160.             {
  161.                 if (fc.close() == true)
  162.                 {
  163.                     displayMessage("FeliCaProxy との接続を切断しました。");
  164.                 }
  165.                 else
  166.                 {
  167.                     displayMessage("FeliCaProxy との接続を切断に失敗しました。");
  168.                 }
  169.             }
  170.             
  171.             //  リーダ/ライタの専有を実行
  172.             private function RwLock():void
  173.             {
  174.                 //  リーダ/ライタを専有する為の情報の設定
  175.                 var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  176.                 
  177.                 request.type            = FeliCaSessionRequest.HOLD;    // リーダ・ライタ専有要求
  178.                 request.lockTimeout     = 10;                           // 専有(Lock)するまでのタイムアウト時間(秒)
  179.                 request.unlockTimeout   = 60;                           // 専有(Lock)してから開放(Unlock)するまでの見込み時間(秒) 
  180.                                                                         // FeliCaProxyは、このunlockTimeout時間経過した場合自動でR/W開放を行う。
  181.                 
  182.                 //  リーダ/ライタ専有を実行
  183.                 fc.access(request);
  184.             }
  185.             
  186.             //  リーダ/ライタ専有の開放を実行
  187.             private function RwUnlock():void
  188.             {
  189.                 //  リーダ/ライタ専有を開放する為の情報の設定
  190.                 var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  191.                 
  192.                 request.type = FeliCaSessionRequest.RELEASE;    // リーダ・ライタ開放要求
  193.                 
  194.                 //  リーダ/ライタ専有開放を実行
  195.                 fc.access(request);
  196.             }
  197.             
  198.             //  リーダ/ライタのオープンを実行
  199.             private function RwOpen():void
  200.             {
  201.                 //  [open_reader_writer_auto] コマンドを実行
  202.                 fc.access(new FeliCaOpenReaderWriterAutoRequest());
  203.             }
  204.             
  205.             //  FeliCa を検出するために、Polling の実行
  206.             private function Polling():void
  207.             {
  208.                 //  [polling_and_get_card_information] コマンドを実行する為の情報の設定
  209.                 var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest();
  210.                 
  211.                 request.systemCode  = "FFFF";       // ポーリングするシステムコード
  212.                 
  213.                 //  [polling_and_get_card_information] コマンドを実行
  214.                 fc.access(request);
  215.             }
  216.             
  217.             //  リーダ/ライタのクローズを実行
  218.             private function RwClose():void
  219.             {
  220.                 //  [close_reader_writer] コマンドを実行
  221.                 fc.access(new FeliCaCloseReaderWriterRequest());
  222.             }
  223.             
  224.             //  メッセージの表示
  225.             private function displayMessage(msg:String):void
  226.             {
  227.                 textArea1.text += msg;
  228.                 textArea1.text += "\n";
  229.                 
  230.                 this.callLater(setScroll);  //  一番下にスクロールさせる
  231.             }
  232.             
  233.             //  テキストエリアを一番下にスクロールさせる
  234.             private function setScroll():void
  235.             {
  236.                 textArea1.verticalScrollPosition = textArea1.maxVerticalScrollPosition;
  237.             }
  238.         ]]>
  239.     </mx:Script>
  240.     
  241. </mx:Application>
noswf
  1. // forked from felicacontest2010's FeliCa Flash Contest - FeliCa Search sample
  2. package
  3. {
  4. /*
  5. * FeliCaでDJもどき
  6. * @created by Hiiragi
  7. *
  8. * コードがどんどん汚くなっていく・・・。
  9. *
  10. * 使い方
  11. * FeliCaリーダー/ライターにFeliCa搭載端末を置いて、
  12. * Melo1とかのボタンを押すとIDmの読み込みを開始します。
  13. * その情報に従ってフレーズを構築して音を鳴らす感じです。
  14. *
  15. * あと、idmによって音が変わるようにしました。
  16. *
  17. * 発音時に左側が光るようになってますが、たまに光らないです。
  18. * 帯もたまに出ない感じです。
  19. * 指標にもならないので、「光ってるなー」くらいに見てください。
  20. *
  21. * 新機能として、キーボードパッドをつけてみました。
  22. * 左の波形スイッチで波形を切り替えて、右のパッドをグリグリやると音が鳴ります。
  23. * 赤色がキーの主音、緑色が全体の音と合わせても絶対に外れない音です。
  24. * これらのマークのところを目標にしてグリグリすれば、必ず音が外れない仕組みになってます。
  25. * 残念ながら、FlashPlayerの特性上、発音の遅延は避けられません。
  26. *
  27. *
  28. *
  29. * 駅とかのポスターとかに、みんながタッチして音楽を奏でたら素敵ですよね。
  30. *
  31. * FlashDevelopで開発してたんですが、デバッグ用プロジェクタがめちゃくちゃ重くてげんなりです。
  32. * 読み込めなくなったら、おそらくFeliCaリーダーが占有されている状態なので、
  33. * しばらく待った後に再読み込みしてください。
  34. */
  35. import flash.display.*;
  36. import flash.events.*;
  37. import flash.geom.*;
  38. import flash.media.*;
  39. import flash.net.*;
  40. import flash.system.*;
  41. import flash.text.*;
  42. import flash.utils.*;
  43. import net.hires.debug.Stats;
  44. import org.si.sion.*;
  45. import org.si.sion.events.*;
  46. import org.si.sion.utils.*;
  47. import org.si.sion.sequencer.*;
  48. import org.si.sion.module.*;
  49. import com.sony.jp.felica.*;
  50. import com.sony.jp.felica.event.*;
  51. import com.sony.jp.felica.error.*;
  52. import mx.controls.Button;
  53. [SWF(width = 465, height = 465, frameRate = 60, backgroundColor = 0x222222)]
  54. public class FeliCa extends Sprite
  55. {
  56. private var _felicaPhraseVec:Vector. = new Vector.(3);
  57. private var _note:Vector. = Vector.([60, 62, 64, 67, 69, 72, 74, 76, 79, 81,
  58. 48, 50, 52, 55, 57, 60, 62, 64, 67, 69,
  59. 45, 52, 57,
  60. 60, 61, 62, 63, 64]);
  61. private var _score:Vector. = new Vector.();
  62. private var _voice:Vector. = new Vector.();
  63. private var _drumScorePattern:Vector.> = new Vector.>;
  64. private var _percusVoiceArray:Vector. = new Vector.;
  65. private var _beatCounter:int = 0;
  66. private var _sionDriver:SiONDriver = new SiONDriver();
  67. private var _timer:Timer = new Timer(3000, 1);
  68. private var _loader:Loader = new Loader();
  69. private var _urlRequest:URLRequest;
  70. private var _soundPartsArray:Array = [];
  71. private var _statusSp:Sprite = new Sprite();
  72. private var _statusTextField:TextField = new TextField();
  73. private var _soundAnalyzer:SoundAnalyzer;
  74. private var _wavesCanvas:BitmapData;
  75. private var _wavesCanvasRect:Rectangle;
  76. private var _wavesCanvasCtf:ColorTransform;
  77. private var _attackLightArray:Vector.;
  78. private var _colorArray:Array = [];
  79. //現在選択しているパート
  80. private var _selectedPart:int = 1;
  81. private var _selectedDrumPart:int = 0;
  82. // FeliCaProxy との通信を行うコントロールクラス
  83. private var fc:FeliCaControl = new FeliCaControl();
  84. public function FeliCa()
  85. {
  86. _statusTextField.defaultTextFormat = new TextFormat(null, 30, 0xFFFFFF, FontStyle.BOLD);
  87. _statusTextField.autoSize = TextFieldAutoSize.LEFT;
  88. _statusTextField.y = this.stage.stageHeight / 2 - 25;
  89. statusTextSet("FeliCa Proxy Holding now");
  90. _statusSp.addChild(_statusTextField);
  91. _statusSp.graphics.beginFill(0x000000, .3);
  92. _statusSp.graphics.drawRect(0, 0, this.stage.stageWidth, this.stage.stageHeight);
  93. _statusSp.graphics.endFill();
  94. _statusSp.graphics.beginFill(0x000000, .8);
  95. _statusSp.graphics.drawRect(0, this.stage.stageHeight / 2 - 25, this.stage.stageWidth, 50);
  96. _statusSp.graphics.endFill();
  97. _wavesCanvas = new BitmapData(465, 465, true, 0);
  98. //soundLoadStart();
  99. init();
  100. }
  101. private function statusTextSet(txt:String):void
  102. {
  103. _statusTextField.text = txt;
  104. _statusTextField.x = this.stage.stageWidth / 2 - _statusTextField.width / 2;
  105. }
  106. //private function soundLoadStart():void
  107. //{
  108. //_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, soundLoadComplete);
  109. //_urlRequest = new URLRequest("FeliCaAssets.swf");
  110. //var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
  111. //_loader.load(_urlRequest, context);
  112. //}
  113. //
  114. //private function soundLoadComplete(e:Event):void
  115. //{
  116. //_soundPartsArray[0] = new (_loader.contentLoaderInfo.applicationDomain.getDefinition("kick") as Class)();
  117. //_soundPartsArray[1] = new (_loader.contentLoaderInfo.applicationDomain.getDefinition("snare") as Class)();
  118. //_soundPartsArray[2] = new (_loader.contentLoaderInfo.applicationDomain.getDefinition("ch") as Class)();
  119. //_soundPartsArray[3] = new (_loader.contentLoaderInfo.applicationDomain.getDefinition("oh") as Class)();
  120. //_soundPartsArray[4] = new (_loader.contentLoaderInfo.applicationDomain.getDefinition("crash") as Class)();
  121. //init();
  122. //}
  123. public function init():void
  124. {
  125. //SiON
  126. //_felicaPhraseVec[0] = new FelicaPhrase("011721103f08972b", false);
  127. //_felicaPhraseVec[1] = new FelicaPhrase("01010701360dd007", false);
  128. _felicaPhraseVec[0] = new FelicaPhrase(null, false);
  129. _felicaPhraseVec[1] = new FelicaPhrase(null, false);
  130. _felicaPhraseVec[2] = new FelicaPhrase(null, false);
  131. _drumScorePattern[0] = Vector.([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  132. 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0,
  133. 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
  134. 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
  135. 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0
  136. ]);
  137. //_drumScorePattern[1] = Vector.([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
  138. //0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0,
  139. //1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1,
  140. //0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1,
  141. //1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0
  142. //]);
  143. //
  144. //_drumScorePattern[2] = Vector.([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  145. //0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  146. //0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,
  147. //0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
  148. //1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0
  149. //]);
  150. _drumScorePattern = convertDrumPattern(_drumScorePattern);
  151. _soundAnalyzer = new SoundAnalyzer();
  152. createSionScoreAndVoice();
  153. _sionDriver.setBeatCallbackInterval(1);
  154. _sionDriver.addEventListener(SiONTrackEvent.BEAT, beatListner);
  155. _sionDriver.setTimerInterruption(1, timerInterruption);
  156. var preset:SiONPresetVoice = new SiONPresetVoice();
  157. _percusVoiceArray[0] = preset["valsound.percus10"]; //CC
  158. _percusVoiceArray[1] = preset["valsound.percus23"]; //OH
  159. _percusVoiceArray[2] = preset["valsound.percus18"]; //CH
  160. _percusVoiceArray[3] = preset["valsound.percus29"]; //snare
  161. _percusVoiceArray[4] = preset["valsound.percus2"]; //bass
  162. //_sionDriver.setSamplerSound(64, _soundPartsArray[0]);
  163. //_sionDriver.setSamplerSound(63, _soundPartsArray[1]);
  164. //_sionDriver.setSamplerSound(62, _soundPartsArray[2]);
  165. //_sionDriver.setSamplerSound(61, _soundPartsArray[3]);
  166. //_sionDriver.setSamplerSound(60, _soundPartsArray[4]);
  167. var tFormat:TextFormat = new TextFormat("_serif", 16, 0xFFFFFF);
  168. var btn1:ControllerButton = new ControllerButton("Melo1", "btn1",60, 30, 3, tFormat,0, 0x222222);
  169. var btn2:ControllerButton = new ControllerButton("Melo2", "btn2",60, 30, 3, tFormat,0, 0x222222);
  170. var btn3:ControllerButton = new ControllerButton("Bass", "btn3",60, 30, 3, tFormat,0, 0x222222);
  171. //var btn4:ControllerButton = new ControllerButton("Drum", "btn4", 100, 40, 5, tFormat);
  172. btn1.y = btn2.y = btn3.y = 430;
  173. btn1.x = 10;
  174. btn2.x = 70;
  175. btn3.x = 130;
  176. //btn4.x = 350;
  177. btn1.addEventListener(MouseEvent.CLICK, cardReadStart);
  178. btn2.addEventListener(MouseEvent.CLICK, cardReadStart);
  179. btn3.addEventListener(MouseEvent.CLICK, cardReadStart);
  180. //btn4.addEventListener(MouseEvent.CLICK, drumPatternEdit);
  181. var wavesCanvasBmp:Bitmap = new Bitmap(_wavesCanvas);
  182. _wavesCanvasRect = _wavesCanvas.rect;
  183. _wavesCanvasCtf = new ColorTransform(0.995, 0.995, 0.995, 0.995);
  184. this.addChild(wavesCanvasBmp);
  185. _attackLightArray = new Vector.();
  186. var verticalGridLine:Sprite = new Sprite();
  187. this.addChild(verticalGridLine);
  188. var h:int = 400 / _note.length;
  189. this.graphics.beginFill(0x200000);
  190. this.graphics.drawRect(0, 0, 465, h * 10);
  191. this.graphics.endFill();
  192. this.graphics.beginFill(0x002000);
  193. this.graphics.drawRect(0, h * 10, 465, h * 10);
  194. this.graphics.endFill();
  195. this.graphics.beginFill(0x000020);
  196. this.graphics.drawRect(0, h * 20, 465, h * 3);
  197. this.graphics.endFill();
  198. //グリッド描画と色設定とAttackLight設置
  199. this.graphics.lineStyle(1, 0x666666);
  200. verticalGridLine.graphics.lineStyle(1, 0x666666);
  201. for (var i:int = 0; i < 16; i++)
  202. {
  203. this.graphics.moveTo(465 / 16 * i, 0);
  204. this.graphics.lineTo(465 / 16 * i, 400 - 9);
  205. _colorArray[i] = HSVtoRGB(360 / 16 * i);
  206. }
  207. this.graphics.moveTo(465, 0);
  208. this.graphics.lineTo(465, 465);
  209. for (i = 0; i < _note.length ; i++)
  210. {
  211. verticalGridLine.graphics.moveTo(0, h * i + 400 / + h / 2 -1);
  212. verticalGridLine.graphics.lineTo(465, h * i + 400 / + h / 2 -1);
  213. var al:AttackLight = new AttackLight();
  214. al.y = h * i - 10;
  215. verticalGridLine.addChild(al);
  216. _attackLightArray[i] = al;
  217. }
  218. this.addChild(btn1);
  219. this.addChild(btn2);
  220. this.addChild(btn3);
  221. //this.addChild(btn4);
  222. var keyboard:Keyboard = new Keyboard(465);
  223. keyboard.y = 390;
  224. this.addChild(keyboard);
  225. _soundAnalyzer.x = 465 - 256;
  226. _soundAnalyzer.y = 423;
  227. this.addChild(_soundAnalyzer);
  228. //this.addChild(new Stats());
  229. this.addEventListener(Event.ENTER_FRAME, canvasScroller);
  230. _timer.addEventListener(TimerEvent.TIMER, connectionCloser);
  231. // リスナー登録
  232. fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
  233. fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
  234. fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete);
  235. fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure);
  236. fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError);
  237. tracer("FeliCaProxy との認証を開始します。");
  238. //fc.open(10250);
  239. fc.open(10250,"__FELICA_STANDARD_KEY__", "");
  240. _sionDriver.play();
  241. }
  242. private function HSVtoRGB(hue:Number, saturation:Number=1, value:Number=1):uint {
  243. var Hi:int = Math.floor(hue / 60) % 6;
  244. var f:Number = hue / 60 - Hi;
  245. var p:Number = value * (1 - saturation);
  246. var q:Number = value * (1 - f * saturation);
  247. var t:Number = value * (1 - (1 - f) * saturation);
  248. var r:Number = 0;
  249. var g:Number = 0;
  250. var b:Number = 0;
  251. switch (Hi) {
  252. case 0:
  253. r=value; g=t; b=p;
  254. break;
  255. case 1:
  256. r=q; g=value; b=p;
  257. break;
  258. case 2:
  259. r=p; g=value; b=t;
  260. case 3:
  261. r=p; g=q; b=value;
  262. break;
  263. case 4:
  264. r=t; g=p; b=value;
  265. break;
  266. case 5:
  267. r=value; g=p; b=q;
  268. break;
  269. }
  270. r = Math.floor(r*255);
  271. g = Math.floor(g*255);
  272. b = Math.floor(b*255);
  273. return r << 16 | g << 8 | b;
  274. }
  275. private var _ctfCnt:int = 0;
  276. private function canvasScroller(e:Event):void
  277. {
  278. _wavesCanvas.lock();
  279. _wavesCanvas.scroll(5, 0);
  280. _ctfCnt++;
  281. if (_ctfCnt >= 3)
  282. {
  283. _wavesCanvas.colorTransform(_wavesCanvasRect, _wavesCanvasCtf);
  284. _ctfCnt = 0;
  285. }
  286. _wavesCanvas.unlock();
  287. }
  288. private var feliCaReadFlag:Boolean = false;
  289. private function connectionCloser(e:TimerEvent):void
  290. {
  291. tracer("制限時間により読み取りを終了します。");
  292. feliCaReadFlag = false;
  293. }
  294. private function cardReadStart(e:MouseEvent):void
  295. {
  296. if (feliCaReadFlag)
  297. {
  298. tracer("現在FeliCa読み取り中です。");
  299. }
  300. else
  301. {
  302. switch (e.target.name)
  303. {
  304. case "btn1":
  305. _selectedPart = 0;
  306. break;
  307. case "btn2":
  308. _selectedPart = 1;
  309. break;
  310. case "btn3":
  311. _selectedPart = 2;
  312. break;
  313. }
  314. RwLock();
  315. feliCaReadFlag = true;
  316. _timer.reset();
  317. _timer.start();
  318. this.addChild(_statusSp);
  319. }
  320. }
  321. private function drumPatternEdit(e:MouseEvent):void
  322. {
  323. }
  324. private function onOpenComplete(e:OpenStatusEvent):void
  325. {
  326. tracer("FeliCaProxy との認証に成功しました。");
  327. //RwLock();
  328. }
  329. private function onOpenFailure(e:OpenStatusEvent):void
  330. {
  331. var error:Error = e.object as Error;
  332. tracer( "FeliCaProxy との相互認証に失敗しました。\n" +
  333. " ERROR : (" + error.errorID + ") " + error.message);
  334. }
  335. private function onFeliCaAccessComplete(e:FeliCaStatusEvent):void
  336. {
  337. if (e.object is FeliCaSessionResponse)
  338. {
  339. var session:FeliCaSessionResponse = e.object as FeliCaSessionResponse;
  340. // リーダ/ライタの専有
  341. if (session.type == FeliCaSessionResponse.HOLD)
  342. {
  343. statusTextSet("R/W Hold Complete");
  344. tracer("リーダ/ライタの専有をしました。");
  345. // リーダ/ライタのオープンを実行
  346. RwOpen();
  347. }
  348. // リーダ/ライタの開放
  349. else
  350. {
  351. tracer("リーダ/ライタの専有を開放しました。");
  352. this.removeChild(_statusSp);
  353. // FeliCaProxy の切断
  354. //FeliCaProxyClose();
  355. }
  356. }
  357. else if (e.object is FeliCaOpenReaderWriterAutoResponse)
  358. {
  359. tracer("リーダ/ライタのオープンに成功しました。");
  360. statusTextSet("R/W Open Complete");
  361. // FeliCa を検出するために、Polling の実行
  362. Polling();
  363. }
  364. else if (e.object is FeliCaPollingAndGetCardInformationResponse)
  365. {
  366. var response:FeliCaPollingAndGetCardInformationResponse = e.object as FeliCaPollingAndGetCardInformationResponse;
  367. statusTextSet("set FeliCa idm = " + response.idm);
  368. // 検出した FeliCa の情報を表示
  369. tracer( "FeliCa を検出しました。\n" +
  370. " idm = " + response.idm + "\n" +
  371. " pmm = " + response.pmm);
  372. if (_selectedPart != -1 && _felicaPhraseVec[_selectedPart].idm != response.idm)
  373. {
  374. trace("_selectedPart = " + _selectedPart + " , idm = " + response.idm);
  375. _felicaPhraseVec[_selectedPart] = new FelicaPhrase(response.idm, true);
  376. createSionScoreAndVoice();
  377. }
  378. // リーダ/ライタのクローズを実行
  379. if (feliCaReadFlag)
  380. {
  381. Polling();
  382. }
  383. else
  384. {
  385. RwClose();
  386. }
  387. }
  388. else if (e.object is FeliCaCloseReaderWriterResponse)
  389. {
  390. tracer("リーダ/ライタのクローズに成功しました。");
  391. // リーダ/ライタ専有の開放
  392. RwUnlock();
  393. }
  394. }
  395. private function onFeliCaAccessFailure(e:FeliCaStatusEvent):void
  396. {
  397. var errorMsg:String;
  398. if (e.object is FeliCaAccessError)
  399. {
  400. var error1:FeliCaAccessError =e.object as FeliCaAccessError;
  401. errorMsg = " ERROR: (" + error1.errorID + ")" + error1.message + "\n" +
  402. " FeliCa Error Code (" + error1.felicaError + ")\n" +
  403. " RW Error Code (" + error1.rwError + ")\n" +
  404. " FeliCaProxy Error Code (" + error1.felicaProxyError + ")";
  405. }
  406. else if (e.object is Error)
  407. {
  408. var error2:Error =e.object as Error;
  409. errorMsg = " ERROR : (" + error2.errorID + ") " + error2.message;
  410. }
  411. tracer("FeliCa アクセスに失敗しました\n" + errorMsg);
  412. // FeliCaProxy の切断
  413. if (feliCaReadFlag)
  414. {
  415. Polling();
  416. }
  417. else
  418. {
  419. RwUnlock();
  420. //FeliCaProxyClose();
  421. }
  422. }
  423. private function onFeliCaAccessParameterError(e:FeliCaStatusEvent):void
  424. {
  425. var error:Error = e.object as Error;
  426. tracer( "FeliCa アクセスでパラメータエラーが発生しました。\n" +
  427. " ERROR: (" + error.errorID + ")" + error.message);
  428. // FeliCaProxy の切断
  429. FeliCaProxyClose();
  430. }
  431. // リーダ/ライタの専有を実行
  432. private function RwLock():void
  433. {
  434. // リーダ/ライタを専有する為の情報の設定
  435. var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  436. request.type = FeliCaSessionRequest.HOLD; // リーダ・ライタ専有要求
  437. request.lockTimeout = 10; // 専有(Lock)するまでのタイムアウト時間(秒)
  438. request.unlockTimeout = 60; // 専有(Lock)してから開放(Unlock)するまでの見込み時間(秒)
  439. // FeliCaProxyは、このunlockTimeout時間経過した場合自動でR/W開放を行う。
  440. // リーダ/ライタ専有を実行
  441. tracer("リーダ/ライタ専有を実行します。");
  442. fc.access(request);
  443. }
  444. // リーダ/ライタ専有の開放を実行
  445. private function RwUnlock():void
  446. {
  447. // リーダ/ライタ専有を開放する為の情報の設定
  448. var request:FeliCaSessionRequest = new FeliCaSessionRequest();
  449. request.type = FeliCaSessionRequest.RELEASE; // リーダ・ライタ開放要求
  450. // リーダ/ライタ専有開放を実行
  451. fc.access(request);
  452. }
  453. // リーダ/ライタのオープンを実行
  454. private function RwOpen():void
  455. {
  456. // [open_reader_writer_auto] コマンドを実行
  457. fc.access(new FeliCaOpenReaderWriterAutoRequest());
  458. }
  459. // リーダ/ライタのクローズを実行
  460. private function RwClose():void
  461. {
  462. // [close_reader_writer] コマンドを実行
  463. fc.access(new FeliCaCloseReaderWriterRequest());
  464. }
  465. // FeliCa を検出するために、Polling の実行
  466. private function Polling():void
  467. {
  468. // [polling_and_get_card_information] コマンドを実行する為の情報の設定
  469. var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest();
  470. request.systemCode = "FFFF"; // ポーリングするシステムコード
  471. // [polling_and_get_card_information] コマンドを実行
  472. fc.access(request);
  473. }
  474. // FeliCaProxy の切断
  475. private function FeliCaProxyClose():void
  476. {
  477. if (fc.close() == true)
  478. {
  479. tracer("FeliCaProxy との接続を切断しました。");
  480. }
  481. else
  482. {
  483. tracer("FeliCaProxy との接続を切断に失敗しました。");
  484. }
  485. }
  486. ////////////////////////以下、SiON用ファンクション
  487. //DrumPatternを変換
  488. private function convertDrumPattern(vec:Vector.>):Vector.>
  489. {
  490. var tempVec:Vector.> = vec.concat();
  491. var len:int = tempVec.length;
  492. for (var i:int = 0; i < len ; i++)
  493. {
  494. var tempVec2:Vector. = new Vector.(5);
  495. var len2:int = tempVec[i].length;
  496. for (var j:int = 0 ; j < len2; j++)
  497. {
  498. if (tempVec[i][j] == 1) tempVec2[(j / 16) >> 0] |= 1 << (j % 16);
  499. }
  500. tempVec[i] = tempVec2;
  501. }
  502. return tempVec;
  503. }
  504. //Create
  505. private function createSionScoreAndVoice():void
  506. {
  507. _score = new Vector.();
  508. _score = _score.concat(_drumScorePattern[_selectedDrumPart], _felicaPhraseVec[2].baseScore, _felicaPhraseVec[1].melo2Score, _felicaPhraseVec[0].melo1Score);
  509. //trace(_score);
  510. _voice = Vector.([_felicaPhraseVec[0].melo1Voice, _felicaPhraseVec[1].melo2Voice, _felicaPhraseVec[2].baseVoice]);
  511. //_soundAnalyzer.barRedColor = _felicaPhraseVec[0]color;
  512. //_soundAnalyzer.barGreenColor = _felicaPhraseVec[1].color;
  513. //_soundAnalyzer.barBlueColor = _felicaPhraseVec[2].color;
  514. _soundAnalyzer.color = _felicaPhraseVec[_selectedPart].colors[0];
  515. }
  516. //描画
  517. private function beatListner(e:SiONTrackEvent):void
  518. {
  519. _wavesCanvas.lock();
  520. var beatIndex:int = _beatCounter & 15;
  521. var height:int = 400;
  522. var len:int = _score.length;
  523. var diffHeight:int = height / len;
  524. var color:uint;
  525. for (var i:int = 0; i < len ; i++)
  526. {
  527. if (_score[i] & (1 << beatIndex))
  528. {
  529. if (i < 10) color = 0xFF << 24 | _felicaPhraseVec[0].colors[i];
  530. else if (i < 20) color = 0xFF << 24 | _felicaPhraseVec[1].colors[i % 10];
  531. else if (i < 23) color = 0xFF << 24 | _felicaPhraseVec[2].colors[i % 20];
  532. else color = 0xFF << 24 | _colorArray[beatIndex];
  533. _wavesCanvas.fillRect(new Rectangle(0, diffHeight * i, 5, diffHeight), color);
  534. _attackLightArray[i].lightUp();
  535. //trace(_attackLightArray[i]);
  536. //_wavesCanvas.setPixel32(0, diffHeight * i, 0xFFFFFFFF);
  537. }
  538. }
  539. _wavesCanvas.unlock();
  540. }
  541. //音
  542. private function timerInterruption():void
  543. {
  544. var beatIndex:int = _beatCounter & 15;
  545. var len:int = _score.length;
  546. var st:SiMMLTrack;
  547. for (var i:int = 0; i < len ; i++)
  548. {
  549. if (_score[i] & (1 << beatIndex))
  550. {
  551. if (i < 10) _sionDriver.noteOn(_note[i], _voice[0], 1);
  552. else if (i < 20) _sionDriver.noteOn(_note[i], _voice[1], 1);
  553. else if (i < 23) _sionDriver.noteOn(_note[i], _voice[2], 1);
  554. else
  555. {
  556. //var preset:SiONPresetVoice = new SiONPresetVoice();
  557. //var voice:SiONVoice = preset["valsound.percus1"];
  558. //st = _sionDriver.playSound(_note[i], 1);
  559. //trace(i - 23);
  560. st = _sionDriver.noteOn(40, _percusVoiceArray[i - 23], 1);
  561. //st.velocity = 255;
  562. }
  563. }
  564. }
  565. //Drum
  566. //if (_beatCounter % 4 == 0)
  567. //{
  568. //_sionDriver.noteOn(40, _percusVoiceArray[0], 4);
  569. //st = _sionDriver.playSound(60, 10);
  570. //st.velocity = 255;
  571. //
  572. //if (_beatCounter % 16 == 4 || _beatCounter % 16 == 12)
  573. //{
  574. //_sionDriver.noteOn(36, _percusVoiceArray[2], 4);
  575. //}
  576. //}
  577. _beatCounter++;
  578. }
  579. private function tracer(str:String):void
  580. {
  581. //trace(str);
  582. }
  583. }
  584. }
  585. import flash.display.*;
  586. import flash.filters.BlurFilter;
  587. import flash.filters.GlowFilter;
  588. import flash.media.*;
  589. import flash.events.*;
  590. import flash.geom.*;
  591. import flash.text.*;
  592. import flash.utils.*;
  593. import org.si.sion.*;
  594. import org.si.sion.utils.*;
  595. class FelicaPhrase extends Object
  596. {
  597. private var _idm:String = "";
  598. private var _melo1Voice:SiONVoice;
  599. private var _melo2Voice:SiONVoice;
  600. private var _baseVoice:SiONVoice;
  601. private var _melo1Score:Vector. = new Vector.(10);
  602. private var _melo2Score:Vector. = new Vector.(10);
  603. private var _baseScore:Vector. = new Vector.(3);
  604. private var _colors:Array;
  605. public function FelicaPhrase(idm:String, doDispatch:Boolean = true)
  606. {
  607. var sionPreset:SiONPresetVoice = new SiONPresetVoice();
  608. _idm = (idm == null) ? "0000000000000000" : idm;
  609. ////初期情報設定 検証用idm = 011721103f08972b
  610. //音符
  611. var notesStr:String = _idm.substr(6, 10);
  612. //休符情報(0は休符・1は音符)(1110110110001110)
  613. //var restNum:int = int("0x" + _idm.substr(5, 1) + _idm.substr(4, 1) + _idm.substr(3, 1) + _idm.substr(2, 1));
  614. //if (restNum != 0) restNum ^= 0xFFFF;
  615. //trace(restNum.toString(2));
  616. trace("idm = " + _idm);
  617. //melo1ScoreCreate
  618. var pos:int;
  619. //trace("notesStr = " + notesStr);
  620. for (var i:int = 0; i < notesStr.length; i++)
  621. {
  622. pos = 15 - int("0x" + notesStr.substr(i, 1));
  623. _melo1Score[i] = (int("0x" + notesStr) == 0) ? 0 : 1 << int("0x" + notesStr.substr(i, 1));
  624. }
  625. _melo1Score = redundancyDelete(_melo1Score, 16);
  626. trace("_melo1Score = " + _melo1Score);
  627. //melo2ScoreCreate
  628. var notesStr2:String = ("0000000000" + parseInt(int("0x" + notesStr).toString(2).split("").reverse().join(""), 2).toString(16)).substr(-10, 10);
  629. for (i = 0; i < notesStr2.length; i++)
  630. {
  631. pos = 15 - int("0x" + notesStr2.substr(i, 1));
  632. _melo2Score[i] = (int("0x" + notesStr2) == 0) ? 0 : 1 << int("0x" + notesStr2.substr(i, 1));
  633. }
  634. _melo2Score = redundancyDelete(_melo2Score, 16);
  635. trace("_melo2Score = " + _melo2Score);
  636. //baseScoreCreate
  637. var notesStrBass:String = "";
  638. for (i = 1; i <= 8 ; i++)
  639. {
  640. notesStrBass += ("0000" + int("0x" + notesStr.substr( -i, 1)).toString(2)).substr(-4, 4);
  641. }
  642. var index:int;
  643. for (i = 0; i < 16; i++)
  644. {
  645. index = parseInt(notesStrBass.substr(i * 2, 2), 2);
  646. if (index != 0)
  647. {
  648. _baseScore[index - 1] += 1 << i;
  649. }
  650. }
  651. trace("_baseScore = " + _baseScore);
  652. //voiceSet
  653. _melo1Voice = sionPreset["valsound.lead" + (int("0x" + notesStr.substr(-2, 2)) % 42 + 1)];
  654. _melo2Voice = sionPreset["valsound.piano" + (int("0x" + notesStr.substr(-4, 2)) % 19 + 1)];
  655. _baseVoice = sionPreset["valsound.bass" + (int("0x" + notesStr.substr( -6, 2)) % 53 + 1)];
  656. //_melo1Voice = sionPreset["valsound.lead1"];
  657. //_melo2Voice = sionPreset["valsound.piano2"];
  658. //_baseVoice = sionPreset["valsound.bass3"];
  659. _colors = [];
  660. var colorStr:String = _idm.substr( -8, 8);
  661. _colors.push(parseInt(colorStr.substr( 0, 6), 16));
  662. _colors.push(parseInt(colorStr.substr( 1, 6), 16));
  663. _colors.push(parseInt(colorStr.substr( 2, 6), 16));
  664. _colors.push(parseInt(colorStr.substr( 1, 5) + colorStr.substr(0, 1), 16));
  665. _colors.push(parseInt(colorStr.substr( 2, 5) + colorStr.substr(1, 1), 16));
  666. _colors.push(parseInt(colorStr.substr( 3, 5) + colorStr.substr(2, 1), 16));
  667. _colors.push(parseInt(colorStr.substr( 2, 1) + colorStr.substr( 5, 1) + colorStr.substr( 3, 1) + colorStr.substr( 1, 1) + colorStr.substr( 0, 1) + colorStr.substr( 4, 1), 16));
  668. _colors.push(parseInt(colorStr.substr( 3, 1) + colorStr.substr( 6, 1) + colorStr.substr( 4, 1) + colorStr.substr( 2, 1) + colorStr.substr( 1, 1) + colorStr.substr( 5, 1), 16));
  669. _colors.push(parseInt(colorStr.substr( 4, 1) + colorStr.substr( 7, 1) + colorStr.substr( 5, 1) + colorStr.substr( 3, 1) + colorStr.substr( 2, 1) + colorStr.substr( 6, 1), 16));
  670. _colors.push(parseInt(colorStr.substr( 3, 1) + colorStr.substr( 0, 1) + colorStr.substr( 5, 1) + colorStr.substr( 4, 1) + colorStr.substr( 1, 1) + colorStr.substr( 2, 1), 16));
  671. _colors.push(parseInt(colorStr.substr( 4, 1) + colorStr.substr( 1, 1) + colorStr.substr( 6, 1) + colorStr.substr( 5, 1) + colorStr.substr( 2, 1) + colorStr.substr( 3, 1), 16));
  672. _colors.push(parseInt(colorStr.substr( 5, 1) + colorStr.substr( 2, 1) + colorStr.substr( 7, 1) + colorStr.substr( 6, 1) + colorStr.substr( 3, 1) + colorStr.substr( 4, 1), 16));
  673. _colors.push(parseInt(colorStr.substr( 5, 1) + colorStr.substr( 4, 1) + colorStr.substr( 2, 1) + colorStr.substr( 0, 1) + colorStr.substr( 3, 1) + colorStr.substr( 1, 1), 16));
  674. _colors.push(parseInt(colorStr.substr( 6, 1) + colorStr.substr( 5, 1) + colorStr.substr( 3, 1) + colorStr.substr( 1, 1) + colorStr.substr( 4, 1) + colorStr.substr( 2, 1), 16));
  675. _colors.push(parseInt(colorStr.substr( 7, 1) + colorStr.substr( 6, 1) + colorStr.substr( 4, 1) + colorStr.substr( 2, 1) + colorStr.substr( 5, 1) + colorStr.substr( 3, 1), 16));
  676. _colors.push(parseInt(colorStr.substr( 4, 1) + colorStr.substr( 2, 1) + colorStr.substr( 5, 1) + colorStr.substr( 1, 1) + colorStr.substr( 7, 1) + colorStr.substr( 0, 1), 16));
  677. var colorPetternArray:Array = [["r", "g", "b"], ["g", "b", "r"],["b", "r" , "g"], ["r", "b", "g"]];
  678. var colorPetternIndex:int = parseInt(parseInt(_idm, 16).toString(16).substr( -2, 2), 2);
  679. for (i = 0; i < _colors.length; i++)
  680. {
  681. _colors[i] = intLimiter(_colors[i], colorPetternArray[colorPetternIndex][i % 3]);
  682. }
  683. trace("colors = " + _colors);
  684. }
  685. private function intLimiter(value:int, pettern:String):int
  686. {
  687. const MIN_LIMIT:int = 0x55;
  688. const MAX_LIMIT:int = 0xFF;
  689. var r:int = value >> 16;
  690. var g:int = value >> 8 & 0xFF;
  691. var b:int = value & 0xFF;
  692. if (r < MIN_LIMIT) r = (pettern == "r") ? MAX_LIMIT : MIN_LIMIT;
  693. if (g < MIN_LIMIT) g = (pettern == "g") ? MAX_LIMIT : MIN_LIMIT;
  694. if (b < MIN_LIMIT) b = (pettern == "b") ? MAX_LIMIT : MIN_LIMIT;
  695. return r << 16 | g << 8 | b;
  696. }
  697. private function redundancyDelete(vec:Vector., num:int):Vector.
  698. {
  699. var len:int = vec.length;
  700. var flag:Boolean = false;
  701. for (var i:int; i < num; i++)
  702. {
  703. for (var j:int = 0; j < len; j++)
  704. {
  705. if (vec[j] & 1 << i)
  706. {
  707. if (!flag) flag = true;
  708. else vec[j] = 0;
  709. }
  710. }
  711. flag = false;
  712. }
  713. return vec;
  714. }
  715. public function get melo1Score():Vector. { return _melo1Score; }
  716. public function get melo2Score():Vector. { return _melo2Score; }
  717. public function get baseScore():Vector. { return _baseScore; }
  718. public function get melo1Voice():SiONVoice { return _melo1Voice; }
  719. public function get melo2Voice():SiONVoice { return _melo2Voice; }
  720. public function get baseVoice():SiONVoice { return _baseVoice; }
  721. public function get idm():String { return _idm; }
  722. public function get colors():Array { return _colors; }
  723. }
  724. class SoundAnalyzer extends Bitmap
  725. {
  726. private var _byteArray:ByteArray;
  727. private var _canvas:BitmapData;
  728. private var _ctf:ColorTransform;
  729. private var _rect:Rectangle;
  730. private var _plotHeight:int;
  731. private var _barRedColor:int = 0;
  732. private var _barGreenColor:int = 0;
  733. private var _barBlueColor:int = 0;
  734. private var _color:int = 0x666666;
  735. public function SoundAnalyzer()
  736. {
  737. _plotHeight = 40;
  738. _byteArray = new ByteArray();
  739. _canvas = new BitmapData(256, _plotHeight, false, 0x0);
  740. _ctf = new ColorTransform(.9, .9, .9);
  741. _rect = new Rectangle(0, 0, 256, 50);
  742. this.bitmapData = _canvas;
  743. this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
  744. }
  745. private var _leftByteArray:ByteArray;
  746. private var _rightByteArray:ByteArray;
  747. private function onEnterFrameHandler(e:Event):void
  748. {
  749. SoundMixer.computeSpectrum(_byteArray, true, 0);
  750. _canvas.colorTransform(_rect, _ctf);
  751. //var color:int = 0x44 << 16 | _barRedColor << 16 | 0x44 << 8 | _barGreenColor << 8 | 0x44 | _barBlueColor;
  752. var x:int = 0;
  753. var h:int = 0;
  754. _leftByteArray = new ByteArray();
  755. _rightByteArray = new ByteArray();
  756. for (var i:int = 0; i < 512; i++)
  757. {
  758. if (i < 256) _leftByteArray.writeFloat(_byteArray.readFloat());
  759. else _rightByteArray.writeFloat(_byteArray.readFloat());
  760. }
  761. _leftByteArray.position = 0;
  762. _rightByteArray.position = 0;
  763. _canvas.lock();
  764. for (i = 0; i < 250; i++)
  765. {
  766. h = (_leftByteArray.readFloat() + _rightByteArray.readFloat()) / 2 * _plotHeight;
  767. for (var j:int = 0; j < h; j++)
  768. {
  769. _canvas.setPixel(x, _plotHeight - j, _color);
  770. }
  771. x++;
  772. }
  773. _canvas.unlock();
  774. }
  775. public function get color():int { return _color; }
  776. public function set color(value:int):void
  777. {
  778. _color = value;
  779. }
  780. //public function get barRedColor():int { return _barRedColor; }
  781. //
  782. //public function set barRedColor(value:int):void
  783. //{
  784. //_barRedColor = multiplierLimiter(value);
  785. //}
  786. //
  787. //public function get barGreenColor():int { return _barGreenColor; }
  788. //
  789. //public function set barGreenColor(value:int):void
  790. //{
  791. //_barGreenColor = multiplierLimiter(value);
  792. //}
  793. //
  794. //public function get barBlueColor():int { return _barBlueColor; }
  795. //
  796. //public function set barBlueColor(value:int):void
  797. //{
  798. //_barBlueColor = multiplierLimiter(value);
  799. //}
  800. //
  801. //private function multiplierLimiter(value:int):Number
  802. //{
  803. //if (value > 0xbb)
  804. //{
  805. //value /= Math.ceil(value / 0xbb);
  806. //}
  807. //else if (value < 0)
  808. //{
  809. //value = 0;
  810. //}
  811. //
  812. //return value;
  813. //}
  814. }
  815. class AttackLight extends Bitmap
  816. {
  817. //private var _canvas:BitmapData;
  818. private var _sourceSp:Sprite;
  819. private var _ctf:ColorTransform;
  820. private var _timer:Timer;
  821. public function AttackLight()
  822. {
  823. this.bitmapData = new BitmapData(150, 25, true, 0);
  824. //_canvas = new BitmapData(100, 80, true, 0);
  825. _ctf = new ColorTransform(0.8, 0.8, 0.8, 0.8);
  826. _timer = new Timer(16, 120);
  827. _timer.addEventListener(TimerEvent.TIMER, update);
  828. _sourceSp = new Sprite();
  829. var g:Graphics = _sourceSp.graphics;
  830. //var mtx:Matrix = new Matrix();
  831. //mtx.createGradientBox(25, 25, 0, 0, 0);
  832. //g.beginGradientFill(GradientType.RADIAL, [0xDDDDFF, 0xFFFFFF], [1, 1], [0, 255], mtx);
  833. g.beginFill(0xFFFFFF);
  834. g.drawCircle(0, 8, 8);
  835. //g.drawRoundRect(0, 0, 50, 25, 5);
  836. g.endFill();
  837. _sourceSp.filters = [new GlowFilter(0xFFFFFFFF, 1, 96, 16, 20, 2), new BlurFilter(8,4,2)];
  838. //this.addChild(_sourceSp);
  839. //this.addChild(new Bitmap(_canvas));
  840. //this.stage.addEventListener(MouseEvent.CLICK, lightUp);
  841. }
  842. public function lightUp(e:MouseEvent = null):void
  843. {
  844. this.bitmapData.draw(_sourceSp, new Matrix(1, 0, 0, 1, 0, 8));
  845. _timer.reset();
  846. _timer.start();
  847. }
  848. private function update(e:TimerEvent):void
  849. {
  850. this.bitmapData.colorTransform(this.bitmapData.rect, _ctf);
  851. }
  852. }
  853. class ControllerButton extends Sprite
  854. {
  855. private var _backSp:Sprite;
  856. private var _rollOverSp:Sprite;
  857. private var _mouseDownSp:Sprite;
  858. private var _tf:TextField;
  859. private var _tFormat:TextFormat;
  860. private var _labelText:String;
  861. private var _id:String;
  862. private var _width:Number;
  863. private var _height:Number;
  864. private var _color1:int;
  865. private var _color2:int;
  866. private var _roundRadius:Number;
  867. public function ControllerButton(labelText:String, name:String = null, width:Number = 80, height:Number = 20, roundRadius:Number = 5, tFormat:TextFormat = null, color1:int = 0x000000, color2:int = 0x333333)
  868. {
  869. //引数の取得・設定
  870. _labelText = labelText;
  871. if (name != null) this.name = name;
  872. _width = width;
  873. _height = height;
  874. _tFormat = tFormat;
  875. _roundRadius = roundRadius;
  876. _color1 = color1;
  877. _color2 = color2;
  878. //テキスト設定
  879. _tf = new TextField();
  880. _tf.autoSize = TextFieldAutoSize.LEFT;
  881. _tf.antiAliasType = AntiAliasType.ADVANCED;
  882. if (tFormat == null) _tf.defaultTextFormat = new TextFormat(null, null, 0xFFFFFF);
  883. else _tf.defaultTextFormat = tFormat;
  884. //初期化、表示リスト追加、リスナー追加
  885. _backSp = new Sprite();
  886. _rollOverSp = new Sprite();
  887. _mouseDownSp = new Sprite();
  888. addChild(_backSp);
  889. addChild(_mouseDownSp);
  890. addChild(_rollOverSp);
  891. addChild(_tf);
  892. this.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);
  893. this.addEventListener(MouseEvent.ROLL_OUT, onRollOutHandler);
  894. this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
  895. this.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
  896. createBtn();
  897. }
  898. //ボタン形状の描画
  899. private function createBtn():void
  900. {
  901. _tf.text = _labelText;
  902. _width = (_width >= _tf.width) ? _width : _tf.width;
  903. backSpDraw();
  904. rollOverSpDraw();
  905. mouseDownDraw();
  906. _tf.x = _width / 2 - _tf.width / 2;
  907. _tf.y = _height / 2 - _tf.height / 2;
  908. this.mouseChildren = false;
  909. this.buttonMode = true;
  910. _rollOverSp.visible = false;
  911. _mouseDownSp.visible = false;
  912. }
  913. //平常時のボタングラフィック
  914. private function backSpDraw():void
  915. {
  916. var _mtx:Matrix = new Matrix();
  917. _mtx.createGradientBox(_width, _height, Math.PI / 2);
  918. _backSp.graphics.beginGradientFill(GradientType.LINEAR,[_color1, _color2, _color1], [1,1,1],[0,126,255],_mtx);
  919. _backSp.graphics.drawRoundRect(0, 0, _width, _height, _roundRadius, _roundRadius);
  920. _backSp.graphics.endFill();
  921. }
  922. //ロールオーバ-したとき時のボタングラフィック
  923. private function rollOverSpDraw():void
  924. {
  925. _rollOverSp.graphics.beginFill(0xFFFFFF, .3);
  926. _rollOverSp.graphics.drawRoundRect(0, 0, _width, _height, _roundRadius, _roundRadius);
  927. _rollOverSp.graphics.endFill();
  928. }
  929. //ボタンを押した時のボタングラフィック
  930. private function mouseDownDraw():void
  931. {
  932. var _mtx:Matrix = new Matrix();
  933. _mtx.createGradientBox(_width, _height, Math.PI / 2);
  934. _mouseDownSp.graphics.beginGradientFill(GradientType.LINEAR,[_color2, _color1, _color2], [1,1,1],[0,126,255],_mtx);
  935. _mouseDownSp.graphics.drawRoundRect(0, 0, _width, _height, _roundRadius, _roundRadius);
  936. _mouseDownSp.graphics.endFill();
  937. }
  938. //MouseEvent.ROLL_OVER時の描画変更
  939. private function onRollOverHandler(e:MouseEvent):void
  940. {
  941. _rollOverSp.visible = true;
  942. }
  943. //MouseEvent.ROLL_OUT時の描画変更
  944. private function onRollOutHandler(e:MouseEvent):void
  945. {
  946. _rollOverSp.visible = false;
  947. _mouseDownSp.visible = false;
  948. }
  949. //MouseEvent.MOUSE_DOWN時の描画変更
  950. private function onMouseDownHandler(e:MouseEvent):void
  951. {
  952. _mouseDownSp.visible = true;
  953. }
  954. //MouseEvent.MOUSE_UP時の描画変更
  955. private function onMouseUpHandler(e:MouseEvent):void
  956. {
  957. _mouseDownSp.visible = false;
  958. }
  959. //getter/setter
  960. public function get labelText():String { return _labelText; }
  961. public function set labelText(value:String):void
  962. {
  963. _labelText = value;
  964. createBtn();
  965. }
  966. public function get id():String { return _id; }
  967. public function set id(value:String):void
  968. {
  969. _id = value;
  970. }
  971. }
  972. class Keyboard extends Sprite
  973. {
  974. private const SINE:String = "sineWave";
  975. private const TRIANGLE:String = "triangleWave";
  976. private const SQUARE_50:String = "square50Wave";
  977. private const SQUARE_25:String = "square25Wave";
  978. private const SQUARE_12_5:String = "square12.5Wave";
  979. private const SAW:String = "sawWave";
  980. private var _waveTypeArray:Array = [SINE,
  981. TRIANGLE,
  982. SQUARE_50,
  983. SQUARE_25,
  984. SQUARE_12_5,
  985. SAW];
  986. private var _waveType:String = SINE;
  987. private var _w:int;
  988. private var _padding:int;
  989. private var _menuIconSp:Sprite;
  990. private var _menuIconFilmSp:Sprite;
  991. private var _keyboardSp:Sprite;
  992. private var _imageSoundWave:ASMovieClip;
  993. private var _keyboardWidth:int;
  994. private var _sound:Sound;
  995. private var _sc:SoundChannel;
  996. private var _baseFreq:Number = 220;
  997. private var _phase:Number = 0;
  998. private var _frequency:Number = 0;
  999. private var _keyDiffX:Number = 0;
  1000. private var _PI2:Number = Math.PI * 2;
  1001. private var _stf:SoundTransform;
  1002. public function Keyboard(w:int, h:int = 30)
  1003. {
  1004. _w = w;
  1005. _padding = 2;
  1006. var keyboardNoteNum:int = 25;
  1007. var pentaTonic:Array = [1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1];
  1008. var g:Graphics = this.graphics;
  1009. g.lineStyle(1, 0x666666);
  1010. g.beginFill(0);
  1011. g.drawRect(0, 0, w, h);
  1012. g.endFill();
  1013. _menuIconSp = new Sprite();
  1014. _menuIconSp.mouseChildren = false;
  1015. g = _menuIconSp.graphics;
  1016. g.lineStyle(1,0x999999);
  1017. g.beginFill(0x0, 1);
  1018. g.drawRect(_padding, _padding, h - _padding * 2, h - _padding * 2);
  1019. g.endFill();
  1020. _menuIconSp.addEventListener(MouseEvent.CLICK, changeWave);
  1021. _menuIconSp.addEventListener(MouseEvent.ROLL_OVER, iconRollOverOut);
  1022. _menuIconSp.addEventListener(MouseEvent.ROLL_OUT, iconRollOverOut);
  1023. this.addChild(_menuIconSp);
  1024. _imageSoundWave = new ASMovieClip();
  1025. _imageSoundWave.isLoop = true;
  1026. _menuIconSp.addChild(_imageSoundWave);
  1027. //iconDraw
  1028. var len:int = _waveTypeArray.length;
  1029. var drawMaxCnt:int = 360;
  1030. var cy:Number = h / 2;
  1031. var dx:Number = 20 / drawMaxCnt;
  1032. for (var i:int = 0; i < len; i++)
  1033. {
  1034. var sp:Sprite = new Sprite();
  1035. sp.graphics.lineStyle(0.25, 0xFFFFFF);
  1036. switch (_waveTypeArray[i])
  1037. {
  1038. case SINE:
  1039. var degree:Number = 0;
  1040. sp.graphics.moveTo(5, cy);
  1041. for (var ii:int = 0; ii < 360; ii++ )
  1042. {
  1043. degree++;
  1044. sp.graphics.lineTo(degree * dx + 5, cy + 10 * Math.sin(degree * Math.PI / 180));
  1045. }
  1046. break;
  1047. case TRIANGLE:
  1048. sp.graphics.moveTo(5, cy + 6);
  1049. sp.graphics.lineTo(15, cy - 6);
  1050. sp.graphics.lineTo(25, cy + 6);
  1051. break;
  1052. case SQUARE_50:
  1053. sp.graphics.moveTo(5, cy + 6);
  1054. sp.graphics.lineTo(5, cy - 6);
  1055. sp.graphics.lineTo(15, cy - 6);
  1056. sp.graphics.lineTo(15, cy + 6);
  1057. sp.graphics.lineTo(25, cy + 6);
  1058. break;
  1059. case SQUARE_25:
  1060. sp.graphics.moveTo(5, cy + 6);
  1061. sp.graphics.lineTo(5, cy - 6);
  1062. sp.graphics.lineTo(10, cy - 6);
  1063. sp.graphics.lineTo(10, cy + 6);
  1064. sp.graphics.lineTo(25, cy + 6);
  1065. break;
  1066. case SQUARE_12_5:
  1067. sp.graphics.moveTo(5, cy + 6);
  1068. sp.graphics.lineTo(5, cy - 6);
  1069. sp.graphics.lineTo(7.5, cy - 6);
  1070. sp.graphics.lineTo(7.5, cy + 6);
  1071. sp.graphics.lineTo(25, cy + 6);
  1072. break;
  1073. case SAW:
  1074. sp.graphics.moveTo(5, cy);
  1075. sp.graphics.lineTo(10, cy - 10);
  1076. sp.graphics.lineTo(10, cy + 10);
  1077. sp.graphics.lineTo(20, cy - 10);
  1078. sp.graphics.lineTo(20, cy + 10);
  1079. sp.graphics.lineTo(25, cy);
  1080. break;
  1081. }
  1082. sp.graphics.endFill();
  1083. _imageSoundWave.addFrame(sp);
  1084. }
  1085. _menuIconFilmSp = new Sprite();
  1086. g = _menuIconFilmSp.graphics;
  1087. g.beginFill(0xFFFFFF, .3);
  1088. g.drawRect(_padding, _padding, h - _padding * 2, h - _padding * 2);
  1089. g.endFill();
  1090. _menuIconFilmSp.visible = false;
  1091. _menuIconSp.addChild(_menuIconFilmSp);
  1092. _keyboardSp = new Sprite();
  1093. g = _keyboardSp.graphics;
  1094. _keyboardWidth = w - _padding * 2 -_menuIconSp.width - _padding;
  1095. var keyboardHeight:int = h - _padding * 2;
  1096. _keyDiffX = _keyboardWidth / keyboardNoteNum;
  1097. g.beginFill(0);
  1098. g.lineStyle(1, 0x999999);
  1099. g.drawRect(0, 0, _keyboardWidth, keyboardHeight);
  1100. g.lineStyle();
  1101. for (i = 0; i < keyboardNoteNum; i++)
  1102. {
  1103. if (pentaTonic[i] == 1)
  1104. {
  1105. if (i % 12 == 0)
  1106. {
  1107. g.beginFill(0x220000);
  1108. }
  1109. else
  1110. {
  1111. g.beginFill(0x001100);
  1112. }
  1113. g.drawRect(_keyDiffX * i, 1, _keyDiffX, keyboardHeight - 2);
  1114. }
  1115. }
  1116. g.endFill();
  1117. _keyboardSp.x = _padding + _menuIconSp.width + _padding;
  1118. _keyboardSp.y = _padding;
  1119. _keyboardSp.addEventListener(MouseEvent.MOUSE_UP, waveStop);
  1120. _keyboardSp.addEventListener(MouseEvent.MOUSE_DOWN, waveStart);
  1121. _keyboardSp.addEventListener(MouseEvent.ROLL_OUT, waveStop);
  1122. //_keyboardSp.addEventListener(MouseEvent.MOUSE_MOVE, waveNoteSearch);
  1123. g.beginFill(0, 0);
  1124. g.lineStyle(1, 0x999999);
  1125. g.drawRect(0, 0, _keyboardWidth, keyboardHeight);
  1126. this.addChild(_keyboardSp);
  1127. //Sound
  1128. _sc = new SoundChannel();
  1129. _sound = new Sound();
  1130. _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, waveCreate);
  1131. _stf = new SoundTransform(.2);
  1132. }
  1133. private function waveCreate(e:SampleDataEvent):void
  1134. {
  1135. var smpl:Number;
  1136. var w:Number = _PI2 * _frequency / 44100;
  1137. var buffer:int = 2048;
  1138. var PI:Number = Math.PI;
  1139. for (var i:int = 0; i < buffer; i++)
  1140. {
  1141. switch (_waveType)
  1142. {
  1143. case SINE:
  1144. smpl = Math.sin(_phase);
  1145. break;
  1146. case TRIANGLE:
  1147. smpl = (_phase < PI) ? -2 / PI * _phase + 1 : 2 / PI * _phase - 3;
  1148. break;
  1149. case SQUARE_50:
  1150. smpl = (_phase < PI) ? 1 : -1;
  1151. break;
  1152. case SQUARE_25:
  1153. smpl = (_phase > PI/4 && _phase < PI/2) ? 1 : -1;
  1154. break;
  1155. case SQUARE_12_5:
  1156. smpl = (_phase > PI/8 && _phase < PI/4) ? 1 : -1;
  1157. break;
  1158. case SAW:
  1159. smpl = - _phase / PI + 1;
  1160. break;
  1161. }
  1162. if (smpl >= 1) smpl = 1;
  1163. else if (smpl <= -1) smpl = -1;
  1164. e.data.writeFloat(smpl);
  1165. e.data.writeFloat(smpl);
  1166. _phase = (_phase >= _PI2) ? _phase - _PI2 : _phase;
  1167. _phase += w;
  1168. }
  1169. }
  1170. private function iconRollOverOut(e:MouseEvent):void
  1171. {
  1172. _menuIconFilmSp.visible = !_menuIconFilmSp.visible;
  1173. }
  1174. private function changeWave(e:MouseEvent):void
  1175. {
  1176. _imageSoundWave.nextFrame();
  1177. _waveType = _waveTypeArray[_imageSoundWave.currentFrame - 1];
  1178. }
  1179. private function waveNoteSearch(e:Event = null):void
  1180. {
  1181. var posX:Number = mouseX - _keyboardSp.x;
  1182. _frequency = _baseFreq * Math.pow(2, Math.floor(posX / _keyDiffX) / 12);
  1183. }
  1184. private function waveStart(e:MouseEvent):void
  1185. {
  1186. waveNoteSearch();
  1187. if (_waveType == SQUARE_50 || _waveType == SQUARE_25)
  1188. {
  1189. _stf.volume = .15;
  1190. }
  1191. else if (_waveType == SQUARE_12_5 || _waveType == SAW)
  1192. {
  1193. _stf.volume = .20;
  1194. }
  1195. else
  1196. {
  1197. _stf.volume = .3;
  1198. }
  1199. _sc.stop();
  1200. _sc = _sound.play(0, 0, _stf);
  1201. this.addEventListener(Event.ENTER_FRAME, waveNoteSearch);
  1202. }
  1203. private function waveStop(e:MouseEvent):void
  1204. {
  1205. _sc.stop();
  1206. this.removeEventListener(Event.ENTER_FRAME, waveNoteSearch);
  1207. }
  1208. }
  1209. class ASMovieClip extends Sprite
  1210. {
  1211. private const PLAY:String = "play";
  1212. private const REVERSE_PLAY:String = "reversePlay";
  1213. private var _frames:Array;
  1214. private var _frameObject:Sprite;
  1215. private var _timer:Timer;
  1216. private var _enterFrameDelayTime:int;
  1217. private var _playDirectionFlag:String;
  1218. private var _startUpFlag:Boolean;
  1219. private var _currentFrame:int;
  1220. private var _isLoop:Boolean;
  1221. public function ASMovieClip()
  1222. {
  1223. _enterFrameDelayTime = 33;
  1224. _timer = new Timer(_enterFrameDelayTime);
  1225. _frameObject = new Sprite();
  1226. _timer.addEventListener(TimerEvent.TIMER, timerEventHandler);
  1227. init();
  1228. }
  1229. private function init():void
  1230. {
  1231. if (this.contains(_frameObject)) this.removeChild(_frameObject);
  1232. _frames = [];
  1233. _frameObject = new Sprite();
  1234. _startUpFlag = false;
  1235. _currentFrame = 1;
  1236. _isLoop = false;
  1237. }
  1238. //////////////////////////////////////////////////
  1239. ////////// Public
  1240. //////////////////////////////////////////////////
  1241. public function addFrame(displayObject:DisplayObject, displayNow:Boolean = false):void
  1242. {
  1243. _frames.push(displayObject);
  1244. if (displayNow || _frames.length == 1)
  1245. {
  1246. gotoAndStop(_frames.length);
  1247. }
  1248. }
  1249. public function addFrameAt(displayObject:DisplayObject, frameNumber:uint, displayNow:Boolean = false):void
  1250. {
  1251. if (frameCheck(frameNumber, true))
  1252. {
  1253. _frames.splice(frameNumber - 1, 0, displayObject);
  1254. if (displayNow || _frames.length == 1)
  1255. {
  1256. gotoAndStop(frameNumber);
  1257. }
  1258. }
  1259. }
  1260. public function removeFrameAt(frameNumber:uint):void
  1261. {
  1262. if (frameCheck(frameNumber))
  1263. {
  1264. _frames.splice(frameNumber - 1, 1);
  1265. if (_frames.length > 0)
  1266. {
  1267. var position:int = (frameNumber > _frames.length) ? _frames.length : frameNumber;
  1268. gotoAndStop(position);
  1269. }
  1270. else
  1271. {
  1272. init();
  1273. return;
  1274. }
  1275. }
  1276. }
  1277. public function removeAllFrames():void
  1278. {
  1279. init();
  1280. }
  1281. //Movie系ファンクション
  1282. public function gotoAndPlay(frameNumber:uint = 1, enterFrameDelayTime:uint = 33, isLoop:Boolean = false):void
  1283. {
  1284. _playDirectionFlag = PLAY;
  1285. gotoAndStop(frameNumber);
  1286. playBaseFunction(frameNumber, enterFrameDelayTime, isLoop);
  1287. }
  1288. public function gotoAndReversePlay(frameNumber:uint = 1, enterFrameDelayTime:uint = 33, isLoop:Boolean = false):void
  1289. {
  1290. _playDirectionFlag = REVERSE_PLAY;
  1291. gotoAndStop(frameNumber);
  1292. playBaseFunction(frameNumber, enterFrameDelayTime, isLoop);
  1293. }
  1294. public function gotoAndStop(frameNumber:uint):void
  1295. {
  1296. if (frameCheck(frameNumber))
  1297. {
  1298. if (this.contains(_frameObject)) this.removeChild(_frameObject);
  1299. _frameObject = _frames[frameNumber - 1];
  1300. _currentFrame = frameNumber;
  1301. this.addChildAt(_frameObject, 0);
  1302. if (_startUpFlag) frameMoveEventDispatcher();
  1303. _startUpFlag = true;
  1304. }
  1305. }
  1306. public function play(enterFrameDelayTime:uint = 33, isLoop:Boolean = false):void
  1307. {
  1308. _playDirectionFlag = PLAY;
  1309. gotoAndStop(_currentFrame);
  1310. playBaseFunction(_currentFrame, enterFrameDelayTime, isLoop);
  1311. }
  1312. public function stop():void
  1313. {
  1314. timerStop();
  1315. stopEventDispatcher();
  1316. }
  1317. public function nextFrame():void
  1318. {
  1319. if (_currentFrame == _frames.length)
  1320. {
  1321. if (_isLoop)
  1322. {
  1323. gotoAndStop(1);
  1324. loopCompleteEventDispatcher();
  1325. }
  1326. else
  1327. {
  1328. timerStop();
  1329. stopEventDispatcher();
  1330. return;
  1331. }
  1332. }
  1333. else if (_currentFrame < _frames.length)
  1334. {
  1335. _currentFrame++;
  1336. gotoAndStop(_currentFrame);
  1337. }
  1338. }
  1339. public function prevFrame():void
  1340. {
  1341. if (_currentFrame == 1)
  1342. {
  1343. if (_isLoop)
  1344. {
  1345. gotoAndStop(_frames.length - 1);
  1346. loopCompleteEventDispatcher();
  1347. }
  1348. else
  1349. {
  1350. timerStop();
  1351. stopEventDispatcher();
  1352. return;
  1353. }
  1354. }
  1355. else if (_currentFrame > 1)
  1356. {
  1357. _currentFrame--;
  1358. gotoAndStop(_currentFrame);
  1359. }
  1360. }
  1361. //////////////////////////////////////////////////
  1362. ////////// Private
  1363. //////////////////////////////////////////////////
  1364. private function playBaseFunction(frameNumber:uint, enterFrameDelayTime:uint, isLoop:Boolean):void
  1365. {
  1366. var isLoop_temp:Boolean = _isLoop; //一時的保存
  1367. _isLoop = isLoop;
  1368. if (frameCheck(frameNumber))
  1369. {
  1370. if (loopCheck())
  1371. {
  1372. _isLoop = isLoop;
  1373. _enterFrameDelayTime = enterFrameDelayTime;
  1374. _timer.delay = _enterFrameDelayTime;
  1375. _timer.start();
  1376. playStartEventDispatcher();
  1377. }
  1378. else
  1379. {
  1380. _isLoop = isLoop_temp;
  1381. return;
  1382. }
  1383. }
  1384. }
  1385. private function timerEventHandler(e:TimerEvent):void
  1386. {
  1387. if (loopCheck())
  1388. {
  1389. switch (_playDirectionFlag)
  1390. {
  1391. case PLAY:
  1392. if (_isLoop && _currentFrame == _frames.length)
  1393. {
  1394. gotoAndStop(1);
  1395. loopCompleteEventDispatcher();
  1396. }
  1397. else
  1398. {
  1399. nextFrame();
  1400. }
  1401. break;
  1402. case REVERSE_PLAY:
  1403. if (_isLoop && _currentFrame == 1)
  1404. {
  1405. gotoAndStop(_frames.length);
  1406. loopCompleteEventDispatcher();
  1407. }
  1408. else
  1409. {
  1410. prevFrame();
  1411. }
  1412. break;
  1413. default:
  1414. timerStop();
  1415. throw new Error("再生用のフラグが規定の定数ではありません。");
  1416. break;
  1417. }
  1418. }
  1419. else
  1420. {
  1421. timerStop();
  1422. stopEventDispatcher();
  1423. }
  1424. }
  1425. //EventDispatch
  1426. private function playStartEventDispatcher():void
  1427. {
  1428. this.dispatchEvent(new FrameEvent(FrameEvent.PLAY_START));
  1429. }
  1430. private function frameMoveEventDispatcher():void
  1431. {
  1432. this.dispatchEvent(new FrameEvent(FrameEvent.FRAME_MOVE));
  1433. }
  1434. private function loopCompleteEventDispatcher():void
  1435. {
  1436. this.dispatchEvent(new FrameEvent(FrameEvent.LOOP_COMPLETE));
  1437. }
  1438. private function stopEventDispatcher():void
  1439. {
  1440. this.dispatchEvent(new FrameEvent(FrameEvent.STOP));
  1441. }
  1442. private function timerStop():void
  1443. {
  1444. if (_timer.running) _timer.stop();
  1445. }
  1446. private function loopCheck():Boolean
  1447. {
  1448. //最後のフレームにいるときに、ループしない設定でplayしても意味ない。
  1449. //同様に、最初のフレームにいるのに、ループしない設定でreversePlayしても意味ない。
  1450. if ((_currentFrame == _frames.length && _playDirectionFlag == PLAY && !isLoop) ||
  1451. (_currentFrame == 1 && _playDirectionFlag == REVERSE_PLAY && !isLoop))
  1452. {
  1453. return false;
  1454. }
  1455. else
  1456. {
  1457. return true;
  1458. }
  1459. }
  1460. private function frameCheck(frameNumber:uint, addToArray:Boolean = false):Boolean
  1461. {
  1462. if (framesEmptyCheck())
  1463. {
  1464. if (framesFrameNumberLengthCheck(frameNumber,addToArray))
  1465. {
  1466. return true;
  1467. }
  1468. }
  1469. return false;
  1470. }
  1471. private function framesEmptyCheck():Boolean
  1472. {
  1473. if (_frames.length > 0)
  1474. {
  1475. return true;
  1476. }
  1477. else
  1478. {
  1479. throw new Error("シーンの登録数が0です。");
  1480. }
  1481. }
  1482. private function framesFrameNumberLengthCheck(frameNumber:uint, addToArray:Boolean):Boolean
  1483. {
  1484. frameNumber--;
  1485. if (_frames.length > frameNumber || (addToArray && _frames.length >= frameNumber))
  1486. {
  1487. if (frameNumber + 1 > 0)
  1488. {
  1489. return true;
  1490. }
  1491. else
  1492. {
  1493. throw new Error("フレームは1から始まります。 : \n\t指定されたフレーム : " + frameNumber + ")");
  1494. }
  1495. }
  1496. else
  1497. {
  1498. throw new Error("指定されたインデックスは範囲外です。\n\t現在登録されているフレーム数 : " + _frames.length + "\n\t指定されたフレーム : " + (frameNumber + 1));
  1499. }
  1500. }
  1501. //getter / setter
  1502. public function get currentFrame():int { return _currentFrame; }
  1503. public function set currentFrame(index:int):void
  1504. {
  1505. gotoAndStop(index);
  1506. }
  1507. public function get isLoop():Boolean { return _isLoop; }
  1508. public function set isLoop(value:Boolean):void
  1509. {
  1510. _isLoop = value;
  1511. }
  1512. public function get frames():Array { return _frames; }
  1513. public function set frames(value:Array):void
  1514. {
  1515. _frames = value;
  1516. }
  1517. public function get frameObject():Sprite { return _frameObject; }
  1518. public function set frameObject(value:Sprite):void
  1519. {
  1520. _frameObject = value;
  1521. }
  1522. public function get enterFrameDelayTime():int { return _enterFrameDelayTime; }
  1523. public function set enterFrameDelayTime(value:int):void
  1524. {
  1525. _enterFrameDelayTime = value;
  1526. _timer.delay = _enterFrameDelayTime;
  1527. }
  1528. }
  1529. class FrameEvent extends Event
  1530. {
  1531. public static const PLAY_START:String = "framePlayStart";
  1532. public static const STOP:String = "frameStop";
  1533. public static const FRAME_MOVE:String = "frameMove";
  1534. public static const LOOP_COMPLETE:String = "frameLooComplete";
  1535. public function FrameEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
  1536. {
  1537. super(type, bubbles, cancelable);
  1538. }
  1539. }
noswf

ad ad

Get Adobe Flash Player