Flash CS4+ActionScript 3.0으로 키보드 방향키를 이용, 커서를 상하좌우로 이동시키고 커서의 이동에 따라 선이 그려지는 프로그램 만들기.
다 지워 버튼 클릭시 그동안 그려진 선들 모두 지우기.
키보드 H 클릭시 처음의 안내 화면 다시 띄우기.

원래는 벡터 내적, 외적을 이용한 처리 등을 테스트 해 볼 생각이었는데 어찌 하다보니 키보드 상하좌우 화살표 키로 커서를 조종하고 커서 위치를 따라 직선으로 그림을 그리는 70, 80년대 한 때 유행한 Etch A Sketch 비슷한 기능의 프로그램이 됐다.

15/4/06 월

* 벡터 관련.
* 선그리기 관련.
* 버튼 마우스 처리관련.
* 키보드 처리 관련.

'nemoM'이란 이름의 커서, 'butStart'(시작버튼), 'butE'(다 지우기 버튼)란 이름의 버튼들을 만들어 두다.
var vec1:Point=new Point();
var vec2:Point=new Point();
var speed = 3;
var left, right, up, down:Boolean=false;

function init(){
     vec1.x = 110, vec1.y = 100;
     nemoM.x = vec1.x, nemoM.y = vec1.y;
     vec2.x = nemoM.x, vec2.y = nemoM.y;
     lineDraw01(0,0,vec1.x,vec1.y);

     stage.addEventListener(Event.ENTER_FRAME,loop);
     stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDowns);
     stage.addEventListener(KeyboardEvent.KEY_UP,keyUps);
     butStart.start.addEventListener(MouseEvent.CLICK,butSclick);
     butStart.start.addEventListener(MouseEvent.MOUSE_OVER,butSover);
     butStart.start.addEventListener(MouseEvent.MOUSE_OUT,butSout);
     butE.addEventListener(MouseEvent.CLICK,butEclick);
     butE.addEventListener(MouseEvent.MOUSE_OVER,butEover);
     butE.addEventListener(MouseEvent.MOUSE_OUT,butEout);
}
function loop(e:Event){ //매 프레임 실행
     keyProcess(); //키보드 처리
     if(vec1.x != vec2.x || vec1.y != vec2.y){ //선 긋기 처리
          lineDraw01(vec2.x,vec2.y,nemoM.x,nemoM.y);
     }
     vec2.x = nemoM.x, vec2.y = nemoM.y;
}

function vecDot(x1, y1, x2, y2){
     //벡터 내적: A・B = x1*y1 + x2*y2 = |A||B| Cosθ
     return x1 * y1 + x2 * y2;
}
function vecCross(x1, y1, x2, y2){
     //벡터 외적: A×B = x1*y2 - x2*y1 = |A||B| Sinθ
     return x1 * y2 - x2 * y1;
}

function lineDraw01(mX,mY,tX,tY,style1=1,style2=0){ //선그리기 함수
     //(mX,mY)위치로 이동, 그곳에서 (tX,tY)까지 style(굵기,색)대로 선그리기
     graphics.lineStyle(style1, style2);
     graphics.moveTo(mX, mY);
     graphics.lineTo(tX, tY);
}

//시작 버튼 클릭시, 마우스 오버시, 마우스 아웃시 처리
function butSclick(e:MouseEvent){ butStart.x = -3000; } //안보이게 처리
function butSover(e:MouseEvent){ butStart.gotoAndStop(2); }
function butSout(e:MouseEvent){ butStart.gotoAndStop(1); }
//다지워 버튼 클릭시, 마우스 오버시, 마우스 아웃시 처리
function butEclick(e:MouseEvent){ graphics.clear(); } //화면 지우기
function butEover(e:MouseEvent){ butE.gotoAndStop(2);}
function butEout(e:MouseEvent){ butE.gotoAndStop(1);}

function keyProcess(){ //키보드 처리
     if(left && nemoM.x > 0){ nemoM.x -= speed; }
     if(right && nemoM.x < stage.stageWidth){ nemoM.x += speed; }
     if(up && nemoM.y > 0){ nemoM.y -= speed; }
     if(down && nemoM.y < stage.stageHeight){ nemoM.y += speed; }
}
function keyDowns(e:KeyboardEvent){ //키보드 눌릴때
     switch(e.keyCode){
          case(37): left = true; break; //left
          case(39): right = true; break; //right
          case(38): up = true; break; //up
          case(40): down = true; break; //down
          default: break;
     }
}
function keyUps(e:KeyboardEvent){ //키보드 뗄 때
     switch(e.keyCode){
          case(37): left = false; break; //left
            case(39): right = false; break; //right
          case(38): up = false; break; //up
          case(40): down = false; break; //down
            case(72): butStart.x = 123; break; //h
          default: break;
     }
}

init();