更新日:2023/01/01
Copyright
(c)2005-2023 "o9chan4" ALL RIGHTS RESERVED.
■JavaVMの代替としてのFlash-ActionScript
Microsoft
JVMがサポートされなくなったのでWeb上にFlash-ActionScriptを実装評価した。ActionScript等で記述するよりはJava
の方が自由度が高く感じるが、ActionScript言語のバージョンが上がりJavaの様なクラスを導入したことで少し柔軟性が出てき
た。記述はJavaScriptと似ているが常にフレーム、レイヤー、タイムラインなどを考えないといけないのは少し面倒に思う。アプリ
ケーションソフトはMacromedia製の物にした。Flashを実装してもフェードイン、フェードアウトアニメーションだけで使用するのは勿
体無い。と言ってもアニメーションでしか使わないだろう。
下のFlashカウンターはページヘッダのカウンターと同じ物です。
■上記Flashカウンターの構成
|
cgiに文字列出力方法を指定してコマンド発行
◆cgiオプション指定
aa.cgi?xx=op0&zz=op1
◆total
Array: [0][0][0][0][0][0]
◆day
Array: [0][0][0]
|
cgiが出力する文字列形式で変数をセット
◆cgi出力
total=123456
or
day=987
|
cgiから送られて来る文字列は可変長であるから後ろ詰め
◆total
Array:
[1][2][3][4][5][6]
or
◆day
Array: [9][8][7]
|
G
I
F
イ
メ
|
ジ
テ
|
ブ
ル
|
9 |
・・・ |
→ |
|
8 |
・・・ |
→ |
|
7 |
・・・ |
→ |
|
6 |
・・・ |
→ |
|
5 |
・・・ |
→ |
|
4 |
・・・ |
→ |
|
3 |
・・・ |
→ |
|
2 |
・・・ |
→ |
|
1 |
・・・ |
→ |
|
0 |
・・・ |
→ |
|
|
[1] |
[2] |
[3] |
[4] |
[5] |
[6] |
|
|
total or day出力指定 |
変数ロード完了イベント待ち
|
文字列を桁毎に分解
|
1桁目 |
2桁目 |
3桁目 |
4桁目 |
5桁目 |
6桁目 |
|
|
子Movie: reqValue
loadVariables(URL)
|
子Movie:getFrameNum
文字列を配列へ変換 |
子Movie:selClmImg
gotoAndStop(桁毎のindex値)
|
|
|
cgiを起動:↑
|
子Movieで「桁制御」に進める:→
|
↑↓ |
↑↓ |
↑↓ |
↑↓ |
↑↓ |
↑↓ |
|
親Movie |
変数初期化後停止
|
子Movieの文字列処理の完了待ち |
桁処理後、次の桁へコマ送り |
停止 |
親フレームNo. |
1
|
2 |
3 |
4 |
5 |
6 |
7 |
時間軸→t |
◆親フレームに配置するMovieClip
main MovieClip |
reqValue |
getFrameNum |
selClmImg |
変数初期化のみ実行
変数は_parent.**で参照する。
|
SWFが初期化され、親フレームが動作を開始するとコマンドがcgiへ送られる。 |
親フレームに配置した「reqValue」を右クリックして表示されるメニューのアクションにイベントハンドラを書く。cgiから「total=123456」と文字列を受け取ったら、イベントハンドラで文字列処理をし親フレームの配列に保存する。 |
フレーム1にスクリプトを書いてある。MovieClipが再生されると親フレームのclm[桁インデックス]を順次参照してイメージを表示する。「数字0」のイメージを表示させるにはframe=2にジャンプさせる。
桁数分配置する。
|
var count;
var id = 0;
var frm = 1;
var dispClms = 5;
clm = new Array(dispClms+1);
:
:
Stop();
|
loadVariables(
"http://myhomepage.com/aa.cgi?mode=op1",
this,"post");
|
onClipEvent(data){
_parent.count = this.total;
len = _parent.count.length;
:
:
_parent.clm[0] =1;
_parent.clm[1] =2;
_parent.clm[2] =3;
_parent.clm[3] =4;
_parent.clm[4] =5;
_parent.clm[5] =6;
//action end;
_parent.frm++;
_parent.nextFrame(_parent.frm);
} |
this.gotoAndStop(_parent.clm[_parent.id++]+2);
if(_parent.id>_parent.dispClms){
:
:
_parent.stop();
}else{
_parent.frm++;
_parent.gotoAndStop(_parent.frm);
}
|
CGIに限らずASP、PHP等のサーバーサイドスクリプトも同じ手法で作成出来る筈です。
※実装の詳細はHow-to本を参照下さい。プログラムのソースは公開していません。
参考書籍:ActionScript+CGIプログラミング[ソフトバンクパブリッシング社]にも作成方法の記述があります。参考にしてください。
■HTMLからFLASH-ActionScriptの内部変数を指定する
最終目的がフレームアニメーションの実装ではなくどちらかと言えば「Java仮想マシン」の代替だからHTMLからFLASHのAction
Scriptへパラメータ渡しでムービークリップ全体を制御したかった。1つのSWFファイルだけで汎用的に使用出来ないと不具合が
発見された時、SWFファイルの修正作業が面倒になってしまう。「Java仮想マシン」の代替として使用するかどうかはこれらがクリ
ア出来るかであった。
<OBJECT
WIDTH="xx" HEIGHT="xx" classid="d27cdb6e-ae6d-11cf-96b8-444553540000" ・・・>
<PARAM NAME=movie VALUE="movie.swf">
<PARAM NAME=quality VALUE=high>
<PARAM NAME=bgcolor VALUE=#000000>
<PARAM NAME=FlashVars
VALUE="name1=op1&name2=op2&・・・">
<EMBED src="movie.swf"
FlashVars="name1=op1&name2=op2&・・・"
・・・></EMBED>
</OBJECT>
|
Macromedia社のWeb上でFLASHアプリケーションノートを探し、APPLETのパラメータ記述と同様の手法で、左記の様にすることで1ファイルで汎用性を持たせることが出来た。凝ったアプリケーションを作成しないのであればFLASH-ActionScriptで代替することは可能となった。変数は「&」を除いた形式、つまりSWFが初期化される時にActionScript内部変数としてそのままname1=op1、name2=op2とセットされるから都合が良い。
|
■フェードイン/フェードアウトアニメーション
|
<OBJECT
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0"
WIDTH="350" HEIGHT="235" id="movie"
ALIGN="">
<PARAM NAME=movie VALUE="movie.swf">
<PARAM NAME=quality
VALUE=high>
<PARAM NAME=bgcolor
VALUE=#000000>
<PARAM NAME=menu
VALUE=false>
<PARAM NAME=scale VALUE=noscale>
<PARAM NAME=FlashVars
VALUE="pushswf=demo&repeat=3&intervl=1000&timeout=10000&autorun=yes&looping=yes&finout=yes">
<EMBED src="movie.swf" FlashVars="pushswf=demo&repeat=3&intervl=1000&timeout=10000&autorun=yes&looping=yes&finout=yes"
menu="false" scale="noscale" quality=high bgcolor=#000000
WIDTH="350" HEIGHT="235" NAME="movie"
ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>
</OBJECT>
|
MovieClipの割り当て 抜粋SAMPLE
timeupId = setInterval(s1,intv1);
alphaCntIntvId = setInterval(s2,intv2);
var loadingStatus:Object = new Object();
var imgLoader:MovieClipLoader = new
MovieClipLoader();
//最大ロードイメージ数8枚
for(i=0;i<8;i++){
imgLoader.addListener(loadingStatus);
:
}
//MovieClipをプログラムで配置
for(j=0;;j++){
this.attachMovie(name1,name2,deepth++);
name2._alpha = 0;
if(j ==
repeat){
//html指定のロード終了数検出
break;
}
}
stop();
MovieClipImgLoader 抜粋SAMPLE _root.imgLoader.loadClip(_root.imgURL+pushswf,this);
stop();
|
ActionScriptでアルファー値制御によるフェードイン/フェードアウトアニメーション
表示インターバル:1秒、表示イメージ:4枚、イメージロードタイムアウト:10秒、アルファー値は4ステップ変化。
タイムアウトでローディングを停止させるとダイアルアップ接続条件で問題が生じる。ActionScriptのステータスチェックタイマーは10mSではなく100mSという大き目にしてある。このインターバルでMovieClipのdeepthアルファー値制御も含め全て行う。
親フレームに空のムービークリップをプログラムで配置し、それに階層を付けてjpegイメージをロードして行く。
メソッドは親フレームのフレーム1に全て書いてある。ActionScriptの記述はインターバルタイマーを割り込みに使用した機器組込み用ファームウエア的にした。こちらのコーディング方法に慣れているので。FlashPlayer6以前ではjpegイメージのロードしたバイト数はActionScriptで検出出来るが、ロードするイメージの全バイト数が一体幾つなのかが求められないのは不都合。SWF内部に全バイト数値を持つのもHTMLのパラメータで指定するのも意図に合わないからローディングパーセント表示はしない。だからMovieClipLoaderクラスが使用出来るFlashPlayer7以上での再生を必修条件にした。
|
MovieClipLoadStatus 抜粋SAMPLE
loadingStatus.onLoadInit =
function(name2:MovieClip){
isImgLoadComplete();
}
loadingStatus.onLoadErr =
function(name2:MovieClip,errCode:String){
loadingError();
}
function isImgLoadComplete(){
:
name2._alpha = 100;
startMovie();
}
|
■ActionScriptの実装
JavaAppletを使用するよりはFlashで実装した方がページの表現力を高く出来る点では有利。フレームアニメーションにしてしまうとSWFファイル
の再利用が出来ない。もし、ActionScriptを使用すれば汎用的に使える物が出来るのならば、その方が後々都合が良い。
本サイトのwebページに実装したActionScript |
機能 |
Script仕様 |
備考 |
ページ・アクセスカウンター |
Microsoft-JVM廃止、HTML4.01でAPPLETタグが廃止になったからFlashのActionScriptで機能代替。イメージ表示形式はアプレット・カウンターと同じにしてある。カウント値のイメージ表示のみを行い、カウント仕様変更はCGIスクリプト側で行う。レンタルサーバー/プロバイダー側ではアクセスカウンターを用意してあることが多く自作する必要性はない。 |
カウンター本体は
CGIプログラム |
アルファー値制御アニメーション |
アルファー値の変化が少ないのでフェードイン/フェードアウトが少し荒い。もう少し細かく出来るがやり過ぎはCPUに負担が掛かる。アニメーションは該当するMovieClipの_levelかdeepthに対してアフファー値を透明〜不透明とすることで行う。 |
|
Flash・イメージローダー |
<IMG>タグを使用せず、Scriptで画像をロードする。
ページに貼り付けてあるイメージの不用意なドラッグ&ドロップはサポートしない。対応させる場合はActionScriptの記述にて管理をする。 |
イメージローダーと言う素材として利用。 |
Home
目次| 更新情報
編集後記|
Article| Link| 壁紙Sample| Guest
Music| 撮影テーマ| My写真| 海釣り| 釣行メモ| 40cmOverへの道
|