Haxe Box2D を利用した html5, Flash 並行開発コンテンツサンプル
制作している Haxe ライブラリの現在までの まとめとしまして、以下のサンプルを作成しました。
http://www.dango-itimi.com/blog/swf/185/
画面上部が html5 canvas、画面下部が Flash コンテンツとなります。html5 canvas 部分はスマートフォンでも動作確認が可能です。(スマートフォンでは音は鳴る設定にはしていませんが、Android では鳴る端末もあるかもしれません。)
■ 操作方法
画面クリック位置にキャラクターが移動します。キャラクターの頭より上のほうをクリックするとジャンプします。キャラクター足元より下のほうをクリックすると特殊床(後述)から降りることができます。
Box2D 特殊床
宙に浮いている長方形の床は特殊な当たり判定をしており、ジャンプして下から突き抜ける事が可能です。また、特殊床に接地している場合、キャラクター足元より下の方をクリックすると床から降りることができます。
今回のサンプルは Box2D の特殊床制作の習作ともなっています。作りの考え方は簡単で、以下の方法を採りました。
・キャラクターの最下部(足元)が特殊床最上部よりも下にある場合
特殊床の当たり判定を消去
・キャラクターの最下部(足元)が特殊床最上部よりも上にある場合
特殊床の当たり判定を復活
並行開発手法
大まかな制作の流れとしましては、Flash To Haxe Converter 説明内 以下の項目をご参考ください。
制作の流れと Flash-To-Haxe-Converter の役割箇所
https://github.com/siratama/Flash-To-Haxe-Converter#-flash-to-haxe-converter-
利用している言語 Haxe にて、html5(CreateJS) と Flash 両者の API の違いの差分を埋めるためには、以下の自作 Haxe ライブラリを利用しています。
dango-itimi haxelib (随時更新)
https://github.com/siratama/haxelib
例えば CreateJS の MovieClip と Flash の MovieClip の動作の違いを埋めるために 以下のクラスを作成しています。
■ CreateJS, Flash 両用 interface IMovieClipUtil
package com.dango_itimi.as3_and_createjs.utils; #if js import createjs.easeljs.MovieClip; #elseif flash import flash.display.MovieClip; #end interface IMovieClipUtil { public var mc(default, null):MovieClip; public function gotoFirstFrame():Void; public function nextFrame():Void; public function prevFrame():Void; public function loopFrame():Void; public function getCurrentFrameBaseCreateJS():Int; }
■ Flash 用 MovieClipUtil
package com.dango_itimi.as3.utils; import com.dango_itimi.as3_and_createjs.utils.IMovieClipUtil; import flash.display.MovieClip; class MovieClipUtil implements IMovieClipUtil{ public var mc(default, null):MovieClip; public function new(mc:MovieClip){ this.mc = mc; } public function gotoFirstFrame(){ mc.gotoAndStop(1); } public function nextFrame(){ mc.nextFrame(); } public function prevFrame(){ mc.prevFrame(); } public function loopFrame(){ if(mc.currentFrame < mc.totalFrames) nextFrame(); else gotoFirstFrame(); } public function getCurrentFrameBaseCreateJS():Int{ return cast mc.currentFrame - 1; } }
■ html5(CreateJS) 用 MovieClipUtil
package com.dango_itimi.createjs.utils; import com.dango_itimi.as3_and_createjs.utils.IMovieClipUtil; import createjs.tweenjs.Timeline; import createjs.easeljs.MovieClip; class MovieClipUtil implements IMovieClipUtil{ public var mc(default, null):MovieClip; public var totalFrames(default, null):Int; public var timeline(default, null):Timeline; public function new(mc:MovieClip){ this.mc = mc; timeline = mc.timeline; totalFrames = timeline.duration - 1; } public function gotoFirstFrame(){ mc.gotoAndStop(0); } public function nextFrame(){ mc.gotoAndStop(timeline.position + 1); } public function prevFrame(){ mc.gotoAndStop(timeline.position - 1); } public function loopFrame(){ if(timeline.position < totalFrames) nextFrame(); else gotoFirstFrame(); } public function getCurrentFrameBaseCreateJS():Int{ return timeline.position; } }
MovieClipUtil クラスのコンストラクタには、Flash To Haxe Converter で生成された extern クラスインスタンスを 代入して利用します。これにより、CreateJS の MovieClip と Flash の MovieClip の違いを意識すること無く、ゲームの核となる処理を 1つのクラスにまとめることができます。
今後
以前、以下のように blog に記述しました。
個人的に Toolkit for CreateJS & Haxe で何か html5 関連の制作を行うかどうかは未定です。 AIR によって、Flash ゲームとモバイル端末(Android, iOS)向けのアプリケーション制作が同時に行えるため、 制作するなら Flash or AIR 優先となりそうです。
しかし、自作 Haxe ライブラリが揃い始めたという事と、実際に今回のサンプルを作ってみて考えを改めました。ほぼ一つのソースコードで html5 canvas と Flash 両コンテンツが動作した時は、ガッツポーズものでありました。難産だからこそやりがいが生まれるというものでしょうか。まだまだ課題も多く、調査内容を blog のネタにもできます。
今後利用できる場面では、積極的に両並行開発を行なっていきたいと思います。