FlashPlayerとFlashムービーの使い方を探る2

このページをDeliciousに追加 このページをはてなブックマークに追加 このページをYahoo!ブックマークに追加

2005年4月4日(月)版

FlashPlayerとFlashムービーの使い方を探る2

シグマリオンIII用Flash Player Mateの中身はどうなってるの? その2


■はじめに

 第2回はFlash Player ActiveXコントロールのメソッドを使ってFlashムービーファイル中の変数を読み込む方法を中心に説明します。

 シグマリオンIIIをお持ちでない方でもなるべく記事内容を理解してただくために、今回はFPM( Flash Player Mate Ver 1.0 for Sigmarion III )の操作ボタンと同様の機能を、WEB上で実現して表示するようにしました。Flash Player はActiveXコントロールなのでJavaスクリプトやVBスクリプトからでも制御可能です。

 ただし今回下に表示している例ではインターネットエクスプローラ6上でしかボタン操作ができません。トリックを施せば、他のブラウザやマック上のSafariでも同様の操作を実現できますが、スクリプトが複雑になるので今回は避けました。NetScape, Safari, FireFoxの場合はFlashPlayerが独自のプラグイン形式で準備されているからにもよります。

 以上のように説明しなければならないことは非常に多岐に渡るので、疑問も次々出てくるとは思いますが、急がず1つづつポイントを押さえていっていただければと思います。

■FPMの機能の一部をWEBで実現した例

  ※↓上記サンプルダウンロードはこちらです。HTML中のJavaスクリプトの説明は次回以降に行います。
フレーム中に表示されたHTML、SWF(Flashムービー)、FLA(Flashソースファイル)をダウンロードする。

  • このサンプルを再生するのに必要なFlashPlayerのバージョンはFlashPlayer 6以上です。Flash Player 5以下では正しく動作しないと思います。
  • FLAファイルを開くにはMacromedia Flash MX 2004が必要です。Flashオーサリング、プログラミングを目指される方にはProfessional版をお薦めいたします。30日間無制限に使えるお試し版がマクロメディア株式会社のサイトからダウンロードできます。
  • Macromedia Flash MX 2004 Professional版とStudio MX 2004の価格は近いですのでStudio MX 2004の方がお買い得です。
  • このサンプルはシグマリオンIII上でも動作します。待てないよ!と先を急がれる方はC++版とこのHTML+JavaScript版を比較されるとよいかと思います。また動作確認していませんが、PocketPCのFlashPlayer 6でも再生が可能と思います。

■ソースコード説明・その2

以下は今回説明するC++ソースコードの一部です。


//Flashムービーの変数の値を整数で得る
long CTest1Dlg::GetIntVariable( LPTSTR name )
{
TCHAR buf[MAX_PATH];
long num;
_tcscpy( buf, (LPCTSTR) m_Flash.GetVariable(name ) );
num = _wtol( buf );
return num;
}

//***** LOADボタン
void CTest1Dlg::OnButton7()
{
static TCHAR filter[] = TEXT("SWF files(*.swf)|*.swf|||\0\0\0\0" );
CFileDialog dlg( TRUE, NULL, NULL, OFN_EXPLORER,filter,NULL );
dlg.DoModal();
TCHAR buf[MAX_PATH];
_tcscpy(buf,TEXT("file://") );
_tcscat(buf, dlg.m_ofn.lpstrFile );
CWnd* pF = GetDlgItem(IDC_SHOCKWAVEFLASH1);
m_Flash.SetMovie( buf );
pF->SetWindowPos( 0, 45,37,624,416 , SWP_NOZORDER );
TaskBarShow();
//ロードしたFlashムービーのパラメータを変更しても後で戻せるように
//Flash Movieロード直後の値を保持しておく
_width0 = GetIntVariable( TEXT("_width" ) );
_height0 = GetIntVariable( TEXT("_height" ) );
_x0 = GetIntVariable( TEXT("_x" ) );
_y00 = GetIntVariable( TEXT("_y" ) ); // _y0がランタイムで使用されているため
_xscale0 = GetIntVariable( TEXT("_xscale" ) );
_yscale0 = GetIntVariable( TEXT("_yscale" ) );
_rotation0 = GetIntVariable( TEXT("_rotation" ) );
}

 OnButton7()メソッド関数後半ではSWFファイル(LOADしたFlashムービー)から全部で7つの変数を読み込んでいます。SWFファイルは複数のネストしたMC(ムービークリップ、以下MCとのも表記)から成りますが、この例ではそのルート、一番根底(親)のレイヤーの数値を得ています。

 7つの変数、_x,_y,_width,_height,_xscale,_yscale,_rotationはSWF内部では値を浮動小数点で保持しています。また内部にあるすべてのMCが独立して持っています。それぞれの値は親に対して相対的です。

 FPMでは簡単にするため整数部のみを取り扱っています。GetIntVariable( LPTSTR name )中ではFlashPlayer ActiveXコントロールのラッパークラスのGetVariable(変数名)メソッドをコールしています。戻り値は数値を表現した文字列です。FPMではこの整数部のみを扱っています。
 シグマリオンIIIや先頭部に用意したWEB上のサンプルでボタンを押しながら表示される数値を確認してみてください。

 FPMの機能のほとんどは以下に整理する基本変数の操作に他なりません。この基本変数を変化させてFlashの挙動を観察し把握しておくことがFlashを理解するキーポイントの一つになります。FPMやサンプルを使い色々ご自分でも試してみてください。出てきた疑問点は今後の連載を理解する助けになると思います。

 以下にMCの7つの基本変数について整理します。


_xムービークリップの原点のX座標を表します。子MCの_x値は、親MCの原点からの座標X方向の距離を表しています。子は親に対して値は相対的です。サンプルの例で回転させて、親の_x(_root.x)と子の_x(MC1._x)がどのように変わるか確かめてください。
_yムービークリップの原点のY座標を表します。後は_xと同様ですが、下方向がプラスの方向です。サンプルの例で回転させて、親の_y(_root.y)と子の_y(MC1._y)がどのように変わるか確かめてください。
_widthMCの幅を表します。この_widthはC++,C#プログラマにとってはとても曲者で、MCが回転した場合、そのMC座標のX軸に投影した長さが_widthとなります。
_heightMCの高さを表します。この_heightはMCが回転した場合、そのMC座標のY軸に投影した長さが_heightとなります。
_rotationMCの時計回りの回転角度を度表しています。FPMでは90度づつ加算していますが、内部の数値がどんどん90度ずつ増加するわけではなく、たとえば270度をセットすると−90度と表現されなおしたりしますので要注意です。
_xscale横方向の縮尺を%単位で表しています
_yscale縦方向の縮尺を%単位で表しています

■終わりに

 FlashPlayer ActiveXからFlashの変数の読み取りと基本変数について触れましたが、C++,C#のプログラミングと同じ感覚で扱えない部分があることがなんとなくお分かりいただけたのではないかと思います。
 Flashについて習熟するコツは、今までのC++やC#の経験から比べるて数値や挙動がおかしいと考えるのではなく、こういうものだと割り切る所にあると思います。おかしいと考え出すと深みにはまってしまう場合もあります。

 Flashを学ぶ最良の方法は実際に使ってみることよいう話を良く聞きますが、本ばかり読んですべて覚えるという方法では今回説明したような違いに気が付きにくい点にあると思います。

 C++,C#からFlashに入門すると次々色々なナゾ!?や疑問に遭遇すると思いますが、ご自身でも公開したソースコードを工夫して使い、いろいろ実験してみてください。FPMでは回転角が90度単位になっていますが、Javaスクリプトの場合にはスクリプトを修正するだけで実験が可能です。

 よくFlashはわかり難いと聞きますが、実際にはとてもシンプルに開発されており、使いこなせば極めて強力なアプリケーション開発手段となります。しかしC++,C#,VB,VB.NETそしてアセンブラにもそれぞれ得意分野があるように、Flashも得手・不得手があります。筆者はFlashだけで開発をするとこだわらず、特長を生かして使えばよいと考えています。

 なお、筆者が「開発者向け談話室」などで質問等にお答えできる時間的余裕はほとんどないのでご理解/ご容赦を賜りたいと思います。



FlashPlayerとFlashムービーの使い方を探る2

Reported by かっぴー


Last-modified: Sun, 24 May 2009 23:45:30 JST (3771d)