リプタクのもう覚えられません
Google
Web サイト内
topmemo ▶ 配列で障害物を作るサンプル2

ActionScript

配列で障害物を作るサンプル2

マトリクス状に作成した配列を元に障害物を作成するサンプル。

【サンプル】「←,→,↑,↓」キーでムービークリップ(赤)移動

JavaScriptを有効にし、最新のFlashPlayerをインストールお願いしますGet Adobe Flash player



考え方イメージ
考え方

アクションスクリプト3.0




//---------------------------------------------------------------配列で障害物マップを作成
var mapArr:Array = [
				 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],//y=0 x=0〜19
				 [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],//y=1 x=0〜19
				 [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],//y=2 x=0〜19
				 [0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0],//y=3 x=0〜19
				 [0,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,0],//y=4 x=0〜19
				 [0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0],//y=5 x=0〜19
				 [0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0],//y=6 x=0〜19
				 [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],//y=7 x=0〜19
				 [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],//y=8 x=0〜19
				 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]//y=9 x=0〜19
				 ];

var xxx:int;//配列取得用横マスカウンタ
var yyy:int;//配列取得用縦マスカウンタ

//---------------------------------------------------------------配列を調べて障害物を配置
//配列の中身を確認してブロックを配置
while(yyy < mapArr.length){

	//データに0があったら印を配置
	if(mapArr[yyy][xxx] == 0){
		var m0_mc:Cla_M0 = new Cla_M0();
		addChild(m0_mc);
		m0_mc.x = xxx * 36;
		m0_mc.y = yyy * 36;
	}
	
	//データに1があったら印を配置
	if(mapArr[yyy][xxx] == 1){
		var m1_mc:Cla_M1 = new Cla_M1();//障害物オブジェクト
		addChild(m1_mc);
		m1_mc.x = xxx * 36;
		m1_mc.y = yyy * 36;
	}
	
	//次のデータ確認にカウントアップ
	//xxxがmaxだったらxxx=0,yyy++ それ以外はxxx++
	if(xxx == mapArr[yyy].length-1){
		xxx = 0;
		yyy ++;
	}else{
		xxx ++;
	}
}

//---------------------------------------------------------------プレイヤー
var p_mc:Cla_P = new Cla_P();
addChild(p_mc);
p_mc.x = 200;
p_mc.y = 200;

var speed:int = 8;//移動スピード
var xMax:int=0;//「→」移動可能x座標
var xMin:int=0;//「←」移動可能x座標
var yMin:int=0;//「↑」移動可能y座標
var yMax:int=0;//「↓」移動可能y座標
var keyFlag:Array = [0,0,0,0];//「→」「←」「↑」「↓」おした状態「1」

stage.addEventListener(KeyboardEvent.KEY_DOWN,func_stage_KEY_DOWN);
stage.addEventListener(KeyboardEvent.KEY_UP,func_stage_KEY_UP);

//キーが押された
function func_stage_KEY_DOWN(e:KeyboardEvent):void{
	
	switch (e.keyCode) {
		case 39 ://「→」
			if(keyFlag[0] == 0){
				keyFlag[0] = 1;
				stage.addEventListener(Event.ENTER_FRAME,func_R_ENTER_FRAME);
			}
			break;
		case 37 ://「←」
			if(keyFlag[1] == 0){
				keyFlag[1] = 1;
				stage.addEventListener(Event.ENTER_FRAME,func_L_ENTER_FRAME);
			}
			break;
		case 38 ://「↑」
			if(keyFlag[2] == 0){
				keyFlag[2] = 1;
				stage.addEventListener(Event.ENTER_FRAME,func_U_ENTER_FRAME);
			}
			break;
		case 40 ://「↓」
			if(keyFlag[3] == 0){
				keyFlag[3] = 1;
				stage.addEventListener(Event.ENTER_FRAME,func_D_ENTER_FRAME);
			}
			break;
	}
}

//キーが離れた
function func_stage_KEY_UP(e:KeyboardEvent):void{
	
	switch (e.keyCode) {
		case 39 ://「→」
			keyFlag[0] = 0;
			stage.removeEventListener(Event.ENTER_FRAME,func_R_ENTER_FRAME);
			break;
		case 37 ://「←」
			keyFlag[1] = 0;
			stage.removeEventListener(Event.ENTER_FRAME,func_L_ENTER_FRAME);
			break;
		case 38 ://「↑」
			keyFlag[2] = 0;
			stage.removeEventListener(Event.ENTER_FRAME,func_U_ENTER_FRAME);
			break;
		case 40 ://「↓」
			keyFlag[3] = 0;
			stage.removeEventListener(Event.ENTER_FRAME,func_D_ENTER_FRAME);
			break;
	}
}

//---------------------------------------------------------------移動処理

/*
考え方
隣接するブロックがあるか調べて移動
移動前の位置によって調べるブロック位置と数が異なる
*/

//→移動
function func_R_ENTER_FRAME(e:Event):void{
	func_xy();
	if(p_mc.x+speed <= xMax){
		p_mc.x += speed;
	}else{
		trace("→接触");
		p_mc.x = xMax;
	}
}

//←移動
function func_L_ENTER_FRAME(e:Event):void{
	func_xy();
	if(xMin <= p_mc.x-speed){
		p_mc.x -= speed;
	}else{
		trace("←接触");
		p_mc.x = xMin;
	}
}

//↑移動
function func_U_ENTER_FRAME(e:Event):void{
	func_xy();
	if(yMin <= p_mc.y-speed){
		p_mc.y -= speed;
	}else{
		trace("↑接触");
		p_mc.y = yMin;
	}
}

//↓移動
function func_D_ENTER_FRAME(e:Event):void{
	func_xy();
	if(p_mc.y+speed <= yMax){
		p_mc.y += speed;
	}else{
		trace("↓接触");
		p_mc.y = yMax;
	}
}

//移動範囲チェック
function func_xy(){
	
	var mSize:int=36;//1マスの大きさ
	
	var pW:int=18;//プレイヤー横幅
	var pH:int=18;//プレイヤー縦幅
	
	var xxxP:int = int(p_mc.x / mSize);//配列取得用x座標
	var yyyP:int = int(p_mc.y / mSize);//配列取得用y座標
	
	//パターンチェック
	switch (true){
		case p_mc.x%mSize + pW <= mSize && p_mc.y%mSize + pH <= mSize://------1マスパターン
			//xMaxの計算
			if(mapArr[yyyP][xxxP+1] == 0){
				xMax = (xxxP+1)*mSize;
			}else{
				xMax = (xxxP+1)*mSize-pW;
			}
			//xMinの計算
			if(mapArr[yyyP][xxxP-1] == 0){
				xMin = (xxxP-1)*mSize;
			}else{
				xMin = (xxxP)*mSize;
			}
			//yMinの計算
			if(mapArr[yyyP-1][xxxP] == 0){
				yMin = (yyyP-1)*mSize;
			}else{
				yMin = (yyyP)*mSize;
			}
			//yMaxの計算
			if(mapArr[yyyP+1][xxxP] == 0){
				yMax = (yyyP+1)*mSize;
			}else{
				yMax = (yyyP+1)*mSize-pH;
			}
			break;
		case p_mc.x%mSize + pW > mSize && p_mc.y%mSize + pH <= mSize://------横2マスパターン
			//xMaxの計算
			if(mapArr[yyyP][xxxP+2] == 0){
				xMax = (xxxP+2)*mSize;
			}else{
				xMax = (xxxP+2)*mSize-pW;
			}
			//xMinの計算
			if(mapArr[yyyP][xxxP-1] == 0){
				xMin = (xxxP-1)*mSize;
			}else{
				xMin = (xxxP)*mSize;
			}
			//yMinの計算
			if(mapArr[yyyP-1][xxxP] == 0 && mapArr[yyyP-1][xxxP+1] == 0 ){
				yMin = (yyyP-1)*mSize;
			}else{
				yMin = (yyyP)*mSize;
			}
			//yMaxの計算
			if(mapArr[yyyP+1][xxxP] == 0 && mapArr[yyyP+1][xxxP+1] == 0){
				yMax = (yyyP+1)*mSize;
			}else{
				yMax = (yyyP+1)*mSize-pH;
			}
			break;
		case p_mc.x%mSize + pW <= mSize && p_mc.y%mSize + pH > mSize://------縦2マスパターン
			//xMaxの計算
			if(mapArr[yyyP][xxxP+1] == 0 && mapArr[yyyP+1][xxxP+1] == 0){
				xMax = (xxxP+1)*mSize;
			}else{
				xMax = (xxxP+1)*mSize-pW;
			}
			//xMinの計算
			if(mapArr[yyyP][xxxP-1] == 0 && mapArr[yyyP+1][xxxP-1] == 0){
				xMin = (xxxP-1)*mSize;
			}else{
				xMin = (xxxP)*mSize;
			}
			//yMinの計算
			if(mapArr[yyyP-1][xxxP] == 0){
				yMin = (yyyP-1)*mSize;
			}else{
				yMin = (yyyP)*mSize;
			}
			//yMaxの計算
			if(mapArr[yyyP+2][xxxP] == 0){
				yMax = (yyyP+2)*mSize;
			}else{
				yMax = (yyyP+2)*mSize-pH;
			}
			break;
		case p_mc.x%mSize + pW > mSize && p_mc.y%mSize + pH > mSize://------縦横4マスパターン
			//xMaxの計算
			if(mapArr[yyyP][xxxP+2] == 0 && mapArr[yyyP+1][xxxP+2] == 0){
				xMax = (xxxP+2)*mSize;
			}else{
				xMax = (xxxP+2)*mSize-pW;
			}
			//xMinの計算
			if(mapArr[yyyP][xxxP-1] == 0 && mapArr[yyyP+1][xxxP-1] == 0){
				xMin = (xxxP-1)*mSize;
			}else{
				xMin = (xxxP)*mSize;
			}
			//yMinの計算
			if(mapArr[yyyP-1][xxxP] == 0 && mapArr[yyyP-1][xxxP+1] == 0 ){
				yMin = (yyyP-1)*mSize;
			}else{
				yMin = (yyyP)*mSize;
			}
			//yMaxの計算
			if(mapArr[yyyP+2][xxxP] == 0 && mapArr[yyyP+2][xxxP+1] == 0){
				yMax = (yyyP+2)*mSize;
			}else{
				yMax = (yyyP+2)*mSize-pH;
			}
			break;
	}
}



last update 2011.3.2
参考・出典等
「特に無し」

▲page top

topmemogalleryblogtestaboutlinksmail
Copylight(C)2008-2011 Riptac. All Rights Reserved.