Flash+actionScript 3.0으로 a* 길찾기 알고리즘을 구현해 보려고 일단 사전 준비 작업으로 맵 만들다 만든 작업물.

일단 플래시 화면을 마우스로 한 번 클릭한 뒤 키보드의 화살표키로 스마일 모양을 조종할 수 있다. 스마일은 화면 밖이나 파란 블럭으로 이동 못하게 만들었다.

* 배경 블럭들은 배열 2개와 동적으로 생성한 블럭 무비클립을 이용해 깔았다. 블럭의 형태는 블럭 무비클립의 프레임 번호에 따라 다른 그림을 그려둔 뒤 배열의 번호에따라 해당 블럭의 프레임 번호에 가 멈추도록 해서 구현.
관련함수: mapSetting(), blockArrange()

* aniIng라는 Boolean 변수로 스마일이 이동중에는 키보드의 입력 받기를 중단시킨 뒤 매 프레임 작동하는 loop 함수를 돌아가게 하여 이동을 처리하고 이동이 끝나면 키보드 입력을 받을 수 있는 상태로 만들어 스마일의 이동을 애니메이션으로 처리했다.
관련함수: loop(), keysDown(), movMoving()

아이디어가 떠오르는대로 바로바로 만들어 가서 꽤 지저분, 스파게티스러운 코드가 됐다.

14/8/5 화

actionScript 3.0 소스 코드:
var maps:Array = [1,1,2,1,1,1,1,1,2,2,
				  1,1,1,2,2,1,1,4,1,1,
				  2,1,1,1,2,1,1,1,1,1,
				  2,1,1,1,2,1,1,1,1,2,
				  1,3,1,1,2,1,1,1,1,1,
				  1,1,1,1,1,1,1,1,2,1,
				  1,1,1,1,1,1,1,1,2,2,
				  1,1,1,1,1,1,1,1,1,1,
				  ]; //배경 블럭 형태 담을 배열
var maps2:Array=new Array(); //배경 블럭 무비 담을 배열
var mapsContainer = new Sprite(); //배경 블럭 무비 담을 컨테이너
//var changeTimer:Timer=new Timer(200);

var startN:MovieClip=new ballM();
var goalN;
var openNode:Array=new Array();
var closeNode:Array=new Array();
var aniIng:Boolean = false; //애니 중 여부
var dx=0, dy=0; //움직일 거리용 변수
var moveTo:String=""; //가로 세로 움직임 여부

function init(){//초기화
	mapSetting(maps);
	addChild(startN);
	startN.now = 42;
	startN.next = -1;
	startN.x = maps2[startN.now].x;
	startN.y = maps2[startN.now].y;
	
	stage.addEventListener(KeyboardEvent.KEY_DOWN, keysDown);
	stage.addEventListener(Event.ENTER_FRAME, loop);
}
function loop(e:Event){//움직임 애니 처리
	if(aniIng){
		switch(moveTo){
			case "xMove":{
				if(Math.abs(dx) > 0.1){
					startN.x += dx/2;
					dx = dx/2;
				}else{ 
					dx = 0;
					startN.x = maps2[startN.now].x;
					aniIng=false;
					moveTo = "";
				}
				break;}
			case "yMove":{
				if(Math.abs(dy) > 0.1){
					startN.y += dy/2;
					dy = dy/2;
				}else{ 
					dy = 0;
					startN.y = maps2[startN.now].y;
					aniIng=false; 
					moveTo = "";
				}
				break;}
		}
		trace(dx, dy, aniIng);
	}
}
function keysDown(e:KeyboardEvent){//키보드 입력 처리
	//trace(e.keyCode);
	if(!aniIng){
	switch(e.keyCode){
		case 38: movMoving(startN, "up"); break;//위쪽 화살표
		case 40: movMoving(startN, "down"); break;//아래쪽 화살표
		case 37: movMoving(startN, "left"); break;//왼쪽 화살표
		case 39: movMoving(startN, "right"); break;//오른쪽 화살표
	}
	}
}
function movMoving(mov:MovieClip, directions:String){//움직임 처리
	switch(directions){
		case "up":{
			mov.next = mov.now - 10;
			if(mov.next < 0){trace("out"); break;}
			if(maps2[mov.next].num != 2){
				//mov.y -= 50;
				mov.now -= 10;
				aniIng = true;
				moveTo = "yMove";
				dy = -50;
			}
			mov.next = -1;
			break;
		}
		case "down":{
			mov.next = mov.now + 10;
			if(mov.next > maps2.length-1){trace("out"); break;}
			if(maps2[mov.next].num != 2){
				//mov.y += 50;
				mov.now += 10;
				aniIng = true;
				moveTo = "yMove";
				dy = 50;
			}
			mov.next = -1;
			break;
		}
		case "left":{
			mov.next = mov.now - 1;
			if(mov.next%10 ==9 || mov.next ==-1){trace("out"); break;}
			if(maps2[mov.next].num != 2){
				//mov.x -= 50;
				mov.now -= 1;
				aniIng = true;
				moveTo = "xMove";
				dx = -50;
			}
			mov.next = -1;
			break;
		}
		case "right":{
			mov.next = mov.now + 1;
			if(mov.next%10 ==0){trace("out"); break;}
			if(maps2[mov.next].num != 2){
				//mov.x += 50;
				mov.now += 1;
				aniIng = true;
				moveTo = "xMove";
				dx = 50;
			}
			mov.next = -1;
			break;
		}
	}
	trace(mov.now);
}
function mapSetting(map){//배경 블럭 처리
	for(var i = 0; i < map.length; i++){
		var form = map[i];
		blockArrange(blockM, form, i);
	}
}
function blockArrange(mov, frameNumber, intervalX){ //배경 블럭 생성
	var b = new mov();
	addChild(b);
	b.gotoAndStop(frameNumber);
	b.num = frameNumber;
	b.x = (0 + intervalX * 50)%500;
	b.y = (0 + Math.floor(intervalX / 10) * 50);
	maps2.push(b);
}
init();

* 오늘 웹 서핑 중 흥미로웠던 것: 영국 엔지니어인 로저 J. 소여(Roger J. Shawyer)가 2006년 제안한 우주선 추진 시스템 emDrive. 이 기구는 마이크로 파를 만들어내는 마그네트론을 이용한다는데 특이한건 이 기구가 탐지 가능한 에너지 손실이 없이 추진력을 만들어낸다고 소여가 주장했던 것. 엔진은 전기 발생을 위한 소량의 외부 에너지 주입은 필요하지만 반응 물질은 필요없다고 한다. 과학자들이 말도 안된다고 무시해 왔었던 모양인데 중국에서 실험에 성공하고 이후 나사에서도 실험에 성공하는 바람에 놀라고들 있는 모양.

emDrive 공식홈페이지: http://emdrive.com/
위키피디아 emDrive 항목(영문): http://en.wikipedia.org/wiki/Emdrive
관련 내용이 모여있는 블로그: http://blog.naver.com/windwell11/220081261097