날이 화창하고 꽃들이 잔뜩 피어나기 시작하니 말벌들이 집 주변에 집을 짓기 시작했다. 집 주변을 돌며 10여개의 막 짓기 시작한 말벌집들을 떼어냈다.
매년 이즈음의 연례 행사랄까.

15/5/9 토

 

Flash CS4 + ActionScript 3.0로 만든 방향탄 발사.

주인공기는 마우스를 따라 움직이게 하다.
타이머로 1초마다
적기에서 sin, cos을 이용한 방향탄을 발사하게 하다.
적탄은 화면을 나가면 제거되게 하다.

-----------------------------------------------------------------------------
조준탄에 비해 변형된 것은 적탄 발사 각도의 추가와 속도 벡터 구하는 방법,
360도 돌아가며 차례로 발사되게 하기 위해 발사 각도를 10도씩 증가,
각도가 무한히 늘어나지 않도록 360이 넘어서면 다시 10도로 되게 한 것뿐.

* 물론 각도를 일정하게 하면 일정한 방향으로만 발사를 하게 된다.

화면에 'playerM', 'enemyM'이란 이름의 주인공과 적 무비클립을 배치해 두고 'eBullet01M'이란 익스포트명의 적 총알 무비클립(내부에 't'란 이름의 다이나믹 텍스트를 만들어 두다)을 라이브러리에 만들어 두다.
var player = playerM; //화면상 플레이어 무비클립
var enemy = enemyM; //화면상 적 무비클립
var ebSpeed=2; //적탄 이동 속도
var ebTheta = 0;//적탄 발사 각도 초기화
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;//적탄 개별 이름 무비클립 내부 다이나믹 텍스트 박스에 표시하기
    
     //적탄 속도벡터 구하기
     eb.vx = Math.cos(Math.PI/180 * ebTheta)*ebSpeed;
     eb.vy = Math.sin(Math.PI/180 * ebTheta)*ebSpeed;
    
     stage.addChild(eb); //적탄 화면에 붙이기
     eBulletArr.push(eb); //적탄 배열에 추가
     ebTheta += 10;//적탄 발사 각도 변형
     if(ebTheta > 361) ebTheta = 10; //발사각도 한바퀴 넘으면 다시 10으로.
     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();

Flash CS4 + ActionScript 3.0로 만든 테이블을 이용한 16방향 방향탄 발사.

장점: 실수형이나 삼각함수를 이용할 필요 없는 정수형 만의 간단하고 가벼운 코드.
단점: 세세한 조정이 힘들고 방향마다 속도가 다르다. (대각선이 수직,수평 보다 빠르다)

속도를 3으로 지정한 16방향 적탄의 방향 테이블 배열을 미리 만들어 두고 발사 각도를 16방향으로 변형한 뒤 각 탄의 속도 벡터는 배열의 값을 가져와 구하는 방법,
360도 돌아가며 차례로 발사되게 하기 위해 발사 각도를 10도씩 증가,
각도가 무한히 늘어나지 않도록 351가 넘어서면 다시 0도로 되게 하다.(코드 상 각도가 360이 될 경우 dir 값이 16이 되어 (배열 수치를 넘어가기에)에러가 발생한다)

* 물론 각도를 일정하게 하면 일정한 방향으로만 발사를 하게 된다.
* 굳이 각도를 변환할 필요없이 각도에 맞는 배열의 숫자(1~16)를 그냥 지정해 줘도 된다.

var player = playerM; //화면상 플레이어 무비클립
var enemy = enemyM; //화면상 적 무비클립
//var ebSpeed=2; //적탄 이동 속도
var ebTheta = 0;//적탄 발사 각도 초기화
var num=0; //적탄 이름 번호용
var v3Arr:Array=[
                 [3,0],[3,1],[2,2],[1,3],
                 [0,3],[-1,3],[-2,2],[-3,1],
                 [-3,0],[-3,-1],[-2,-2],[-1,-3],
                 [0,-3],[1,-3],[2,-2],[3,-1],
                 ]; //속도 3일 때의 방향 테이블

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;//적탄 개별 이름 무비클립 내부 다이나믹 텍스트 박스에 표시하기

     //각도 늘려 방향 변환시키기
     ebTheta += 10;//적탄 발사 각도 변형
     if(ebTheta > 351) ebTheta = 0; //발사각도 한바퀴 넘으면 다시 0으로.
    
     //각도 ebTheta(0~360도)를 16방향(0~15)으로 변환하기
     eb.dir = int(ebTheta * 16 / 360);
    
     //적탄 속도벡터 구하기
     eb.vx = v3Arr[eb.dir][0];
     eb.vy = v3Arr[eb.dir][1];
    
     stage.addChild(eb); //적탄 화면에 붙이기
     eBulletArr.push(eb); //적탄 배열에 추가
     num++; //적탄 이름 번호 증가
     //trace(ebTheta, eb.vx, eb.vy);
}
function eBulletMove(){ //적 총탄 이동 처리
.........이하 위 sin, cos을 이용한 방향탄 코드와 동일.