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을 이용한 방향탄 코드와 동일. |