忍者ブログ

幻日記

お絵描き&ゲーム制作好きの ひとりごと日記

AS3横スクロールアクションゲーム制作16

AS3横スクロールアクションゲーム制作第16弾!

操作方法:
・移動 ……………………… カーソルキーの← →
・ジャンプ ………………… Z
・攻撃 ……………………… X(武器取得後は飛び道具に変更)
・デバッグ画面のON/OFF… 画面右に表示されてるデバッグ画面をクリック

見た目が大きく変わったのはタイトル画面と
主人公に攻撃モーションを追加した所です。
他にも当たり判定に関する処理が大きく変わってますが
イマイチ変った感じがしないかもしれません(・ω・`)


変更点:
前回修正したいと書いていた2点を修正しました
■タイトル画面の修正:
 ・地味だった背景を変更。今回からpngファイルを使ってます。
 ・ボタンを「ボタンらしく」演出出来るように修正
 ・ゲーム開始時にシャッターのようにせり上がる演出を増やした
■物理攻撃モーションの修正
 ・主人公が蹴り上げるようなモーションを追加
 ・攻撃判定自体も大きくした。ただ不自然な形なので再度修正が必要かも。
 ・隠し要素として落下中にジャンプボタンを押しながら攻撃することで
  微妙ながらホバリング(空中ジャンプ)が可能。ちなみに上昇中は不可。
  他にも←→キー入力しながらだと微妙に動ける。
 ・遠距離攻撃のモーションに関してはまだ未調整…。

他にも
■デバッグ画面を押す事で敵の「視野」判定も消すことにした
・前回までは敵の視野判定が消えなかった。
 今まで実装しなかった理由は書くのが面倒なコードだったから(=ω=`;)
■主人公とブロックの当たり判定の修正
・『主人公のグラフィック ←→ ブロック』で判定を取ってましたが
 『主人公の当たり判定  ←→ ブロック』で判定を取る事に。
 攻撃モーションを増やした事によってブロックにめり込む不具合が起きたので
 被ダメ判定、アイテム判定などと同じで「主人公の当たり判定」で処理することに。
■後ろ歩きが出来なくなった
・今まであえて後ろ歩きを可能にしてましたが
 攻撃モーションが増える事で操作し辛く感じたので廃止しました。
■主人公の当たり判定の位置、形を変更
・前回と比べて真四角になってます。また、向きを変えてもブレません。



左下の「ソースコードを表示」から
このゲームに使われている一部のコードを表示します。

余談ですが今までブログで見易い表示でソースコードを貼付ける方法を知りませんでした。
どうも調べてみると『シンタックスハイライトを有効にする』って言うみたいですね。
という訳で今回からブログでもコレを実装してみました。
メイン部分
stop();//とりあえずフレームを固定

BGM = new Stage01( );//リンケージプロパティで設定したサウンドクラスを使ってサウンドオブジェクトを作成
sound01 = new SJump( );
var sound02 : Sound = new GetWeapon02();
var sound03 : Sound = new SAttack01( );
var sound04 : Sound = new SBullet01( );
var sound05 : Sound = new SHit01();
var sound06 : Sound = new SKill01();
var sound07 : Sound = new EAtack01();
var sound08 : Sound = new SGethit01();//主人公被攻撃時の音
var channel07 : SoundChannel;//ウォーカーの攻撃音に使用

var left_flg  : Boolean = false;//←を押してるかどうかのフラグ
var right_flg : Boolean = false;//→を押してるかどうか…
var up_flg : Boolean = false;//↑を押してるかどうか…
var down_flg : Boolean = false;//↓を押してるかどうか…
var space_flg : Boolean = false;//スペースを…
var z_flg : Boolean = false;//Zキーを…
var x_flg : Boolean = false;//Xキーを…
var SToBlock:Boolean = false;//ブロックに衝突したフラグ

var vx : Number = 0;//主人公の横加速度
var vy : Number = 0;//主人公の縦加速度
var delay : int = 0;//攻撃のディレイ。0だと攻撃可能になる。
var j_flg : Boolean = true;//ジャンプのフラグ。false=可
var weapon: int = 0;//選択中の武器
var timer : int = 0;//ゲームの時間軸を表す変数
var rot : int = 0 ;//主人公の向き。0が→、180が←。
var SCX : int = -1 ;//-1=左端0=スクロール移動可1=右端
var scroll_x : Number = 0;//主人公の画面上のx位置

var bullet_array01:Array = new Array();//弾1用配列
var attack_array01:Array = new Array();//攻撃1用配列
var enemy_array01:Array = new Array();//敵1用配列
var item_array01:Array = new Array();//アイテム1用配列
var weapon_array:Array = new Array();//選択武器配列
var block_array:Array = new Array();//ブロック配列
var ADetection_array:Array = new Array();//攻撃準備判定配列
var Ebullet_array01:Array = new Array();//敵の攻撃用配列

var s_right:int ;//主人公の右端
var s_left :int ;//主人公の左端
var s_top  :int ;//主人公の上端
var s_bottom:int;//主人公の下端
var s_HP  :int = 800;//主人公のHP。体力
var s_SP  :int = 0;//主人公のSP。スペシャルポイント

var b_right:int ;//ブロックの右端
var b_left :int ;//ブロックの左端
var b_top  :int ;//ブロックの上端
var b_bottom:int;//ブロックの下端

var e_front:int ;//敵の前端
var e_bottom:int;//敵の下端

var sd:SDetection;//主人公の当たり判定

const scEnd:int = 1000;//スクロールの最大値

// キーボードが押されたときに呼び出されるイベント
stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownFunc);
function KeyDownFunc(event:KeyboardEvent):void{
	if(event.keyCode == 37){
		left_flg = true;
		if(!right_flg){
			rot = 180;//左向き
		}
	}
	if(event.keyCode == 39){
		right_flg = true;
		if(!left_flg){
			rot = 0;//右向き
		}
	}
	if(event.keyCode == 38){
		up_flg = true;
	}
	if(event.keyCode == 32){
		space_flg = true;
		}
	if(event.keyCode == 40){
		down_flg = true;
	}
	if(event.keyCode == 90){
		z_flg = true;
	}
	if(event.keyCode == 88){
		x_flg = true;
	}
}


// キーボードが離されたときに呼び出されるイベント
stage.addEventListener(KeyboardEvent.KEY_UP, KeyUpFunc);
function KeyUpFunc(event:KeyboardEvent):void{
    if(event.keyCode == 37){
        left_flg = false;
    }
	if(event.keyCode == 39){
        right_flg = false;
    }
	if(event.keyCode == 38){
        up_flg = false;
    }
	if(event.keyCode == 32){
        space_flg = false;
    }
	if(event.keyCode == 40){
        down_flg = false;
	}
	if(event.keyCode == 90){
		z_flg = false;
	}
	if(event.keyCode == 88){
		x_flg = false;
	}

}

// 毎フレーム実行されるイベント
stage.addEventListener(Event.ENTER_FRAME, function(event:Event):void{
//■timerが0の時に実行---------------------------------
	if(timer==0){
		if(!SilentMode){
			var Bchannel : SoundChannel = BGM.play(0,999);//音楽を再生。
		}
	
		sd = new SDetection();//主人公の当たり判定を配置
		sd.x = Syuzinko.x;
		sd.y = Syuzinko.y;
		addChild(sd);
	
		var block:Block = new Block();//床になるブロックを配置
		block_array.push(block);
		block_array[block_array.length-1].x = 800;
		block_array[block_array.length-1].y = 580;
		block_array[block_array.length-1].gotoAndStop(2);
		addChild(block_array[block_array.length-1]);
	

		var enemy:Enemy01 = new Enemy01();//敵を配置 1
		enemy_array01.push (enemy);
		enemy_array01[enemy_array01.length-1].x = 200;
		enemy_array01[enemy_array01.length-1].y = 405;
		addChild (enemy_array01[enemy_array01.length-1]);
	
		var ad:attackDetection = new attackDetection();//攻撃判定を配置 1
		ADetection_array.push (ad);
		ADetection_array[ADetection_array.length-1].x = 200;
		ADetection_array[ADetection_array.length-1].y = 405;
		addChild (ADetection_array[ADetection_array.length-1]);
/*	
		enemy = new Enemy01(); //敵を配置 2
		enemy_array01.push (enemy);
		enemy_array01[enemy_array01.length-1].x = 100;
		enemy_array01[enemy_array01.length-1].y = 540;
		addChild (enemy_array01[enemy_array01.length-1]);
	
		ad = new attackDetection();//攻撃判定を配置 2
		ADetection_array.push (ad);
		ADetection_array[ADetection_array.length-1].x = 100;
		ADetection_array[ADetection_array.length-1].y = 540;
		addChild (ADetection_array[ADetection_array.length-1]);
*/
		enemy = new Enemy01(); //敵を配置 3
		enemy_array01.push (enemy);
		enemy_array01[enemy_array01.length-1].x = 800;
		enemy_array01[enemy_array01.length-1].y = 540;
		addChild (enemy_array01[enemy_array01.length-1]);
	
		ad = new attackDetection();//攻撃判定を配置 3
		ADetection_array.push (ad);
		ADetection_array[ADetection_array.length-1].x = 800;
		ADetection_array[ADetection_array.length-1].y = 540;
		addChild (ADetection_array[ADetection_array.length-1]);

		enemy = new Enemy01(); //敵を配置 4
		enemy_array01.push (enemy);
		enemy_array01[enemy_array01.length-1].x = 1600;
		enemy_array01[enemy_array01.length-1].y = 540;
		addChild (enemy_array01[enemy_array01.length-1]);
	
		ad = new attackDetection();//攻撃判定を配置 4
		ADetection_array.push (ad);
		ADetection_array[ADetection_array.length-1].x = 1600;
		ADetection_array[ADetection_array.length-1].y = 540;
		addChild (ADetection_array[ADetection_array.length-1]);


		var item:Item01 = new Item01();//アイテムを配置
		item_array01.push(item);
		item_array01[item_array01.length-1].x =900;
		item_array01[item_array01.length-1].y =225;
		//var item_array01[item_array01.length-1].i_state:int = 1;
		addChild(item_array01[item_array01.length-1]);

		block = new Block();//ブロックを配置(敵の下■■■)
		block_array.push(block);
		block_array[block_array.length-1].x = 243;
		block_array[block_array.length-1].y = 450;
		block_array[block_array.length-1].gotoAndStop(4);
		addChild(block_array[block_array.length-1]);

		block = new Block();//ブロックを配置(敵の右上)
		block_array.push(block);
		block_array[block_array.length-1].x = 286;
		block_array[block_array.length-1].y = 407;
		addChild(block_array[block_array.length-1]);
	
		block = new Block();//ブロックを配置(床の上)
		block_array.push(block);
		block_array[block_array.length-1].x = 500;
		block_array[block_array.length-1].y = 540;
		addChild(block_array[block_array.length-1]);
	
		block = new Block();//縦向き1段目
		block_array.push(block);
		block_array[block_array.length-1].x = 700;
		block_array[block_array.length-1].y = 540;
		addChild(block_array[block_array.length-1]);
	
		block = new Block();//縦向き2段目
		block_array.push(block);
		block_array[block_array.length-1].x = 700;
		block_array[block_array.length-1].y = 497;
		addChild(block_array[block_array.length-1]);

		block = new Block();//縦向き3段目
		block_array.push(block);
		block_array[block_array.length-1].x = 700;
		block_array[block_array.length-1].y = 454;
		addChild(block_array[block_array.length-1]);

	
		block = new Block();//ブロックを配置(離れた高い所)
		block_array.push(block);
		block_array[block_array.length-1].x = 1100;
		block_array[block_array.length-1].y = 380;
		addChild(block_array[block_array.length-1]);
	
		block = new Block();//ブロックを配置(離れたさらに高い所)
		block_array.push(block);
		block_array[block_array.length-1].x = 1000;
		block_array[block_array.length-1].y = 180;
		addChild(block_array[block_array.length-1]);

		block = new Block();//ブロックを配置(床の上、デカい)
		block_array.push(block);
		block_array[block_array.length-1].x = 1400;
		block_array[block_array.length-1].y = 517;
		block_array[block_array.length-1].gotoAndStop(3);
		addChild(block_array[block_array.length-1]);

		block = new Block();//ブロックを配置(右下)
		block_array.push(block);
		block_array[block_array.length-1].x = 1600;
		block_array[block_array.length-1].y = 540;
		addChild(block_array[block_array.length-1]);
		
		//setChildIndex(Syuzinko,numChildren-1);//主人公を最前面へ表示
		setChildIndex(debugWindow,numChildren-1);//デバッグ画面を最前面へ表示
		setChildIndex(title_shutter,numChildren-1);//シャッターを最前面へ表示
		stage.focus = MovieClip(root);//キー入力を受け付けれるようにフォーカスをステージに変更
	
	}//『timerが0の時に実行』のif文の終了

//■timerが20の時に実行---------------------------------
	if(timer==20){
		removeChild(title_shutter);//タイトルシャッターを消去する
	}
	
//■ブロック衝突に関する処理----------------------------------------
	if(SToBlock==true){//前回のフレームで衝突していれば
		vx=0;//加速度を0に
		SToBlock=false;//フラグ解除
	}

//■移動に関する処理----------------------------------------
	if(left_flg && right_flg && !Syuzinko.stun){//←→同時に押してる場合
		if(vx<1 && vx>-1){
			vx=0;//加速度が0に近づくと完全に停止させる
		}else{
			vx+= -vx/2;//加速度を減らしていく
		}
	}else if(left_flg && vx>-10 && Syuzinko.x-Syuzinko.width/2 > 0 && !Syuzinko.stun){//←を押す
        vx -= 0.5;
		if(vx > 0){//急ターン処理
			vx += -vx/4;//→への速度が速い場合、ブレーキをかける
		}
	}else if(left_flg && vx>=-10 && Syuzinko.x-Syuzinko.width/2 > 10 && !Syuzinko.stun){//←を押す(最高速状態)
		vx = -10;
	}else if(right_flg && vx<10 && Syuzinko.x+Syuzinko.width/2 < stage.stageWidth && !Syuzinko.stun){//→を押す
		vx += 0.5;
		if(vx < 0){//急ターン処理
			vx += -vx/4;//←への速度が速い場合、ブレーキをかける
		}

	}else if(right_flg && vx<=10 && Syuzinko.x+Syuzinko.width/2 < stage.stageWidth-10 && !Syuzinko.stun){//→を押す(最高速状態)
		vx = +10;
	}else{//何も押していない場合
		if(vx<1 && vx>-1){
			vx=0;//加速度が0に近づくと完全に停止させる
		}else{
			vx+= -vx/4;//加速度を減らしていく
		}
	}

//■ジャンプに関する処理----------------------------------------
	if(z_flg && !j_flg && vy>=0 && !Syuzinko.stun){
		//↑Zキーを押し、ジャンプ中でなくて、主人公がスタン状態でない場合
		vy = -30;//ジャンプさせる
		sound01.play();//ジャンプ音を鳴らす
		j_flg = true;
		//trace(timer + "ジャンプしたよ");
	}
	if(j_flg && vy<0 && !z_flg && !Syuzinko.stun){//ジャンプの出だしで↑を押していない場合は
		if(vy<-20){
			vy = -10;//小ジャンプに変更
		}else{
			vy += 2;//小ジャンプに
		}
	}
//■攻撃に関する処理----------------------------------------
	if(weapon==0 && x_flg && delay==0  && !Syuzinko.stun){//装備が無い場合、素手で攻撃
		if(z_flg && j_flg && vy>0){//落下っ中にZを押している場合
			vy = -6;
		}
		if(right_flg){//→を押していれば
			rot=0;//強制的に→向きに
			vx += 2;
		}else if(left_flg){//←を押していれば
			rot=180;//強制的に←向きに
			vx -= 2;
		}
		sound03.play();
		Syuzinko.wait = 15;//硬直時間を伝える
		Syuzinko.variety = 1;//物理攻撃モーションである事を伝える
		var attack:Attack01 = new Attack01();
		attack_array01.push(attack);
		addChildAt(attack,2);
		attack.x = Syuzinko.x;
		attack.y = Syuzinko.y + 10;
		delay=15;
	}else if(weapon==1 &&x_flg && delay==0  && !Syuzinko.stun){//ハンドガン1を装備し、スペースを押し、ディレイ0の時
			sound04.play();//効果音を再生
            var bullet:Bullet01 = new Bullet01();//弾を作成
            bullet_array01.push(bullet);//その弾を配列へ入れる
            addChildAt(bullet, 2);//画面内に登場させる
            bullet.x = Syuzinko.x;
            bullet.y = Syuzinko.y + 10;
			delay=13;
	}
//□弾が画面外へ飛んでいった場合、削除する
	if(bullet_array01.length != 0){//弾が画面内に存在する場合
		for(var i:int=0; i<bullet_array01.length; .x="" if=""> stage.stageWidth) {
			removeChild(bullet_array01[i]);//ステージから消すよう命令
			bullet_array01.splice (i , 1);//配列からも削除しておく
			}
    	}
	}
//□攻撃して一定時間が経った場合、削除する
	if(attack_array01.length != 0){//攻撃が画面内に存在する場合
		for(i=0; i<attack_array01.length; -="1;//体力を減らす" ----------------------------------------="" .height="" .hittestobject="" .life="" .width="" .x="Syuzinko.x;" .y="Syuzinko.y;" :="" adetection_array.splice="" attack_array01.length="" attack_array01.splice="" b_bottom="block_array[i].y" b_left="block_array[i].x" b_right="block_array[i].x" b_top="block_array[i].y" block_array.length="" break="" bullet_array01.length="" bullet_array01.splice="" channel07="" delete="" enemy_array01.length="" enemy_array01.splice="" for="" i="0" if="" item_array01.length="" item_array01.splice="" j="" j:uint="0" removechild="" s_bottom="sd.y" s_left="sd.x" s_right="sd.x" s_top="sd.y" sd.height="" sd.width="" sound="new" sound04="" var="" vx="" weapon="item_array01[i].i_state;//アイテムを手に持っている状態にする" weapon_array.length-1="">0){
				if(SCX!=0){//画面端であれば
					vx = 0;//主人公が左から右へ触れた場合
					Syuzinko.x = b_left - sd.width/2-1;//衝突したブロックより左へ強制移動
				}else if(SCX==0){//スクーロル位置であれば
					vx = -vx;//衝突したブロックより左へ強制移動
					vx--;
					SToBlock=true;
				}
			//trace("→■:左からあたる"+i+"番目のブロック、timer="+timer+" vx="+vx);
			break
			//↓主人公が■←右から左へ触れた場合
			}else if(block_array[i].hitTestPoint(s_left,s_bottom-16) ||
					 block_array[i].hitTestPoint(s_left,s_top+16) && vx<0){
				if(SCX!=0){//画面端であれば
				vx = 0;
				Syuzinko.x = b_right+sd.width/2+1;//衝突したブロックより右へ強制移動
				}else if(SCX==0){//スクロール位置であれば
					vx = -vx;//衝突したブロックより右へ強制移動
					vx++;
					SToBlock=true;
				}
			//trace("■←:右からあたる" +i+"番目のブロック、 timer="+timer+" vx="+vx);
			break
			}else{
				//trace("横は特に処理なし"+i);
				}
		}
	}
//□縦からのぶつかり判定
	if(block_array.length != 0){
		s_right = sd.x + sd.width/2;//主人公の右端
		s_left  = sd.x - sd.width/2;//主人公の左端
		s_top   = sd.y - sd.height/2;//主人公の上端
		s_bottom= sd.y + sd.height/2;//主人公の下端
		for(i = 0 ; i < block_array.length ; i ++){
			b_right = block_array[i].x + block_array[i].width/2;//ブロックの右端
			b_left  = block_array[i].x - block_array[i].width/2;//ブロックの左端
			b_top   = block_array[i].y - block_array[i].height/2;//ブロックの上端
			b_bottom= block_array[i].y + block_array[i].height/2;//ブロックの下端
			
			if((block_array[i].hitTestPoint(s_right-10,s_top-14) ||
			   (block_array[i].hitTestPoint(s_left+10,s_top-14))) && vy<0){
				Syuzinko.y = b_bottom + sd.height/2;
				//trace("頭をぶつけた前。vy = "+vy+",timer= "+timer);
				vy =- vy/2;//ブロックに頭をぶつけた場合の処理
				//trace("頭をぶつけた後。vy = "+vy+",timer"+timer);
				break
			}else if(!((block_array[i].hitTestPoint(s_right,s_bottom+10)) ||
					   (block_array[i].hitTestPoint(s_left,s_bottom+10))) && !j_flg){
					//trace("ブロックから離れた"+i+" timer="+timer);
					j_flg=true;
			}if((block_array[i].hitTestPoint(s_right-10,s_bottom+10) ||
				block_array[i].hitTestPoint(s_left+10,s_bottom+10)) && (vy>0 && j_flg)){
				Syuzinko.y = b_top - sd.height/2 -10;
				vy=0;//ブロックに乗った場合の処理
				j_flg=false;
				//trace("ブロックに乗った瞬間"+i+" timer="+timer);
				break
			}if(block_array[i].hitTestPoint(s_right-10,s_bottom+10) ||
				block_array[i].hitTestPoint(s_left+10,s_bottom+10)){
				j_flg=false;
				//trace("とにかく足元にブロックがある"+i+" timer="+timer);
					if(Syuzinko.stun){vy=0;}//スタン中であれば加速度は0にする(背中でブロックを登るバグを防ぐ為)
				break
			}else{
				//trace("縦は特に処理なし"+i);
				}
		}
	}

//■敵の処理----------------------------------------
	if(enemy_array01.length != 0){
		for (i = 0 ; i < enemy_array01.length ; i ++) {
			e_front  = enemy_array01[i].x + (enemy_array01[i].width*enemy_array01[i].rot)/2;//敵の前端
			e_bottom = enemy_array01[i].y + enemy_array01[i].height/2;//敵の下端
//□画面外へ出そうになると内側へ方向転換
			if(enemy_array01[i].x + scroll_x < 0){//画面から左へ出そうになったら
				enemy_array01[i].x = -scroll_x;//画面内に戻す
				enemy_array01[i].rot *= -1;//向きを変更
				enemy_array01[i].scaleX *= -1;//グラフィックを反転させる
			}else if(enemy_array01[i].x + scroll_x > scEnd+800){//画面から右へ出そうになったら
				enemy_array01[1].x = scroll_x + 800;//画面内へ戻す
				enemy_array01[i].rot *= -1;//向きを変更
				enemy_array01[i].scaleX *= -1;//グラフィックを反転させる
			}
			//trace("L_□縦判定のループ開始");
			for (j = 0 ; j < block_array.length ; j ++) {//ブロックループ1
//□敵のナナメ下にブロックがない場合、反転----------------------------------------
				if((enemy_array01[i].j_flg==false) && (block_array[j].hitTestPoint(e_front-20*enemy_array01[i].rot,e_bottom+20,true))){
					//立ち状態中に足下にブロックが存在した場合
					enemy_array01[i].mov=2;//「移動中」状態に変更
					//trace("  L_立ち状態で足下にブロックが存在"+j);
					break
				}else if(enemy_array01[i].j_flg){//空中にいる場合
					//trace("  L_敵:"+j+"のブロックには乗らず、現在ジャンプ中");
				}else{//それいがい(立ち状態で目の前に足場が存在しない場合)
					enemy_array01[i].mov = 1;
					//trace("  L_敵:向き反転準備(足下に"+j+"のブロックが存在しないため)");
				}
			}//ブロックループ1が終了
			//trace("L_□横判定のループ開始");
			for (j = 0 ; j < block_array.length ; j ++) {//ブロックループ2開始
//□敵の目の前にブロックがある場合、反転----------------------------------------
				if(enemy_array01[i].mov==2 && block_array[j].hitTestPoint(e_front,enemy_array01[i].y-10,false)){
					//↑移動中にブロックにぶつかった場合
					enemy_array01[i].mov = 1;
					//trace("  L_敵:向き反転 準備(ブロックと横から衝突したため)"+j);
					break
				}else{
					//trace("  L_敵:とくに横からの衝突はなかった…。"+j);
				}
			}//ブロックループ2終了
			for (j = 0 ; j < block_array.length ; j ++) {//ブロックループ3開始
//□敵の足下にブロックがある場合、着地----------------------------------------
				if(!(enemy_array01[i].j_flg) && !(enemy_array01[i].hitTestObject(block_array[j]))){//立ち状態で足下にブロックがない場合
					enemy_array01[i].j_flg = true;//落下状態に変更する
					//trace("敵:落下開始。"+i+"の敵と"+j+"のブロックが衝突しなかったため。");
				}else if(enemy_array01[i].j_flg && (enemy_array01[i].hitTestObject(block_array[j]))) {//落下中に床と接触した場合、
					enemy_array01[i].j_flg = false;//立ち状態へ変更
					//trace("敵:着地。  "+i+"の敵と"+j+"のブロックが衝突したため。");
					break
				}else if(!(enemy_array01[i].j_flg) && (enemy_array01[i].hitTestObject(block_array[j]))){//とにかく足下にブロックが存在する場合
					//trace("敵:ブレイク。  "+i+"の敵は"+j+"のブロックに乗っているのでループブレイク");
					break
				}else{
					//trace(i+"の敵と"+j+"のブロックの間に特に縦の処理はなかった…。")
				}
			}//ブロックループ3が終了
//★敵の最終的な移動処理----------------------------------------
			if(enemy_array01[i].j_flg){//ジャンプフラグがONの場合、落下させる
				enemy_array01[i].y++;
				//trace("・敵:落下中");
			}
			if(enemy_array01[i].mov==2 && !(enemy_array01[i].j_flg) && enemy_array01[i].delay>0){//敵が「歩行」状態、かつ立ち状態で攻撃中ではない場合
				enemy_array01[i].x += 2*enemy_array01[i].rot;//進行方向へ進む
				//trace("・敵:進行方向へ進む");
			}else if(enemy_array01[i].mov==1 && !(enemy_array01[i].j_flg)){//敵が「振り向き待ち」状態、かつ立ち状態の場合
				enemy_array01[i].x -= enemy_array01[i].rot//少し後退してから
				enemy_array01[i].rot *= -1;//向きを変更
				enemy_array01[i].scaleX *= -1;//グラフィックを反転させる
				//trace("・敵:向き反転 実行");
			}
			
			if(enemy_array01[i].delay == 0){//攻撃ディレイが0になると、攻撃モーションへ移る
				channel07 = sound07.play();//ウォーカーの攻撃音を鳴らす
				enemy_array01[i].gotoAndStop(3);//攻撃モーションアニメへ変更
				enemy_array01[i].delay = -1;//-1に変更する
			}else if(enemy_array01[i].delay<0 && enemy_array01[i].delay >= -30){//攻撃が終了するまでデクリメント
				enemy_array01[i].delay--;
			}else if(enemy_array01[i].delay<-30){//攻撃が終了、歩行状態に戻る
				enemy_array01[i].delay = 50;
				enemy_array01[i].gotoAndStop(2);//歩行アニメーションへ戻す
			}
		}//敵のループが終了
	}

//■敵の攻撃準備判定----------------------------------------
	if(ADetection_array.length != 0){//指定された敵の目線位置へ移動させる
		for (i = 0 ; i < ADetection_array.length ; i ++) {
			ADetection_array[i].x = enemy_array01[i].x +(ADetection_array[i].width/2 -enemy_array01[i].width/2)*enemy_array01[i].rot;
			ADetection_array[i].y = enemy_array01[i].y -ADetection_array[i].height/2 +enemy_array01[i].height/2;
			//□主人公が視界に入っているかどうかの判定----------------------------------------
			if(ADetection_array[i].hitTestObject(sd) &&
				enemy_array01[i].delay>0){//主人公が敵の視界に入っていれば
				enemy_array01[i].delay--;//攻撃開始までのカウントをデクリメント(0まで)
				}

		}
	}
	
//■敵からの攻撃判定----------------------------------------
	if(ADetection_array.length != 0){//攻撃準備判定が存在する場合
		for(i = 0 ; i<enemy_array01.length; .delay="" 0="" if="">= -30 && Syuzinko.variety>=0) {
				//↑敵が攻撃モーション中で主人公が正常時、
				// 主人公の当り判定と敵の攻撃が衝突した場合
				Syuzinko.wait=30;//くらいモーション値30を代入
				Syuzinko.variety=-1;//ダメージ(小)判定に切り替える
				s_HP -= 100;//体力が100減少する
				sound08.play();//ダメージ音を鳴らす
				if(rot==0){//もし主人公が右を向いていた場合
					vy = -16;//ジャンプさせる①
					vx = -16;//ジャンプさせる②
					j_flg = true;//ジャンプさせる③
				}else if(rot==180){//もし主人公が左を向いていた場合
					vy =-16;//ジャンプさせる①
					vx = 16;//ジャンプさせる②
					j_flg = true;//ジャンプさせる③
				}
			}//ヒット時のif文
		}//主人公←→敵の攻撃ヒット時のif文
	}//攻撃判定準備の
	
//■主人公死亡処理----------------------------------------
//□バーの位置調整----------------------------------------
	if(s_HP < 0){//HPが0より小さくなった場合
		s_HP = 0;//0に修正する。
	}
//□死亡した際の処理----------------------------------------
	if(s_HP==0){
		//TODO:死亡
		s_HP=1000;
	}

//■スクロール処理----------------------------------------
//↑注:この処理を行う位置が間違えているかもしれない。
//元々は『敵の処理』の上にあった。エラー時の参考までに。
	if(SCX==-1 && Syuzinko.x>stage.stageWidth/2 && vx>0){//SCXを-1→0に切り替える
		SCX = 0;
		Syuzinko.x = stage.stageWidth/2;
	}else if(scroll_x<0 && SCX==0 && vx<0){//SCXを0→-1に切り替える
		SCX = -1;
	}else if(scroll_x>scEnd && SCX==0){//SCXを0→1に切り替える
		SCX = 1;
	}else if(SCX==1 && Syuzinko.xstage.stageWidth-5){
	Syuzinko.x=stage.stageWidth-5;
	}
	
	//画面←からはみ出るのを防ぐ
	if(Syuzinko.x<5){
	Syuzinko.x=5;
	}
	
	//画面↓からはみ出るのを防ぐ
	if(Syuzinko.y>600){
	Syuzinko.y=500;
	vy=0
	}

	//trace("ジャンプできる?="+j_flg);
	if(SCX!=0){
		Syuzinko.x += vx;//主人公を動かす
	}
	Syuzinko.y += vy;
	timer++;//時間が進み、timerをインクリメント
	
	if(delay>0){//攻撃のディレイをデクリメント
		delay--;
	}
	
	if(s_SP<1000){//時間とともにSPが回復する
		s_SP++;//主人公のSPをインクリメント
	}
	
	//デバッグ用-------------------------------------------
	//trace("■↑timer= "+timer+"--------------------------------------------");
	//trace(Syuzinko.wait);
	debugWindow.debugText.text = 
	"stage.stageWidth(ステージの横幅)" + stage.stageWidth + "\n" +
	"stage.stageHeight(ステージの縦幅)" + stage.stageHeight + "\n" +
	"\n" +
	"left_flg(←を押している)" + left_flg + "\n" +
	"right_flg(→を押している)" + right_flg + "\n" +
	"up_flg(↑を押している)" + up_flg + "\n" +
	"down_flg(↓を押している)" + down_flg + "\n" +
	"space_flg(スペースを押している)" + space_flg + "\n" +
	"z_flg(Zを押している)" + z_flg + "\n" +
	"x_flg(Xを押している)" + x_flg + "\n" +
	"\n" +
	"x(主人公横位置)" + Syuzinko.x + "\n" +
	"y(主人公縦位置)" + Syuzinko.y + "\n" +
	"vx(主人公横加速度)" + vx + "\n" +
	"vy(主人公縦加速度)" + vy + "\n" +
	"delay(攻撃のディレイ)" + delay + "\n" +
	"j_flg(ジャンプフラグ)" + j_flg + "\n" +
	"weapon(選択中の武器)" + weapon + "\n" +
	"timer(ゲームの時間軸)" + timer + "\n" +
	"rot(主人公の向き)" + rot + "\n" +
	"SCX " + SCX + "\n" +
	"scroll_x " + scroll_x + "\n" +
	"wait " + Syuzinko.wait + "\n"+
	"variety " + Syuzinko.variety + "\n"+
	"残りHP " + s_HP + "\n"+
	"残りSP " + s_SP + "\n";
	//"1番目の敵の横位置" + enemy_array01[0].x + scroll_x;	
	//"1番目の敵のディレイ" + enemy_array01[0].delay;
	//デバッグ用-------------------------------------------
});

449~533行目、変更前

//■ブロックぶつかり判定処理----------------------------------------
//□横からのぶつかり判定
	if(block_array.length != 0){
		s_right = Syuzinko.x + Syuzinko.width/2;//主人公の右端
		s_left  = Syuzinko.x - Syuzinko.width/2;//主人公の左端
		s_top   = Syuzinko.y - Syuzinko.height/2;//主人公の上端
		s_bottom= Syuzinko.y + Syuzinko.height/2;//主人公の下端
		for(i = 0 ; i < block_array.length ; i ++){
			b_right = block_array[i].x + block_array[i].width/2;//ブロックの右端
			b_left  = block_array[i].x - block_array[i].width/2;//ブロックの左端
			b_top   = block_array[i].y - block_array[i].height/2;//ブロックの上端
			b_bottom= block_array[i].y + block_array[i].height/2;//ブロックの下端

			//↓主人公が左から右へ触れた場合
			if(block_array[i].hitTestPoint(s_right-16,s_bottom-25) ||
			   block_array[i].hitTestPoint(s_right-16,s_top+25) && vx>0){
				if(SCX!=0){//画面端であれば
					vx = 0;//主人公が左から右へ触れた場合
					Syuzinko.x = b_left-Syuzinko.width/2+17;//衝突したブロックより左へ強制移動
				}else if(SCX==0){//スクーロル位置であれば
					vx = -vx;//衝突したブロックより左へ強制移動
					vx--;
					SToBlock=true;
				}
			//trace("左からあたる"+i+"番目のブロック、timer="+timer+" vx="+vx);
			break
			//↓主人公が右から左へ触れた場合
			}else if(block_array[i].hitTestPoint(s_left+16,s_bottom-25) ||
					 block_array[i].hitTestPoint(s_left+16,s_top+25) && vx<0){
				if(SCX!=0){//画面端であれば
				vx = 0;
				Syuzinko.x = b_right+Syuzinko.width/2-14;//衝突したブロックより右へ強制移動
				}else if(SCX==0){//スクロール位置であれば
					vx = -vx;//衝突したブロックより右へ強制移動
					vx++;
					SToBlock=true;
				}
			//trace("右からあたる" +i+"番目のブロック、 timer="+timer+" vx="+vx);
			break
			}else{
				//trace("横は特に処理なし"+i);
				}
		}
	}
//□縦からのぶつかり判定
	if(block_array.length != 0){
		s_right = Syuzinko.x + Syuzinko.width/2;//主人公の右端
		s_left  = Syuzinko.x - Syuzinko.width/2;//主人公の左端
		s_top   = Syuzinko.y - Syuzinko.height/2;//主人公の上端
		s_bottom= Syuzinko.y + Syuzinko.height/2;//主人公の下端
		for(i = 0 ; i < block_array.length ; i ++){
			b_right = block_array[i].x + block_array[i].width/2;//ブロックの右端
			b_left  = block_array[i].x - block_array[i].width/2;//ブロックの左端
			b_top   = block_array[i].y - block_array[i].height/2;//ブロックの上端
			b_bottom= block_array[i].y + block_array[i].height/2;//ブロックの下端
			
			if((block_array[i].hitTestPoint(s_right-20,s_top-14) ||
			   (block_array[i].hitTestPoint(s_left+20,s_top-14))) && vy<0){
				Syuzinko.y = b_bottom + Syuzinko.height/2;
				//trace("頭をぶつけた前。vy = "+vy+",timer= "+timer);
				vy =- vy/2;//ブロックに頭をぶつけた場合の処理
				//trace("頭をぶつけた後。vy = "+vy+",timer"+timer);
				break
			}else if(!((block_array[i].hitTestPoint(s_right-20,s_bottom+10)) ||
					   (block_array[i].hitTestPoint(s_left+20,s_bottom+10))) && !j_flg){
					//trace("ブロックから落ちる"+i+" timer="+timer);
					j_flg=true;
			}if((block_array[i].hitTestPoint(s_right-20,s_bottom+10) ||
				block_array[i].hitTestPoint(s_left+20,s_bottom+10)) && (vy>0 && j_flg)){
				Syuzinko.y = b_top - Syuzinko.height/2;
				vy=0;//ブロックに乗った場合の処理
				j_flg=false;
				//trace("ブロックに乗った瞬間"+i+" timer="+timer);
				break
			}if(block_array[i].hitTestPoint(s_right-20,s_bottom+10) ||
				block_array[i].hitTestPoint(s_left+20,s_bottom+10)){
				j_flg=false;
				//trace("とにかく足元にブロックがある"+i+" timer="+timer);
					if(Syuzinko.stun){vy=0;}//スタン中であれば加速度は0にする(背中でブロックを登るバグを防ぐ為)
				break
			}else{
				//trace("縦は特に処理なし"+i);
				}
		}
	}


おわり

拍手