Flash CS4 + ActionScript 3.0로 만든 조준탄 발사.

주인공기는 마우스를 따라 움직이게 하다.
타이머로 1초마다 적기에서 주인공기 쪽을 향해 조준탄을 발사하게 하다.
적탄은 화면을 나가면 제거되게 하다.

-----------------------------------------------------------------------------
Flash CS4로 '게임 매니악스 슈팅게임 알고리즘' 중 2-1 조준탄 예제 따라하고 몇 가지 기능 추가.

eBulletTimer.addEventListener(TimerEvent.Timer, eBulletInit);
1119: Access of possibly undefined property Timer through a reference with static type Class. 란 에러 메시지와 함께 타이머 관련 에러로 막혔었는데 이벤트에서 TimerEvent.TIMER로 써야할 내용을 TimerEvent.Timer로 소문자로 써서 생긴 에러였다.
적탄이 주인공을 쫓아 일정한 속도로 발사되는데에는 성공했으나 적탄이 화면 밖으로 나갈 경우 제거시 에러가 발생, 먼저 생긴 적탄 보다 이후 생긴 적탄이 먼저 화면 밖에 나가 제거될 경우 에러가 발생하는 것이었는데 일단 try{}catch(er:Error){}구문으로 다운되는건 막았지만 여전히 헤메다.
- eb = null; 에서 eBulletArr[i] = null; 로 바꾸고 continue; 를 추가하여 수정하다.

15/5/8 금

화면에 'playerM', 'enemyM'이란 이름의 주인공과 적 무비클립을 배치해 두고 'eBullet01M'이란 익스포트명의 적 총알 무비클립(내부에 't'란 이름의 다이나믹 텍스트를 만들어 두다)을 라이브러리에 만들어 두다.
var player = playerM; //화면상 플레이어 무비클립
var enemy = enemyM; //화면상 적 무비클립
var speed=2; //적탄 이동 속도
var num=0; //적탄 이름 번호용

var eBulletArr:Array=new Array();
var eBulletTimer:Timer=new Timer(1000); //적탄 발사 타이머(1초)

function init(){
     Mouse.hide(); //마우스 커서 감추기
     player.startDrag(true); //주인공 마우스 커서 따라다니게 하기
    
     stage.addEventListener(Event.ENTER_FRAME, loop);
     eBulletTimer.addEventListener(TimerEvent.TIMER, eBulletInit);
     eBulletTimer.start(); //적탄 발사 타이머 시작
}
function loop(e:Event){ //기본 루프
     eBulletMove(); //적탄 움직임 처리 함수 호출
}
function eBulletInit(e:TimerEvent){ //적 총탄 생성 및 초기화
     var eb = new eBullet01M();
     eb.x = enemy.x, eb.y = enemy.y; //적탄 위치 초기화
     eb.vx = 0, eb.vy = 0; //적탄 속도벡터 초기화
     eb.nameIs = "e"+num; //디버깅용으로 개별 이름 붙이기
     eb.t.text=eb.nameIs; //적탄 개별 이름 무비클립 내부 다이나믹 텍스트 박스에 표시하기
    
     //주인공과 적 사이 거리 구하기
     var dist = Math.sqrt((player.x-enemy.x)*(player.x-enemy.x)
                              +(player.y-enemy.y)*(player.y-enemy.y));
     //적탄 속도벡터 구하기
     if(dist){ //거리가 0이 아니면
          //speed의 속도에 맞춰 일정 속도로 이동
          eb.vx = (player.x-enemy.x)/dist*speed;
          eb.vy = (player.y-enemy.y)/dist*speed;
     }else{ //거리가 0이면
          eb.vx = 0;
          eb.vy = speed; //적탄은 윗쪽 방향으로 이동
     }
    
     stage.addChild(eb); //적탄 화면에 붙이기
     eBulletArr.push(eb); //적탄 배열에 추가
     num++; //적탄 이름 번호 증가
}
function eBulletMove(){ //적 총탄 이동 처리
     //eBulletArr내 null값 요소 제거
     eBulletArr = eBulletArr.filter(eraseNull);
     for(var i=0; i < eBulletArr.length; ++i){
          var eb = eBulletArr[i];
          if(eb.x > -20 && eb.x < stage.stageWidth
             && eb.y > -20 && eb.y < stage.stageHeight){
               //적탄이 화면내 존재시
               eb.x += eb.vx; //기존 적탄 위치 더하기 속도 벡터
               eb.y += eb.vy;
          }else{ //적탄이 화면 밖으로 나갔을 경우
               try{
                    stage.removeChild(eb); //적탄 화면에서 제거
               }catch(er:Error){ trace("removeChild error"); }
               eBulletArr[i] = null; //적탄 배열에서 비우기 위해 null을 넣어두기
               continue; //다음으로 넘어가기
          }
     }
}
function eraseNull(element:*,index:uint,array:Array):Boolean{
     //배열 내부의 null 제거용 함수
     return (element != null);
}

init();