Flashで物理演算を使ったミニゲーム その8「lemonovelで使う」【Flash・lemonovel】

Flashで物理演算を使ったミニゲーム その1「Box2Dについて」
Flashで物理演算を使ったミニゲーム その2「WorldとBodyとジョイント」
Flashで物理演算を使ったミニゲーム その3「動かないBody」
Flashで物理演算を使ったミニゲーム その4「カウントダウンするタイマーと動くBody」
Flashで物理演算を使ったミニゲーム その5「動かないBodyに衝突した時の処理」
Flashで物理演算を使ったミニゲーム その6「動くBodyに衝突した時の処理」
Flashで物理演算を使ったミニゲーム その7「効果音・BGM・背景」
Flashで物理演算を使ったミニゲーム その8「lemonovelで使う」

ではいよいよ作った「物理演算を使ったミニゲーム」のswfを
lemonovelで子swfとして読み込もうと思います。
本題に入る前に「その7」までかかってしまいました。
実はlemonovelの開発元にも問い合わせてしまった部分もあります。
詳しく説明して頂いたので共有したいと思います。

前回にも書きましたがswfをそのままlemonovelにロードしても
まったく動作しません。
lemonovelからの引数を利用したり
ゲーム終了させるための記述も必要になります。
そのため修正してしまうとswf単体では動作しなくなるのでご注意下さい。
(引数の代わりに固定数を入れてデバックする事は可能)

動作するまでに修正した点は以下の通りです。

パブリッシュ設定・フレームレートをlemonovelに合わせる

当たり前ですがパブリッシュ設定やフレームレートは
ロードする本体のlemonovelに合わせます。
flash_028
私の環境ではフレームレート30fps。
パブリッシュ設定は「FlashPlayer10 & 10.1」「ActionScript3.0」。
こちらは基本中の基本で、ミニゲーム作成前からこの設定でしたが
間違えると当然動作しないので念のため記述しておきます。

swfファイルのメインクラスは必ず「MovieClip」を継承

公式サイトの「スクリプト解説」の「プラグインについて」にて説明されていますが
SWFファイルのメインクラスは「MovieClip」を継承しなくてはなりません。
例では「Sprite」を継承してしまっているので「MovieClip」に修正します。

public class game08 extends Sprite{

↓ ↓ ↓

public class game08 extends MovieClip{

こちらは書き換えてもまだswf単体で動作します。

root・parent・stageは使わない

root・parent・stageは子swfでは基本的に使用しないとの事。
表示リストに追加されておらず使えない為。

centerX = stage.stageWidth / 2 / DRAW_SCALE;
centerY = stage.stageHeight / 2 / DRAW_SCALE;

↓ ↓ ↓

centerX = 800 / 2 / DRAW_SCALE;
centerY = 600 / 2 / DRAW_SCALE;

サンプルではWorldの作成時に使用しているので固定数に置き換えました。
lemonovelは本体はサイズごとに分かれていますので
自分がダウンロードした本体のサイズを指定すればOKです。
私の場合はlemonovelサイズが800*600の本体の為、
800、600にしました。

コンストラクタで行っている処理はInitializeに移動

swf単体で動かした時にコンストラクタにあった処理は
lemonovel側にロードが完了した際に実行される「Initialize」(初期化処理)に移動しなければ呼びだされた際動きません。
また、引数を受け取って保存しないとロードした子swfの終了を通知できなくなります。

public function game08(){

↓ ↓ ↓

public function Initialize(arg_lnExtIF:Object, arg_paramObj:Object, arg_volume:Number):void{

このように修正しました。
こちらは修正するとswf単体で動作しなくなりますので

//public function game08(){
public function Initialize(arg_lnExtIF:Object, arg_paramObj:Object, arg_volume:Number):void{

この様にして「//」を変更してデバックすると良いかもしれないですね。
本体から受け取った引数を使用した場合は
そこも定数に一時的に手直しが必要になりますが……

lemonovelからの引数を保存する

引数の「arg_lnExtIF」には、lemonovelの外部インターフェイスの参照がセットされてます。
保存しないと修理用の通知等も出来ないので保存します。
まず「arg_lnExtIF」用の変数の定義。

var m_lnExtIF:Object;			// LemoNovelの外部インターフェイス(共通)

「Initialize」内で「arg_lnExtIF」を変数に保存。

m_lnExtIF = arg_lnExtIF;

引数にボリュームも保存されているのでボリュームも保存し使います。
lemonovel側で設定されたボリュームで子swfも調整されるようにします。
「Initialize」内に記述します。

var mySoundTransform = soundTransform
mySoundTransform.volume=arg_volume;
soundTransform = mySoundTransform;

また、上記と同様の処理ですが
途中でlemonovel側からボリュームを変更された場合、
変更通知を受け取って調整されるようにします。

public function NotifyChangeVolume(arg_volume:Number):void
{

	var mySoundTransform = soundTransform
	mySoundTransform.volume=arg_volume;
	soundTransform = mySoundTransform;

}

今回のサンプルはミニゲーム中はメニュー等を全て使用出来なくしてしまうので
途中でボリュームを変更されるという事はないと思いますが念のため。

インターフェースが使用出来るようにしたままswfを読み込む際に必要になってくると思います。
例えば、効果音付きのスチルなどです。

終了の通知をする

終了が通知されないと子swfの画面のまま
永遠にlemonovel本体に戻れなくなります。

ミニゲームが終了する時は
「ボスのHPが0になり勝った時」
「自分のクリスタルが0になり負けた時」
「タイマーが0になりタイムアップになった時」になります。
それぞれ「Exit();」記述します。

m_lnExtIF.LN_SetVariable("USER","ミニゲームフラグ","1");
// 終了する
Exit();

また、そのまま終了してしまうと、lemonovel側に戻った際
勝ったのか、負けたのか、タイムアップになったのかわからなくなってしまいますので
ユーザ定義の「ミニゲームフラグ」変数に
勝ったら「1」、タイムアップなら「2」、負けたら「3」を保存してから終了します。
lemonovel側でミニゲームフラグを受け取って処理を分岐します。

lemonovel側の記述

とっても簡素な記述のみですが記載しておきます。
変数の「ミニゲームフラグ」は前述でもありますが
子swf側から書き換えるので「__write=true」として下さい。

「ミニゲームフラグ」の値によって
「勝ちました」・「タイムアップ」・「負けました」の画像を背景として読み込んでいます。

今回、子swfの方にBGMも効果音も入っていますが
「LoadMovieLv」際、対応させる音量の音声種別を「volType=◯◯」で設定出来るのですが
下記から選択することになります。
NONE : 指定なし(ミュートを除く音量設定の影響を受けません)
BGM : BGM
SOUND : 効果音
VOICE : ボイス
SYSEV : システムイベント音声
ここでBGMを選択するとBGMの音量も効果音の音量もBGMの音量に合わせて調整されます。
仮にBGMをミュートにして効果音を5で出している人だったら
効果音までミュートになります。
なので、出来ればBGMなどはlemonovel側で処理して
効果音は「volType=SOUND」で連動した方が良いすもしれないですね。
そうすると、「ミニゲーム中HPが少なくなったBGM変えたい!」などが難しくなってしまいそうですが……
ソースは下の方に全文記述します。

flash_029
ポップアップでサンプルswfを開く

(ボス・仲間・敵・エフェクト・空背景:MGS技研/BGM:魔王魂/教室背景:凡界彩景/立ち絵:DIMENSHOP素材部)

無事、別途作ったswfを
lomonovelの子swfとして使用出来ました。
ミニゲームはサンプルなので出来がアレな感じですが許してください……

◆lemonovelソース全文

// メッセージレイヤーを表示
[MsgLayer visible=true]
// 背景レイヤーを表示
[BGLayer visible=true]

// 背景ロード
[LoadBG surface=PRIMARY path='./resource/BG/BG_001.png']

// 立ち絵ロード
[CharLayer idx=0 posX=200 posY=30]
[LoadChar idx=0 surface=PRIMARY path='./resource/Char/Char_001.png']

どうも、DIMENSHOPの管理人代理です。[l][r]
今動作している部分はlemonovelで作られています。[p]
[ClearAllMsg]

これよりミニゲームの動作に移ります。[p]
[ClearAllMsg]

// 立ち絵フェードアウト
[SetFixedCharTrans id=0 mode=FADEOUT time=500]
[StartTrans]

// 背景フェードアウト
[SetFixedBGTrans mode=FADEOUT_BLACK time=500]
[StartTrans]

// メッセージレイヤーを非表示
[MsgLayer visible=false]

[Var __write=true ミニゲームフラグ=0]
//0 初期値
//1 勝利
//2 タイムアップ
//3 ライフ0

[LoadMovieLv level=1 path='./resource/BG/game08.swf' volType=SOUND wait=INSTRUCTION]
[DelMovieLv level=1]

[If exp="@user.ミニゲームフラグ == 1"]

	[LoadBG surface=PRIMARY path='./resource/BG/BG_002.png']
	[Wait click=true]

[ElseIf exp="@user.ミニゲームフラグ == 2"]

	[LoadBG surface=PRIMARY path='./resource/BG/BG_003.png']
	[Wait click=true]

[ElseIf exp="@user.ミニゲームフラグ == 3"]

	[LoadBG surface=PRIMARY path='./resource/BG/BG_004.png']
	[Wait click=true]

[EndIf]

◆サンプルソース全文
(ContactListener.asは変更が無いので省略します)

package{

	//////////////////////////////////////////////////////////////////////////////
	// インポート			
	//////////////////////////////////////////////////////////////////////////////

	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.events.Event;

	import Box2D.Common.Math.*;
	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;

	import Box2D.Dynamics.Joints.b2Joint;
	import Box2D.Dynamics.Joints.b2MouseJoint;
	import Box2D.Dynamics.Joints.b2MouseJointDef;
	import Box2D.Dynamics.Joints.b2RevoluteJoint;
	import Box2D.Dynamics.Joints.b2RevoluteJointDef;

	import caurina.transitions.Tweener;
	import flash.events.MouseEvent;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.text.*;


public class game08 extends MovieClip{

        //定数定義
        private static const DRAW_SCALE:Number = 30;

		// ジョイントの定義
		private var mouseJointDef:b2MouseJointDef;
		private var mouseJoint:b2MouseJoint;

		// 値セット用
		private var centerX:Number;
		private var centerY:Number;

		// 斬撃の画像
		[Embed(source='Zangeki.png')]
		private static const ZanImage:Class;

		// 攻撃の画像
		[Embed(source='Kougeki.png')]
		private static const KouImage:Class;

		// 補助の画像
		[Embed(source='Hojyo.png')]
		private static const HoImage:Class;

		// 斬撃の効果音
		public var ZanSe:se1 = new se1();

		// 攻撃の効果音
		public var BanSe:se2 = new se2();

		// 補助の効果音
		public var KiraSe:se3 = new se3();

		public var mySoundTransform = soundTransform;

		var m_lnExtIF:Object;			// LemoNovelの外部インターフェイス(共通)

//		public function game08(){
		public function Initialize(arg_lnExtIF:Object, arg_paramObj:Object, arg_volume:Number):void{
			
			m_lnExtIF = arg_lnExtIF;

			var mySoundTransform = soundTransform
			mySoundTransform.volume=arg_volume;
			soundTransform = mySoundTransform;

			createWorld();
			createMy();
			createBoss();
			createEnemy1();

			addEventListener(Event.ENTER_FRAME, Update, false, 0, true);

			var timer:Timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER,onTimer);
			timer.start();

		}

		public function NotifyChangeVolume(arg_volume:Number):void
		{
		
			var mySoundTransform = soundTransform
			mySoundTransform.volume=arg_volume;
			soundTransform = mySoundTransform;
		
		}

		//////////////////////////////////////////////////////////////////////////////
		// ワールドの作成			
		//////////////////////////////////////////////////////////////////////////////
			
		private function createWorld():void{

     		//物理エンジンのセットアップ
     		var worldAABB:b2AABB = new b2AABB();
            worldAABB.lowerBound.Set(-100,-100);
            worldAABB.upperBound.Set(100,100);
			
            //重力のセットアップ
			var gravity:b2Vec2 = new b2Vec2(0.0, 0.4);
			
            //範囲・重力・スリープの有無
			var doSleep:Boolean = true;
			
			// ワールド内のセットアップ
			m_world = new b2World(worldAABB, gravity, true);

			// ワールド内座標の設定
			centerX = 800 / 2 / DRAW_SCALE;
			centerY = 600 / 2 / DRAW_SCALE;

			// 上
			var bodyTop:b2BodyDef = new b2BodyDef();
			bodyTop.position.Set(centerX, 0);
			var topShapeDef:b2PolygonDef = new b2PolygonDef();
			topShapeDef.SetAsBox(centerX, 0.2);
			topShapeDef.density = 0;
			
			// 下
			var bodyBottom:b2BodyDef = new b2BodyDef();
			bodyBottom.position.Set(centerX, centerY * 2);
			var BottomShapeDef:b2PolygonDef = new b2PolygonDef();
			BottomShapeDef.SetAsBox(centerX, 0.2);
			BottomShapeDef.density = 0;
			
			// 右
			var bodyRight:b2BodyDef = new b2BodyDef();
			bodyRight.position.Set(centerX * 2, centerY);
			bodyRight.angle = Math.PI;
			var rightShapeDef:b2PolygonDef = new b2PolygonDef();
			rightShapeDef.SetAsBox(0.2, centerY);
			rightShapeDef.density = 0;
			
			// 左
			var bodyLeft:b2BodyDef = new b2BodyDef();
			bodyLeft.position.Set(0, centerY);
			bodyLeft.angle = Math.PI;
			var leftShapeDef:b2PolygonDef = new b2PolygonDef();
			leftShapeDef.SetAsBox(0.2, centerY);
			leftShapeDef.density = 0;
			
			var top:b2Body = m_world.CreateBody(bodyTop);
			top.CreateShape(topShapeDef);
			
			var bottom:b2Body = m_world.CreateBody(bodyBottom);
			bottom.CreateShape(BottomShapeDef);
			
			var right:b2Body = m_world.CreateBody(bodyRight);
			right.CreateShape(rightShapeDef);
			
			var left:b2Body = m_world.CreateBody(bodyLeft);
			left.CreateShape(leftShapeDef);


			// 描画設定
			var debugDraw:b2DebugDraw = new b2DebugDraw();
			debugDraw.m_sprite = this;
			debugDraw.m_drawScale = DRAW_SCALE;
			debugDraw.m_fillAlpha = 0.3;
			debugDraw.m_lineThickness = 1;
			debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;
			m_world.SetDebugDraw(debugDraw);
			
			// イベントハンドラの登録
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);			

			// コンタクトリスナ
			var contactListener:ContactListener = new ContactListener();
			contactListener.parent = this;
			m_world.SetContactListener(contactListener);
			
		}

		//////////////////////////////////////////////////////////////////////////////
		// 自分の作成
		//////////////////////////////////////////////////////////////////////////////
				
		private function createMy():void{
			
			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.x = 10;
			bodyDef.position.y = 15;
			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.66;
			circleDef.density = 0.3;
			circleDef.friction = 0.2;
			circleDef.restitution = 0.5;
			bodyDef.userData = new my();
			bodyDef.userData.id = 'id_my';
			bodyDef.userData.name = 'na_my';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 100; 
			bodyDef.userData.height = 100; 
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);
			
			// ジョイントの定義
			mouseJointDef = new b2MouseJointDef();
			mouseJointDef.body1 = m_world.GetGroundBody();
			mouseJointDef.body2 = body;
			mouseJointDef.target = body.GetWorldCenter();
			mouseJointDef.maxForce = 30;
			mouseJointDef.timeStep = 1 / 24;
			
		}			

		//////////////////////////////////////////////////////////////////////////////
		// ボスの作成			
		//////////////////////////////////////////////////////////////////////////////

		private function createBoss():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.x = 13.5;
			bodyDef.position.y = 4;
			
			boxDef = new b2PolygonDef();
			boxDef.SetAsBox(312.5 / 2 / DRAW_SCALE, 200 / 2 / DRAW_SCALE);
			boxDef.density = 0;

			bodyDef.userData = new boss();
			bodyDef.userData.id = 'id_boss';
			bodyDef.userData.name = 'na_boss';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 312.5; 
			bodyDef.userData.height = 200; 
			
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(boxDef);
						
			body.SetMassFromShapes();
			addChild(bodyDef.userData);
			
		}	

		//////////////////////////////////////////////////////////////////////////////
		// 敵1の作成
		//////////////////////////////////////////////////////////////////////////////

		private function createEnemy1():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(25.5 / 2, 2);
			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.16;
			circleDef.density = 0.8;
			circleDef.friction = 0;
			circleDef.restitution = 1;
			bodyDef.userData = new enemy();
			bodyDef.userData.id = 'id_enemy1';
			bodyDef.userData.name = 'na_enemy1';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 70; 
			bodyDef.userData.height = 70; 
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetLinearVelocity(new b2Vec2(5, 0));
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);
			
		}

		//////////////////////////////////////////////////////////////////////////////
		// 敵2の作成
		//////////////////////////////////////////////////////////////////////////////

		private function createEnemy2():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(25.5 / 2, 2);
			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.16;
			circleDef.density = 0.8;
			circleDef.friction = 0;
			circleDef.restitution = 1;
			bodyDef.userData = new enemy();
			bodyDef.userData.id = 'id_enemy2';
			bodyDef.userData.name = 'na_enemy2';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 70; 
			bodyDef.userData.height = 70; 
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetLinearVelocity(new b2Vec2(5, 0));
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);
			
		}

		//////////////////////////////////////////////////////////////////////////////
		// 敵3の作成
		//////////////////////////////////////////////////////////////////////////////

		private function createEnemy3():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(25.5 / 2, 2);
			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.16;
			circleDef.density = 0.8;
			circleDef.friction = 0;
			circleDef.restitution = 1;
			bodyDef.userData = new enemy();
			bodyDef.userData.id = 'id_enemy3';
			bodyDef.userData.name = 'na_enemy3';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 70; 
			bodyDef.userData.height = 70; 
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetLinearVelocity(new b2Vec2(5, 0));
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);
			
		}

		//////////////////////////////////////////////////////////////////////////////
		// 仲間1の作成
		//////////////////////////////////////////////////////////////////////////////

		private function createFriend1():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(25.5 / 2, 2);

			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.16;
			circleDef.density = 0.1;
			circleDef.friction = 0;
			circleDef.restitution = 1;
			bodyDef.userData = new friend();
			bodyDef.userData.id = 'id_friend1';
			bodyDef.userData.name = 'na_friend1';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 70; 
			bodyDef.userData.height = 70; 
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetLinearVelocity(new b2Vec2(5, 0));
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);

		}

		//////////////////////////////////////////////////////////////////////////////
		// 仲間2の作成
		//////////////////////////////////////////////////////////////////////////////

		private function createFriend2():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(25.5 / 2, 2);

			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.16;
			circleDef.density = 0.1;
			circleDef.friction = 0;
			circleDef.restitution = 1;
			bodyDef.userData = new friend();
			bodyDef.userData.id = 'id_friend2';
			bodyDef.userData.name = 'na_friend2';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 70; 
			bodyDef.userData.height = 70; 

			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetLinearVelocity(new b2Vec2(5, 0));
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);

		}

		//////////////////////////////////////////////////////////////////////////////
		// 仲間3の作成
		//////////////////////////////////////////////////////////////////////////////

		private function createFriend3():void{

			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(25.5 / 2, 2);

			
			circleDef = new b2CircleDef();
			circleDef.radius = 1.16;
			circleDef.density = 0.1;
			circleDef.friction = 0;
			circleDef.restitution = 1;
			bodyDef.userData = new friend();
			bodyDef.userData.id = 'id_friend3';
			bodyDef.userData.name = 'na_friend3';
			bodyDef.userData.enable = true;
			bodyDef.userData.width = 70; 
			bodyDef.userData.height = 70; 

			body = m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			
			body.SetLinearVelocity(new b2Vec2(5, 0));
			
			body.SetMassFromShapes();
			addChild(bodyDef.userData);

		}
		
		//////////////////////////////////////////////////////////////////////////////
		// ジョイントの処理			
		//////////////////////////////////////////////////////////////////////////////
		
		private function mouseDownHandler(event:MouseEvent):void {
			mouseJoint = b2MouseJoint(m_world.CreateJoint(mouseJointDef));
		}
		
		private function mouseUpHandler(event:MouseEvent):void {
			m_world.DestroyJoint(mouseJoint);
			mouseJoint = null;
		}
		
		private function mouseMoveHandler(event:MouseEvent):void {
			if (mouseJoint) {
				var x:Number = event.stageX / DRAW_SCALE;
				var y:Number = event.stageY / DRAW_SCALE;
				mouseJoint.SetTarget(new b2Vec2(x, y));
			}
		}

		//////////////////////////////////////////////////////////////////////////////
		// 更新時の処理			
		//////////////////////////////////////////////////////////////////////////////
		
		public function Update(e:Event):void{
			
			m_world.Step(m_timeStep, m_iterations);

			for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){
				if (bb.m_userData is Sprite){
					bb.m_userData.x = bb.GetPosition().x * 30;
					bb.m_userData.y = bb.GetPosition().y * 30;
					bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
					
					if (bb.m_userData.enable == false) {   

						m_world.DestroyBody(bb); 
						removeChild(getChildByName(bb.m_userData.name));

						// 敵と衝突し、クリスタルが消える
						if ((bb.m_userData.name == "na_enemy1") ||
							(bb.m_userData.name == "na_enemy2") ||
							(bb.m_userData.name == "na_enemy3"))
						{
										
								var ie:int = int(er_life.text);
			
								switch (ie) {
								
								case 3:
			
									ie = 2;
									er_life.text = String(ie);
									removeChild(crystal1_img);
									break;
			
								case 2:
			
									ie = 1;
									er_life.text = String(ie);
									removeChild(crystal2_img);
									break;
			
								case 1:
			
									ie = 0;
									er_life.text = String(ie);
									removeChild(crystal3_img);
									m_lnExtIF.LN_SetVariable("USER","ミニゲームフラグ","3");
									// 終了する
									Exit();
			
								case 0:
			
									break;					
			
								}			
						}


					} 
				}
			}

		}

		//////////////////////////////////////////////////////////////////////////////
		// 衝突時の処理			
		//////////////////////////////////////////////////////////////////////////////
		
		public function addContactEffect(point:b2ContactPoint):void {

        	// 衝突したシェイプ
            var s1:b2Shape = point.shape1;
            var s2:b2Shape = point.shape2;
            
            // 衝突したボディ 
            var b1:b2Body = s1.m_body; 
            var b2:b2Body = s2.m_body; 

            if (b1.m_userData && b2.m_userData)
            {

            	// ボスと衝突した
            	if ((b1.m_userData.id == "id_my" && b2.m_userData.id == "id_boss") ||
	           	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_boss"))
				{
					
					ZanSe.play(0,1,mySoundTransform);
					
					// 斬撃の画像のサイズと位置のセットアップ
					var zanImage:Bitmap = new ZanImage();
					zanImage.width = 50;
					zanImage.height = 50;
					zanImage.x = -zanImage.width / 2;
					zanImage.y = -zanImage.height / 2;
					
					var spritez:Sprite = new Sprite();
					spritez.x = point.position.x * DRAW_SCALE;
					spritez.y = point.position.y * DRAW_SCALE;
					spritez.addChild(zanImage);
					addChild(spritez);
					
					var anglez:Number = Math.random() * 360;
					var lengthz:Number = Math.random() * 100 + 50;
					var dxz:Number = spritez.x + lengthz * Math.cos(anglez);
					var dyz:Number = spritez.y + lengthz * Math.sin(anglez);
					
					// Tweenerで斬撃画像を飛ばす
					Tweener.addTween(spritez, {
						time: 3,
						scaleX: 0,
						scaleY: 0,
						alpha: 0,
						rotation: 600,
						x: dxz,
						y: dyz,
						onComplete: function():void {
							removeChild(spritez);
						}
					});

					var i:int = int(lp_txt.text);
					i = i-20;
					lp_txt.text = String(i);

					if (int(lp_txt.text) <= 0) {
						
						m_lnExtIF.LN_SetVariable("USER","ミニゲームフラグ","1");
						// 終了する
						Exit();
		
					}
					
				}

            	// 敵と衝突した
            	if ((b1.m_userData.id == "id_my" && b2.m_userData.id == "id_enemy1") ||
            	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_enemy1") ||
	           	    (b1.m_userData.id == "id_my" && b2.m_userData.id == "id_enemy2") ||
	           	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_enemy2") ||
	           	    (b1.m_userData.id == "id_my" && b2.m_userData.id == "id_enemy3") ||
	           	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_enemy3"))
            	{

					BanSe.play(0,1,mySoundTransform);

					// 攻撃の画像のサイズと位置のセットアップ
					var kouImage:Bitmap = new KouImage();
					kouImage.width = 50;
					kouImage.height = 50;
					kouImage.x = -kouImage.width / 2;
					kouImage.y = -kouImage.height / 2;
					
					var sprite:Sprite = new Sprite();
					sprite.x = point.position.x * DRAW_SCALE;
					sprite.y = point.position.y * DRAW_SCALE;
					sprite.addChild(kouImage);
					addChild(sprite);
					
					var angle:Number = Math.random() * 360;
					var length:Number = Math.random() * 100 + 50;
					var dx:Number = sprite.x + length * Math.cos(angle);
					var dy:Number = sprite.y + length * Math.sin(angle);
					
					// Tweenerで攻撃画像を飛ばす
					Tweener.addTween(sprite, {
						time: 3,
						scaleX: 0,
						scaleY: 0,
						alpha: 0,
						rotation: 200,
						x: dx,
						y: dy,
						onComplete: function():void {
							removeChild(sprite);
						}
					});
	
						b2.m_userData.enable = false;
	
				}

				// 仲間と衝突した
        	   	if ((b1.m_userData.id == "id_my" && b2.m_userData.id == "id_friend1") ||
            	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_friend1") ||
	           	    (b1.m_userData.id == "id_my" && b2.m_userData.id == "id_friend2") ||
	           	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_friend2") ||
	           	    (b1.m_userData.id == "id_my" && b2.m_userData.id == "id_friend3") ||
	           	    (b2.m_userData.id == "id_my" && b1.m_userData.id == "id_friend3"))
            	{

					KiraSe.play(0,1,mySoundTransform);

					// 補助の画像を読み込んでセットアップ
					var hoImage:Bitmap = new HoImage();
					hoImage.width = 50;
					hoImage.height = 50;
					hoImage.x = -hoImage.width / 2;
					hoImage.y = -hoImage.height / 2;

					var spriteh:Sprite = new Sprite();
					spriteh.x = point.position.x * DRAW_SCALE;
					spriteh.y = point.position.y * DRAW_SCALE;
					spriteh.addChild(hoImage);
					addChild(spriteh);
					
					var angleh:Number = Math.random() * 360;
					var lengthh:Number = Math.random() * 100 + 50;
					var dxh:Number = spriteh.x + lengthh * Math.cos(angleh);
					var dyh:Number = spriteh.y + lengthh * Math.sin(angleh);
					
					// Tweenerで補助画像を飛ばす
					Tweener.addTween(spriteh, {
						time: 3,
						scaleX: 0,
						scaleY: 0,
						alpha: 0,
						rotation: 0,
						x: dxh,
						y: dyh,
						onComplete: function():void {
							removeChild(spriteh);
						}
					});
					
					b2.m_userData.enable = false;
					
					var i2:int = int(lp_txt.text);
					i2 = i2-20;
					lp_txt.text = String(i2);

					if (int(lp_txt.text) <= 0) {
						
						m_lnExtIF.LN_SetVariable("USER","ミニゲームフラグ","1");
						// 終了する
						Exit();
		
					}


				}

			}
		}
		
		//////////////////////////////////////////////////////////////////////////////
		// 時間経過ごとの処理			
		//////////////////////////////////////////////////////////////////////////////

		private function onTimer(e:TimerEvent):void{

			var i:int = int(disp_txt.text);
			i = i-1;
			disp_txt.text = String(i);

			switch (i) {
				case 25 :
					createFriend1();
					break;
				case 20 :
					createEnemy2();
					break;
				case 15 :
					createFriend2();
					break;
				case 10 :
					createEnemy3();
					break;
				case 5 :
					createFriend3();
					break;
			}
			
			if (int(disp_txt.text) == 0) {

				m_lnExtIF.LN_SetVariable("USER","ミニゲームフラグ","2");
				// 終了する
				Exit();

			}
		}


		//////////////////////////////////////////////////////////////////////////////
		// 終了処理			
		//////////////////////////////////////////////////////////////////////////////
		public function Exit():void
		{
			// 解放処理を実行する
			Release();

			loaderInfo.removeEventListener(Event.UNLOAD, arguments.callee );

			// 自身の階層の破棄を依頼する
			m_lnExtIF.LN_DeleteMovieLv(1);
		}

		//////////////////////////////////////////////////////////////////////////////
		// 解放処理			
		//////////////////////////////////////////////////////////////////////////////
		public function Release():void
		{

			// イベントハンドラを登録する
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

			while(numChildren > 0){  
				removeChildAt(0);  
			}

		}


		private function enterFrameHandler(event:Event):void {

			m_world.Step(1 / 24, 10);

		}
		
		public var m_world:b2World;
		public var m_iterations:int = 10;
		public var m_timeStep:Number = 1.0/30.0;

	}
	
}

◆スポンサードリンク – 楽天市場
 

コメント

タイトルとURLをコピーしました