PHP マニュアル
前のページ |  | 次のページ

# SWFAction

(PHP 4 >= 4.0.5)

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)

  アクションのコンテキストといわれるものを設定します。 これが何をするものなのかは実際のところよくわかりません。

そしてもうひとつ変なものがあります。if 文や while ループの中で、 指定したフレーム番号が読み込まれているかどうかを調べるために、 式 frameLoaded(num) が使用可能です。ええ。そのようにいわれています。 しかし私は実際にこれをテストしたことがなく、実際に動作するのか 疑問に思っています。かわりに /:framesLoaded を使用するとよいでしょう。

ムービークリップ (さぁみなさんご一緒に - またの名をスプライト) はプロパティをひじしています。すべてのプロパティが読み込み可能で、 そのうちのいくつかには値を設定することも可能です。プロパティの 一覧は以下のとおりです。

- 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 - (???)

ということで、スプライトの x 位置を指定するには単に `/box.x = 100;` とすればよいわけです。なぜ box の前のスラッシュがあるのでしょう? これは、flash がムービー内のスプライトを Unix ファイルシステム風に 管理しているからです - つまり、この場合 box がトップレベルに存在する ことになります。box という名前のスプライトがその中に biff という名前の スプライトを保持している場合、その x 位置を指定するには /box/biff.x = 100; とします。すくなくとも私はそう思っています。 もし間違っていたら指摘してください。

## クラスのメンバ

### メソッド

SWFAction->__construct()

## 例

この単純な例は、赤い四角形がウィンドウを横切るものです。

例 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();
?>`

この単純な例は、画面上のマウスを追いかけます。

例 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();
?>`

上と同じですが、きれいな色のボールを使用します...

例 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();
?>`

前のページ | ホーム | 次のページ
Flash 用 Ming 関数 | 上に戻る | SWFAction->__construct()