この記事のURL

http://www.dango-itimi.com/blog/archives/2013/001178.html


FLASH tips 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 のネタにもできます。

今後利用できる場面では、積極的に両並行開発を行なっていきたいと思います。

[ FLASH ] [ tips ] 投稿者 siratama : 2013年04月16日 12:44

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/1138

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]