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 のネタにもできます。
今後利用できる場面では、積極的に両並行開発を行なっていきたいと思います。


