今更ですが文字通り、swfで作ったコンテンツをHTML5 Canvasに書き出すお勉強です。
Flash Professional CCでは「コマンド」>「AS3 ドキュメント形式から HTML5 Canvas に変換」でCanvas用のファイルに変換できます。基本的なことはこちらから。
・Flash Professional CC:今すぐ試してほしい! 新しいHTML5書き出しADC Plus
これは前から知ってるわけですが、「じゃあJS部分はどう書くか?」ってざっとググっても変換用サンプルに書かれているJSはたいていルートでの「gotoAndPlay」レベル。で、もうちょっと実際に使う形でASに書いたものをどう書き換えればいいのか?というのを少しずつまとめていきます。
とりあえず簡単なサンプルで、win_mcというMovieClip(グレーの部分)にbtn(白の部分)というMovieClipが入っている。win_mcは10フレームで、btnをクリックすると1コマずつ切り替わるというもの。swfサンプルはこちら。
で、ASはこんな感じ。ルートのタイムラインに書いています。JSに変換する前提なので、型指定はしていません。
win_mc.gotoAndStop(1); win_mc.btn.buttonMode = true; win_mc.btn.addEventListener(MouseEvent.CLICK,onClickBtn); function onClickBtn(event){ var target = event.currentTarget; var num_max = target.parent.totalFrames; var num_current = target.parent.currentFrame; var num_next = (num_current + 1) > num_max ? 1 : (num_current + 1); target.parent.gotoAndStop(num_next); }
で、これをCanvasで書き出すために、JavaScriptで書き直したものが下記です。こちらも同じくFlash CCのルートのタイムラインに書いています。Canvasでパブリッシュしたサンプルはこちら。
//インスタンスへのMouseOver関連イベントはコレが必須。 stage.enableMouseOver(); this.win_mc.gotoAndStop(0); this.win_mc.btn.cursor = "pointer"; //win_mc.btn.buttonMode = true; this.win_mc.btn.addEventListener("click",onClickBtn); function onClickBtn(event){ var target = event.currentTarget; //var num_max = target.parent.totalFrames; var num_max = target.parent.timeline.duration; var num_current = target.parent.currentFrame; //var num_next = (num_current + 1) > num_max ? 1 : (num_current + 1); var num_next = (num_current + 1) > (num_max - 1) ? 0 : (num_current + 1); console.log("num_current:"+num_current+"/num_next:"+num_next+"/num_max:"+num_max); target.parent.gotoAndStop(num_next); }
JavaScriptの方は書き換えた箇所に、元のASをコメントにして残してあるのでわかると思いますが、まとめると違いは下記の通り。
処理 | AS | JavaScript |
カーソル変更 | buttonMode = true | cursor = “pointer” |
総フレーム数取得 | target.parent.totalFrames | target.parent.timeline.duration |
フレームの数え方 | フレームカウントが1から | フレームカウントが0から |
で、ここが落とし穴だったんですけど、予めStage.enableMouseOver()メソッドを呼出しておかないと、マウスポインタとインスタンスの重なりについてのイベントが起こらないということ。これがないとcursor = “pointer”を設定してもカーソルは変わらない。また・・・
this.win_mc.btn.addEventListener("mouseover", mouseOverHandler); this.win_mc.btn.addEventListener("mouseout", mouseOutHandler);
のようなマウスイベントも取れません。
こちらの記事が参考になりました。やはり困ったときは野中さん(笑)。
・F-site | EaselJSでインスタンスにロールオーバーしたとき指差しカーソルにする
ちなみに私の環境のFlash CCでは、下記のバージョンのCreateJSが使われています。
<script src="http://code.createjs.com/easeljs-0.7.1.min.js"></script> <script src="http://code.createjs.com/tweenjs-0.5.1.min.js"></script> <script src="http://code.createjs.com/movieclip-0.7.1.min.js"></script> <script src="test01_html5.js"></script>
パブリッシュしてもローカルにライブラリがないと思ったら、ネット上のライブラリを参照してるんですね。これも今回初めて気づきました。
【追記その1】2015.3.30
野中さんから指摘を受けましたが、総フレーム数を取得する「target.parent.timeline.duration」は、MovieClipが持っている値ではなくて、「target.parent.timeline」でTweenJSのTimelineクラスを参照して、そのプロパティであるdurationを参照している、ということのようです。
・TweenJS v0.6.0 API Documentation : Timeline > Properties > duration
・EaselJS v0.8.0 API Documentation : MovieClip > Properties > timeline
【追記その2】2015.3.30
パブリッシュするときにCreateJSのライブラリをホスト(ネット上のライブラリ)にするか、ローカル書きだしにするかは「パブリッシュ設定」で変更できます。また書き出しに使用されるバージョンは、Flash CC側で固定になっているそうです。こちらも野中さんからご教授いただきました。