FC2ブログ
 
■プロフィール

クリエイトウェーブ

Author:クリエイトウェーブ
開発における、諸々を書いていきたいなと思っています。
mail : info@createwave.jp

■最近の記事
■カテゴリー
■最近のコメント
■月別アーカイブ

■最近のトラックバック
■ブログ内検索

■RSSフィード
■リンク
C#とFlashの連携その5
お疲れ様です。フッチーです。
C#とFlashの連携その4を書いてから、かなり間が空いてますね・・・・
C#とFlashの連携その4では、C#とC#に貼り付けたFlashの連携において、Flash側からC#へは「fscommand」、C#側からFlash側へはと「SetVariable」で行いました。

でも、「ExternalInterface」を使って、もっと柔軟に連携する事が出来るハズじゃあと色々調べてみたら、
http://livedocs.adobe.com/flex/3_jp/html/help.html?content=19_External_Interface_10.html
とかを見ててようやっと判ったのでメモ。

下準備として
http://www.adobe.com/devnet/flash/?view=samples
のページの「Flash CS3 Professional samples」の項目のとこの「Programming_ActionScript3.0_samples.zip」をダウンロードして解凍しておきます。

下準備が終ったら、まずFlashを作ります。
flaファイルの名前は、test.flaとしました。FlashCS3(ActionScript3)ファイルです。

画面にムービークリップを作りインスタンス名「btn_mc」としてます。
後、C#から来た値を確認する為に「debug」と名前を付けたダイナミックテキストを置いてます。

ちょっとのActionScriptなので、このままタイムラインに書いてしまいます。

btn_mc.addEventListener (MouseEvent.CLICK, onClickFunc);

function onClickFunc (e:MouseEvent):void
{
    //C# アプリ関数の呼び出し
    ExternalInterface.call ("testFunction","a1","b2","c3");
}

//C#から呼ばれるコールバック関数の登録
ExternalInterface.addCallback ("testFunction", testFunction);

function testFunction (...args):void
{
    //C# アプリコールバック関数
    debug.text = args[0] + " " + args[1] + " 受け取りました";
}

Flash画面


ステージ上の"sv"と書いてあるところが、ダイナミックテキスト「debug」
"sv"って文字に意味はありません・・・・

ステージ下の真っ赤な■が、ムービークリップ「btn_mc」です。
真ん中の1はただの目印。なんの意味もありません。

ExternalInterface.call ("testFunction","a1","b2","c3");
で、C#側のメソッド「testFunction」を呼び出します。
その後に続く"a1","b2","c3"はメソッド呼び出す時の引数。
とりあえず、いくつ付けても大丈夫です。

ExternalInterface.addCallback ("testFunction", testFunction);
で、C#がFlash側のメソッド「testFunction」を呼び出します。
引数の数はいくつでもいいように(...args)にしてます。

次はC#
VC#2005で、Windowsアプリケーションの新規プロジェクトを作成します。
プロジェクト名は「FlaExternal」としました。

.NETへのFlashの貼り付け方はこちらを参考に
開発日記開始

ただこの時は、張り付いた「axShockwaveFlash1」のプロパティ「Movie」に「c:\test.swf」と入れて読み込ませてますが、これだとswfの位置が、C#で作成したexeの位置に関係なくCドライブ上の「test.swf」固定されてしまいます・・・・これは不便。
今回はexeと同じとこに置いてある「test.swf」を読み込ませます。なのでプロパティ「Movie」は空白のまま。

という事で、とりあえずデバッグモードで動かすのでexeが出来上がる「bin」フォルダの中の「Debug」の中へ、さっきのflaをパブリッシュした「test.swf」を放り込んでおきます。

出来上がったフォームをダブルクリックすると「Form1.cs」が立ち上がります。

private void Form1_Load(object sender, EventArgs e)
{
  //exeと同階層の「test.swf」読み込み
  String swfPath = System.IO.Directory.GetCurrentDirectory() + "\\test.swf";
  axShockwaveFlash1.LoadMovie(0, swfPath);
}

とフォームが起動した時に呼ばれる「Form1_Load」メソッドの中に

String swfPath = System.IO.Directory.GetCurrentDirectory() + "\\test.swf";
axShockwaveFlash1.LoadMovie(0, swfPath);

の2行を書きます。

実行するとフォームの中に「test.swf」が張り付いてるハズです。

せっかくのFlahなので、フォーム全体の大きさに、どうせならウィンドウサイズが変わってもFlashのサイズもピタっと会うようにしてしまいましょう・・・って事で

イベント

Form1.cs[デザイン]を選んだ状態でプロパティウィンドウの「イベント」を選択。
その中の「SizeChanged」をダブルクリック。

そうするとForm1.csの中にメソッド「Form1_SizeChanged」ができあがるので

private void Form1_SizeChanged(object sender, EventArgs e)
{
  axShockwaveFlash1.Width = this.Size.Width;
  axShockwaveFlash1.Height = this.Size.Height;
}


axShockwaveFlash1.Width = this.Size.Width;
axShockwaveFlash1.Height = this.Size.Height;
の2行を書いてあげます。

これでウィンドウサイズを変えた時にFlashのサイズがウィンドウにぴったりあうようになりますが
起動時にもあわせたいので、さっきの2行をメソッド「Form1_Load」の中にも追加。
これでバッチリです。

さていよいよFlashとC#の連携。
「Programming_ActionScript3.0_samples.zip」を解凍して出来た「Samples」フォルダの中に「IntrovertIM_CSharp」フォルダがあります。
まあ、これ自体がC#とFlashの連携見本のC#プロジェクトではあるのですが、その中の「ExternalInterfaceProxy」フォルダの中に

ExternalInterfaceCall.cs
ExternalInterfaceCallEventArgs.cs
ExternalInterfaceProxy.cs
ExternalInterfaceSerializer.cs

の4ファイルがあります。

これが、
http://livedocs.adobe.com/flex/3_jp/html/help.html?content=19_External_Interface_10.html
のヘルプで説明されている4ファイルです。今回この4ファイルをそのまま使います。

この4ファイルを作ったプロジェクト「FlaExternal」の中にコピーしてあげます。
プロジェクトのcsファイルとして認識させます。
登録

Form1.csに

using Flash.External;

を追加


Flashからの命令を受け取るメソッドを追加します。

private object proxy_ExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e)
{
 System.Diagnostics.Debug.WriteLine(e.FunctionCall.FunctionName);
 System.Diagnostics.Debug.WriteLine((string)e.FunctionCall.Arguments[0]);
 System.Diagnostics.Debug.WriteLine((string)e.FunctionCall.Arguments[1]);
 System.Diagnostics.Debug.WriteLine((string)e.FunctionCall.Arguments[2]);
 return null;
}

System.Diagnostics.Debug.WriteLineは
C#でtraceで紹介した、デバッグ用にメッセージをイミディエイトウインドウに出力する為の命令です。
Flashから送られてきた引数を出力させてみます。

実際にFlashからExternalInterfaceが呼ばれたときにメソッド「proxy_ExternalInterfaceCall」を実行させるための処理をフォーム起動時に実行されるメソッド「Form1_Load」に

proxy = new ExternalInterfaceProxy(axShockwaveFlash1);
proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall);

を追加します。

実行1

結果は、ごらんの通り。
Flashのムービークリップを押すと、C#のイミディエイトウインドウにActionScriptに書かれたメソッド名、引数が表示されます。

これでFlashからC#への連携は終了しました。
今度は、C#側からFlashへデータを渡すようにします。

とりあえず、FlashからC#にデータが渡ってきたら、そのタイミングでC#からFlashにデータを渡すようにします。

メソッド「proxy_ExternalInterfaceCall」の中に
proxy.Call("testFunction", "X1", "Y1");

を追加

これで、Flashのムービークリップを押すと、C#側からFlash側のメソッド「testFunction」が引数"X1", "Y1"付きで呼び出されます。

実行2

これで、C#とFlashの双方で柔軟なやりとりが出来るようになりました。
やはり、C#とFlashの連携その4のやり方よりこっちの方が便利ですね・・・・

テーマ:プログラミング - ジャンル:コンピュータ

カテゴリー:.NET | TM(0) | CM(0)
コメントの投稿

管理者にだけ表示を許可する