PHP - Ming

HOME

■ 概要

ウェブサイトをダイナミックで華やかに飾るflashムービーがあるのは有名です。

Mingと呼ばれるライブラリを使えばPHPからでもこのflashムービーを作成することができます。

xamppliteを入れたらMingも付属してたのでこれを使っていろいろ遊んでみたいと思います。



と、その前にflashについての簡単なことをまとめておきます。

flash5からActionScriptが使えるようになってゲームが作れるようになったらしいです。
flashの構造は、土台となるSWFMovieオブジェクトを作成して、その上にいろんな部品オブジェクトを貼り付けていくようなイメージです。

例えて言うなら、土台となる自動車に荷台を貼り付けてトラックにしたり、クレーンを貼り付けてクレーン車にしたり、ハシゴを乗っけてハシゴ車にしたりするイメージです。



SWFMovieはその名のとおり、ムービー的に表示させるためのタイムラインを持っています。
なので、SWFMovieに貼り付いてるオブジェクト全体をフレーム単位で刻々と変化させていくことができるということです。

SWFMovieと似ているSWFSprite(ムービークリップとも呼ばれる)は、これ自体がムービーで、独自のタイムラインを持っています。

単純に図形や画像、文字といったものを表示させるだけならflashの必要性があまりないので、flashとして作るからには貼り付けたオブジェクトをフレームごとにいろいろ動かしたり、操作に応じて変化していくものを作ることになると思います。



flashにはActionScriptと呼ばれるコンパクトなプログラム(スクリプト)を含ませることができます。

ActionScriptは、ブラウザでのなんらかのアクション(操作)に応じて行いたい処理を記述しておくためのスクリプトになります。
つまり、単にムービー的な表示以外にゲームのようなインタラクティブな操作をさせたい場合には必須ということになります。


■ すべてのSWFムービーの土台となるSWFMovie



▽ 土台となるムービーを作成してファイル保存する

実行スクリプト [index.php]

index.phpにアクセスした結果、同じディレクトリ内に"ming01.swf"が作成されていることを確認しましょう。

このファイルをブラウザで見てみます(ドラッグ&ドロップ)。
ちゃんと真っ白い画面が表示されたと思います。
ホントに表示できてるかわかりづらいので、右クリックしてみるとswfファイル独特のプロパティが表示されると思います。



表示結果







▽ 土台のサイズと背景色を指定する

実行スクリプト [index.php]

作成された"ming02.swf"を確認してみます。色変わったっしょ



表示結果







▽ 作成してそのまま表示させる

実行スクリプト [index.php]

前回まではムービー作成したら保存していました。

今回は作成したムービーを保存せずにそのまま表示させています。
作成したムービーの確認作業の手間を省く為、今後はこちらの方法で作っていきます。


■ 図形を描画するSWFShape



▽ まずは1本線を引いてみる

実行スクリプト [index.php]

movePen()なら相対位置への移動、drawLine()なら相対位置へ線を引くということもできます。

作成した図形は、SWFムービーのadd()メソッドを使って貼り付けます。



表示結果







▽ 図形内部を塗りつぶす

実行スクリプト [index.php]

今度は描画した図形を塗りつぶしています。

塗りつぶしの色はaddFill()メソッドを使ってオブジェクトとして作成し、それをsetRightFill()やsetLeftFill()メソッドに渡す形で塗りつぶします。
右回りに描画された図形はsetRightFill()を使い、左回り描画ならsetLeftFill()メソッドを使って指定します。



表示結果






■ 文字を描くSWFText


文字を描く場合は、まず先にSWFFontを使って使用するフォントオブジェクトを作成する必要があります。

使用できるフォントは、拡張子".fdb"になっている形式のものを使う必要があるので、事前に用意しておきましょう。(「フォント fdb」で検索すれば見つかると思います)

わたしは『みかちゃんフォント』をfdb形式に変換済みの配布サイトからいただきました。

実行スクリプト [index.php]

使用フォントはSWFFontクラスを使ってフォントオブジェクトにしておきます。
文字オブジェクトのsetFont()メソッドを使って登録する形です。

fdbのパス指定はrealpath()関数を使ってフルパスで渡しています。もし認識できなければCドライブ直下などの浅い階層に置いたりすればイケると思います。

文字コードは必ずUTF−8を使うことになります。



表示結果






■ 画像ファイルを土台に貼り付けるSWFBitmap


SWFBitmapというクラス名ではありますが、"jpeg", "gif", "png"といった画像形式に対応しています。

少し前に行った図形塗りつぶしの場合は塗りつぶしの色をオブジェクトにして枠内を塗りつぶすメソッドに渡しましたが、
今回は画像で塗りつぶすように画像オブジェクトを作成して枠内を塗りつぶすメソッドに渡します。


▽ 画像で枠内を塗りつぶす

実行スクリプト [index.php]


表示結果




これで画像を枠内に貼り付けることができました。

ただ、枠のサイズよりも画像が大きいので入りきれませんでした。
というわけで次に枠の塗りつぶしパターンを変える方法を試みます。







▽ 画像で枠内を塗りつぶすパターンを変える

塗りつぶしオブジェクトを使うと塗りつぶし方をいろいろ変えることができます。

実行スクリプト [index.php]

塗りつぶしオブジェクトのscaleTo()メソッドを使って倍率を変えることで、大きかった画像全体が入るようにできました。
塗りつぶしオブジェクトにはscaleTo()以外にもmoveTo(), rotateTo(), skewXTo(), skewYTo()といった座標や回転、傾きを指定できるメソッドが用意されています。

scaleTo(X方向, Y方向)という指定もでき、Y方向省略ならX方向に指定した倍率と同じ扱いになります。

今のところよくわからないんですが、指定枠サイズと画像サイズが同じときにscaleTo(20.0)指定で等倍になるような感じです。なので枠の2倍サイズの画像をちょうどぴったり当てはめるにはscaleTo(10.0)で指定することになると思います。

この他にも、addFill()メソッドの第二引数省略時は定数「SWFFILL_TILED_BITMAP」指定扱いになり画像が枠より小さい場合にタイル貼りのように敷き詰めて塗りつぶされますが、定数「SWFFILL_CLIPPED_BITMAP」を指定すればこの塗りつぶしを解除できます。



表示結果




これで、枠線の中を画像で塗りつぶすことができました。




■ 土台に貼り付けたオブジェクトを動かす

これまでいろいろなタイプのオブジェクトを土台(SWFMovieオブジェクト)に貼り付けてきました。
ただ貼り付けただけなので、図形や文字といったオブジェクトは静止したまま微動だにしませんでした。

貼り付ける時にadd()メソッドを使っていましたが、このメソッドは返り値としてSWFDisplayItemオブジェクトを返すようになっています。

この返ってきたSWFDisplayItemオブジェクトには、move()やrotate()といった動きを与えられるメソッドを指定できるのでこれを使って、貼り付けたオブジェクトを動かしてみましょう。



▽ SWFDisplayItemを取得して部品を動かす

実行スクリプト [index.php]

1つの静止画を1フレームだとすると、ムービー(動画)はフレームが次々に変わっていくものと考えることができます。

なのでsetRate()メソッドを使って、1秒当たりのフレーム(コマ)数を設定し、nextFrame()でフレームを順送りにすることでムービーを実現しています。



表示結果





この辺からようやくflashを使う意味(醍醐味)が出てくると思います。





▽ SWFSpriteでも動かす

これまで土台にしてきたSWFMovieがあるわけですが、前回はこれだけで動きを与えることをしました。

もう一つSWFMovieと似たようなものにSWFSprite(ムービークリップとも呼ばれる)というクラスがあり、これもまた貼り付けたオブジェクトに動きを与えることができるようになっています。

スプライトと言えば日本ではおいしい飲み物の意味ですが、アメリカ近辺ではどうやらコンピュータ用語で『表示画面のイメージパターン』という意味らしいです。


SWFSpriteに貼り付けたオブジェクトを動かして、更に
土台(SWFMovie)に貼り付けたSWFSpriteオブジェクトを動かせば二重の動きを与えることになります。

これができれば複雑な動きでも比較的簡単に作り出すことができそうです。


実行スクリプト [index.php]

ランダムな四角形を作成してSWFSpriteに貼り付けるまではいくつ作ろうとも同じ作業になるので関数化しました。



表示結果




どうでしょう。これだけ複雑な動きをごく少ないコードで作成できました。


■ ボタンを作成するSWFButton

今度は土台にボタンを追加して、押された時の挙動を指定する方法です。

挙動を指定するので、当然ActionScriptの出番となります。

ボタン上に貼り付けられるのは図形オブジェクトだけなので図形を描画するか、図形で描いた枠内を画像で塗りつぶしたものになります。



実行スクリプト [index.php]

ボタン塗りつぶし用に今回初めてSWFGradientクラスを使ってグラデーションを描いてみました。
このグラデーションはデフォルトの「SWFFILL_LINEAR_GRADIENT」の他に「SWFFILL_RADIAL_GRADIENT」指定が使えるので2種類のグラデーションを使うことができます。
あとは単色(クリックやマウスオーバー時に色を変えるもの)と画像での塗りつぶしを使っています。


いろんなボタンを作るため、属性をちょいちょい変えていってそれを保持できるようにボタン作成部分はクラス化しています。

btn::make()の第二引数に書いたgetURL()がActionScriptのコードになります。これを記述したボタンをクリックすると指定URLへ飛べるようになります。

ちょっとコード量が増えてしまいましたが、ボタン表面の塗りつぶし方、ActionScriptを使ってボタンに動きを付けるやり方はこんな感じでできました。

ここで一つ大事なことがあります。
ボタン表面の塗りつぶしや背景などに使用する画像で同じものを共有する場合に、使用する度にオブジェクトを作成(new SWFBitmap)してしまうと、その度に画像が取り込まれることになるので最終的なswfファイル容量が膨れ上がってしまいます。
再利用する画像は外にくくり出して1度のオブジェクト作成で済ませるようにしましょう。



表示結果




表示はこんな感じになりました。
「Google」「Yahoo!」「goo」の3つのボタンだけActionScriptでそのサイトが開くように記述しています。

ボタン18個を作成しましたが、これでswfファイル容量は24.3KBに収めることができました。
画像ボタンを個々に18個用意するよりもコンパクトだと思います。flash恐るべしですね。


2010(C)Mingw