SWFAction
(No version information available, might be only in CVS)
SWFAction — SWFAction クラス
説明
スクリプトの文法は C 言語をもとにしていますが、多くの機能が 省略されています - SWF バイトコードマシンは、より単純であることを 志向しています。例えば、相当手の込んだ細工をしなければ、関数のコールを 実装することもできません。なぜなら、バイトコードの jump 命令は ハードコードされたオフセット値を使用しているからです。 呼び出し元のアドレスをスタックに格納したりはしません - すべての関数は、戻ってくる場所を正確に知っている必要があるのです。
結局、どんな機能が残っているのでしょう? コンパイラが理解できるトークンは 以下のとおりです。
- break
- for
- continue
- if
- else
- do
- while
データ型は存在しません。SWF アクションマシンにおいては、すべての値は 文字列として扱われます。以下の関数が使用可能です。
- time()
- ムービーが開始してからの経過時間を、ミリ秒 (?) で返します。
- random(seed)
- 0 から seed までの範囲の擬似乱数を返します。
- length(expr)
- 指定した式の長さを返します。
- int(number)
- 指定した数値を、一番近い整数に切り下げた値を返します。
- concat(expr, expr)
- 指定した式を連結して返します。
- ord(expr)
- 指定した文字の ASCII コードを返します。
- chr(num)
- 指定した ASCII コードに対応する文字を返します。
- substr(string, location, length)
- 指定した文字列 string の、 位置 location から始まる 長さ length の部分文字列を返します。
さらに、以下のコマンドも使用できるでしょう。
- duplicateClip(clip, name, depth)
- 指定したムービークリップ (またの名をスプライト) clip を複製します。 新しいムービークリップの名前は name で、 深度は depth となります。
- removeClip(expr)
- 指定したムービークリップを削除します。
- trace(expr)
- 指定した式をトレースログに書き込みます。ブラウザのプラグインが これをきちんと扱ってくれるかは疑わしいものです。
- startDrag(target, lock, [left, top, right, bottom])
- ムービークリップ target のドラッグを開始します。 引数 lock で、マウスをロックするかどうか (?) を指定します - 0 (FALSE) あるいは 1 (TRUE) を指定します。 オプションのパラメータでは、ドラッグする範囲のを指定します。
- stopDrag()
- つかれきった心を落ち着かせます。そしてムービークリップの ドラッグも修了させます。
- callFrame(expr)
- 指定したフレームを関数としてコールします。
- getURL(url, target, [method])
- 指定した URL を読み込みます。引数 target は、 (たとえば "_top" や "_blank" のような) HTML ドキュメントの target に対応します。オプションの引数 method は、 サーバに変数を返したい場合に POST あるいは GET を指定します。
- loadMovie(url, target)
- 指定した URL を読み込みます。引数 target は、 (おそらく) フレームの名前か あるいは特別な値 "_level0" (現在のムービーを置き換える) 、 "_level1" (現在のムービーの前面に新しいムービーを表示する) のうちのいずれかです。
- nextFrame()
- 次のフレームに移動します。
- prevFrame()
- 直前の (あるいは一つ前の) フレームに移動します。
- play()
- ムービーの再生を開始します。
- stop()
- ムービーの再生を停止します。
- toggleQuality()
- 高品質/低品質を切り替えます。
- stopSounds()
- 音声の再生を停止します。
- gotoFrame(num)
- フレーム番号 num に移動します。 フレーム番号は 0 からはじまります。
- gotoFrame(name)
- name という名前のフレームに移動します。 これは便利です。というのもまだフレームのラベルを追加していないからです。
- setTarget(expr)
- アクションのコンテキストといわれるものを設定します。 これが何をするものなのかは実際のところよくわかりません。
ムービークリップ (さぁみなさんご一緒に - またの名をスプライト) はプロパティをひじしています。すべてのプロパティが読み込み可能で、 そのうちのいくつかには値を設定することも可能です。プロパティの 一覧は以下のとおりです。
- x
- y
- xScale
- yScale
- currentFrame - (読み込み専用)
- totalFrames - (読み込み専用)
- alpha - 透明度
- visible - 1=on, 0=off (?)
- width - (読み込み専用)
- height - (読み込み専用)
- rotation
- target - (読み込み専用) (???)
- framesLoaded - (読み込み専用)
- name
- dropTarget - (読み込み専用) (???)
- url - (読み込み専用) (???)
- highQuality - 1=high, 0=low (?)
- focusRect - (???)
- soundBufTime - (???)
クラスのメンバ
例
この単純な例は、赤い四角形がウィンドウを横切るものです。
Example#1 swfaction() の例
<?php
$s = new SWFShape();
$f = $s->addFill(0xff, 0, 0);
$s->setRightFill($f);
$s->movePenTo(-500, -500);
$s->drawLineTo(500, -500);
$s->drawLineTo(500, 500);
$s->drawLineTo(-500, 500);
$s->drawLineTo(-500, -500);
$p = new SWFSprite();
$i = $p->add($s);
$i->setDepth(1);
$p->nextFrame();
for ($n=0; $n<5; ++$n) {
$i->rotate(-15);
$p->nextFrame();
}
$m = new SWFMovie();
$m->setBackground(0xff, 0xff, 0xff);
$m->setDimension(6000, 4000);
$i = $m->add($p);
$i->setDepth(1);
$i->moveTo(-500,2000);
$i->setName("box");
$m->add(new SWFAction("/box.x += 3;"));
$m->nextFrame();
$m->add(new SWFAction("gotoFrame(0); play();"));
$m->nextFrame();
header('Content-type: application/x-shockwave-flash');
$m->output();
?>
この単純な例は、画面上のマウスを追いかけます。
Example#2 swfaction() の例
<?php
$m = new SWFMovie();
$m->setRate(36.0);
$m->setDimension(1200, 800);
$m->setBackground(0, 0, 0);
/* マウスを追いかけるスプライト - 空ですが、マウスを追いかけるために
その x 座標と y 座標を取得することが可能です */
$i = $m->add(new SWFSprite());
$i->setName('mouse');
$m->add(new SWFAction("
startDrag('/mouse', 1); /* '1' は、スプライトをマウスにロックします */
"));
/* これらは単なる四角形なので、アンチエイリアスを off にしたほうがよいでしょう */
$m->add(new SWFAction("
this.quality = 0;
"));
/* 変形ボックス */
$r = new SWFMorph();
$s = $r->getShape1();
/* これは通常の図形から背景よりになることに注意しましょう。なぜかはわかりません */
$s->setLeftFill($s->addFill(0xff, 0xff, 0xff));
$s->movePenTo(-40, -40);
$s->drawLine(80, 0);
$s->drawLine(0, 80);
$s->drawLine(-80, 0);
$s->drawLine(0, -80);
$s = $r->getShape2();
$s->setLeftFill($s->addFill(0x00, 0x00, 0x00));
$s->movePenTo(-1, -1);
$s->drawLine(2, 0);
$s->drawLine(0, 2);
$s->drawLine(-2, 0);
$s->drawLine(0, -2);
/* 変形ボックスのためのスプライトコンテナ
これは、単にボックスを変形させる際の時間軸にすぎません */
$box = new SWFSprite();
$box->add(new SWFAction("
stop();
"));
$i = $box->add($r);
for ($n=0; $n<=20; ++$n) {
$i->setRatio($n/20);
$box->nextFrame();
}
/* このスプライトにより、同じアクションコードを何度も実行させることが可能となります */
$cell = new SWFSprite();
$i = $cell->add($box);
$i->setName('box');
$cell->add(new SWFAction("
setTarget('box');
/* ...x は、親の x 座標を意味します。すなわち (..).x ということです */
dx = (/mouse.x + random(6)-3 - ...x)/5;
dy = (/mouse.y + random(6)-3 - ...y)/5;
gotoFrame(int(dx*dx + dy*dy));
"));
$cell->nextFrame();
$cell->add(new SWFAction("
gotoFrame(0);
play();
"));
$cell->nextFrame();
/* 最後に、セルをムービーに追加します */
for ($x=0; $x<12; ++$x) {
for ($y=0; $y<8; ++$y) {
$i = $m->add($cell);
$i->moveTo(100*$x+50, 100*$y+50);
}
}
$m->nextFrame();
$m->add(new SWFAction("
gotoFrame(1);
play();
"));
header('Content-type: application/x-shockwave-flash');
$m->output();
?>
上と同じですが、きれいな色のボールを使用します...
Example#3 swfaction() の例
<?php
$m = new SWFMovie();
$m->setDimension(11000, 8000);
$m->setBackground(0x00, 0x00, 0x00);
$m->add(new SWFAction("
this.quality = 0;
/frames.visible = 0;
startDrag('/mouse', 1);
"));
// マウスを追いかけるスプライト
$t = new SWFSprite();
$i = $m->add($t);
$i->setName('mouse');
$g = new SWFGradient();
$g->addEntry(0, 0xff, 0xff, 0xff, 0xff);
$g->addEntry(0.1, 0xff, 0xff, 0xff, 0xff);
$g->addEntry(0.5, 0xff, 0xff, 0xff, 0x5f);
$g->addEntry(1.0, 0xff, 0xff, 0xff, 0);
// gradient を指定した図形
$s = new SWFShape();
$f = $s->addFill($g, SWFFILL_RADIAL_GRADIENT);
$f->scaleTo(0.03);
$s->setRightFill($f);
$s->movePenTo(-600, -600);
$s->drawLine(1200, 0);
$s->drawLine(0, 1200);
$s->drawLine(-1200, 0);
$s->drawLine(0, -1200);
// 複数の色を使用するため、スプライトにする必要があります
$p = new SWFSprite();
$p->add($s);
$p->nextFrame();
// 図形をここに入れ、各フレームで別の色を使用します
$q = new SWFSprite();
$q->add(new SWFAction("gotoFrame(random(7)+1); stop();"));
$i = $q->add($p);
$i->multColor(1.0, 1.0, 1.0);
$q->nextFrame();
$i->multColor(1.0, 0.5, 0.5);
$q->nextFrame();
$i->multColor(1.0, 0.75, 0.5);
$q->nextFrame();
$i->multColor(1.0, 1.0, 0.5);
$q->nextFrame();
$i->multColor(0.5, 1.0, 0.5);
$q->nextFrame();
$i->multColor(0.5, 0.5, 1.0);
$q->nextFrame();
$i->multColor(1.0, 0.5, 1.0);
$q->nextFrame();
// 最後に、アクションコードにこれを含めます
$p = new SWFSprite();
$i = $p->add($q);
$i->setName('frames');
$p->add(new SWFAction("
dx = (/:mousex-/:lastx)/3 + random(10)-5;
dy = (/:mousey-/:lasty)/3;
x = /:mousex;
y = /:mousey;
alpha = 100;
"));
$p->nextFrame();
$p->add(new SWFAction("
this.x = x;
this.y = y;
this.alpha = alpha;
x += dx;
y += dy;
dy += 3;
alpha -= 8;
"));
$p->nextFrame();
$p->add(new SWFAction("prevFrame(); play();"));
$p->nextFrame();
$i = $m->add($p);
$i->setName('frames');
$m->nextFrame();
$m->add(new SWFAction("
lastx = mousex;
lasty = mousey;
mousex = /mouse.x;
mousey = /mouse.y;
++num;
if (num == 11)
num = 1;
removeClip('char' & num);
duplicateClip(/frames, 'char' & num, num);
"));
$m->nextFrame();
$m->add(new SWFAction("prevFrame(); play();"));
header('Content-type: application/x-shockwave-flash');
$m->output();
?>