flashこんにちは。カヤック自転車部盛り上げ担当でおなじみのaragaです。自転車好きの方は是非一緒にヤビツ峠を登りましょう今回は、いつか公開しようと2年間暖め続けていた、携帯サービスのFlashLite動的生成についてお話しします。携帯サービスのFlash合成技術は、スマートフォンブームの普及により、この先の寿命は長くない技術かもしれません。モバゲーやGREEのガラケーソーシャルゲームの人気により現在進行形では最も熱い分野とも言えます。今回はPHPライブラリの公開と、動的生成でできることの紹介をさせていただきます。携帯コンテンツのFlashで技術的に諦めて困っている人がいたら、少しでも参考になれば幸いです。その前に、全ての機能を説明する為に、今回サンプルとして使用したサービスを簡単に紹介させてください。位置情報を使って道ばたに落ちているアイテムをバキュームで吸い込んだり、といった様々のコンテンツを全て可愛いペット「コンチ」と一緒に楽しむことができる超おススメの携帯ゲームです。このゲームの大きなウリの1つに「うごき」があります。ユーザーは50以上の「うごき」の中から好きなパターンから選んで最大4つの動きを組み合わせることができます。うごきの動的生成は、モーションパーツのFlashのタイムラインを、ベースのFlashのタイムラインにコピーすることで実現させています。サバイバルゲームタウン(サービス終了)広いフィールドを移動し、銃で狙撃し合うFPS+RTSのような携帯ゲームで、コアなユーザー様には大変な評価いただきましたが、諸事情によりサービスは終了いたしました。フィールドマップでは広いフィールドの中から常にプレイヤー周囲10x10のフィールドが見える状態で背景が変化していたのが特徴でした。このゲームのフィールド画面では、MovieClipや画像の入れ替えはせずにテキストデータの入れ替えのみで様々なマップを生成していますボーリングパラダイス(モバゲータウンにて公開中)ボウリングゲームでありながら、ピンをコレクションしたり、絶対に前を向かない後ろ向きのアバターを着せかえることができるゲームです。現在モバゲータウンにて公開されています。このゲームのマイページで使われているFlashでは透過PNG、MovieClipの入れ替えを行っています。FlashLite動的生成のツールFlashの動的生成をするには用途に合わせて下記のようなツールを使います。xmlの双方向変換が可能なツールです。xmlを編集しswfを生成するということが可能なため、swfのフォーマットを理解しXMLを操作できる技術者であればどんなものでも作ることができます。swfをxmlに変換するためデータサイズが大きくなることやswfコマンドをたたく必要があるため負荷が高めになります。SWFEditorphp拡張としてCで書かれているため非常に高速です。phpでswfに画像を埋め込むなら圧倒的に早いです(当社比)。様々な用途ひ合わせてカスタマイズをするにはややハードルが高い気がします。MingPHPのPECLモジュールとして提供されています。SWFに単純にswfを足し算するだけなら効果的な気がしますが、ドキュメントが充実していないので使い方がよくわかりません。純粋にswfを足し算するならswftoolsもおすすめですバイナリを直接いじるバイナリを直接操作するのも、状況によっては非常に効果的です。swfはフォーマットが公開されているので、バイナリ操作になれてしまえば簡単に扱うことができます弊社の携帯チームでは、swfmillをつかった方法とバイナリを直接操作する方法を主に利用しています。バイナリを直接いじる手法を採用するようになりました。SWFフォーマットについてswfの動的生成について詳細を解説してもよいのですが、GREEのyoyaさんの記事よりわかりやすく解説する自信はないので、今回は参考の記事の紹介までとさせていただきます。BlogGREEさんの記事です。AdobeAdobeが公開しているSWFフォーマットです。バイナリ操作に慣れてしまえばこれさえあれば十分です。SWFフォーマット日本語訳いつもありがとうございますもし、とっても気になるようでしたら、僕に個人的に質問してください。マニアックで楽しいひとときを一緒に過ごしましょう。FlashLiteの動的生成をしてみよう先に上げたような弊社サービスで利用しているPHPライブラリを公開します。Media_SWFバイナリを直接いじるためのライブラリです。(IO_Bitが無いと本当にめんどくさいです。このシリーズにもし続きがあったらその時に詳細の説明をさせていただくかもしれません。ちなみに公開したコードにはコメントなどはほとんどありませんし、大変お恥ずかしい部分も大量に残っています。コードを整理してから公開すると言い続けて早2年が経過してしまったので諦めました。ご勘弁くださいまた、次から上げていく機能については、両方に実装されているものもありますが、より高速なバイナリ版を優先して、バイナリ版で実装しているものはMedia_SWFで、swfmill版でしか実装していないものはswfmillを使ってサンプルを書いていますなお、実運用上はサンプルコードのままではなく、適宜MemcacheやAPCを用いて中間データをキャッシュしています。ActionScript変数を入れ替えるURLや台詞、不正防止のトークン、ゲームのパラメータ等を埋め込むために最もよく使います。サバイバルゲームタウンを例にしたサンプルを作成しましたJPEG画像を入れ替えるユーザーが投稿した画像とFlashを合成する場合などに使います。$editor->build();GIF画像を入れ替える使い方はJPEGとほとんど変わりません。$image->getTag($bitmap_id));MovieClipを入れ替えるMC及びその子のMCとShapeを再帰的に入れ替えます。MCとPNGを入れ替えるボーリングパラダイスの例を作成しましたMovieClipの持つShapeの塗り色を変更する最近はMovieClipで統一することが多いので、あまり使っていませんが、気軽にアイテムを増やすには色を変更するだけが一番お手頃です。$swfmill_editor->getSwfBinary();モーションを入れ替えるタイムライン上のモーションを入れ替えます。モーション素材の作り方には独自のルールをもうけています。コンチを例にしたサンプルを上げていますMedia_SWFシリーズはparse()とloadCharacterMap()は負荷が高いので実運用時は、必ず、serialize()したデータをキャッシュしてください。最初にも書きましたが、もし評判がよければ、次回以降「Flashデベロッパーとサーバーサイドエンジニアとのお約束ごと編」や「マップ生成のFlashLite実装編」「モーション入れ替え解説編」等を書いてみようかと思います。あ、カヤックではいつでもエンジニアを募集しています!すぐ近くの警察署の裏に防犯カメラ&屋根付きの私営の駐輪場があるので、自転車通勤でも安心です。swfmillのインストールいつも新しくておもしろい事を考えているムカイです。(1)月別アーカイブ検索スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。