Flash CS4 + ActionScript 3.0으로 게임 수학/물리 구현 공부 계속.

1-6: 물체를 원운동 시키기(삼각함수).

삼각함수를 이용해 물체를 원운동 시키기.

14/12/6 토

소스(스테이지상에 미리 'bflym'이란 이름의 날개짓하는 나비 무비클립을 놓아두었다):

var bfly = bflym;
var fAngle = 3.14; //초기 각도값
var rotR = 80; //회전 반지름값
var rightEnd = stage.stageWidth; //화면 우측끝
var downEnd = stage.stageHeight; //화면 하단끝

function init(){
	stage.addEventListener(Event.ENTER_FRAME,loop);
}
function loop(e:Event){
	//화면중앙 중심회전
	bfly.x = rotR * Math.cos(fAngle)+(rightEnd-bfly.width)/2; 
	bfly.y = rotR * Math.sin(fAngle)+(downEnd-bfly.height)/2;
	//마우스 위치 중심 회전
	//bfly.x = rotR * Math.cos(fAngle)+mouseX; 
	//bfly.y = rotR * Math.sin(fAngle)+mouseY;
	//진행방향으로 회전시키기
	bfly.rotation = fAngle*180/Math.PI;
	fAngle += 2*Math.PI/120; //각도 증가(매번 +3도)
}
init();

 


1-6a: 물체를 원운동 시키기(향심력).

향심력를 이용해 물체를 원운동 시키기.

향심력을 이용하면 삼각함수를 쓰지않고도 원운동을 만들 수 있다.
(이 예제에선 방향에따라 나비를 회전시키기위해 atan2를 쓰긴 했다만 회전운동 자체와는 상관없다.)
그외 나비의 이동 경로에 따라 선을 그리기 위해 graphics.line을 이용했다.

소스(스테이지상에 미리 'bflym'이란 이름의 날개짓하는 나비 무비클립을 놓아두었다):

var bfly = bflym;
var fAngle = 0; //초기 각도값
var rotR = 100; //회전 반지름값
var angVel = -2*Math.PI/120; //각속도값 3도
var rightEnd = stage.stageWidth;
var downEnd = stage.stageHeight;
var line:Sprite=new Sprite();

function init(){
	bfly.rx = rotR;
	bfly.ry = 0;
	bfly.vx = 0;
	bfly.vy = rotR * angVel;
	bfly.x = bfly.rx + rightEnd/2;
	bfly.y = bfly.ry + downEnd/2;
	
	addChild(line); //회전 궤적 그릴 선 추가
	line.graphics.lineStyle(1);
	line.graphics.moveTo(bfly.x, bfly.y);
	
	stage.addEventListener(Event.ENTER_FRAME,loop);
}
function loop(e:Event){
	bfly.rx += bfly.vx;
	bfly.ry += bfly.vy;
	bfly.vx += -angVel * angVel * bfly.rx; //향심력 계산
	bfly.vy += -angVel * angVel * bfly.ry;
	bfly.x = bfly.rx + rightEnd/2; 
	bfly.y = bfly.ry + downEnd/2;
	//진행방향으로 회전시키기
	fAngle = Math.atan2(bfly.y-200, bfly.x-275);
	bfly.rotation = fAngle*180/Math.PI;
	
	if(bfly.rx > 100){ //한바퀴 돌때마다 선 색 변경
		line.graphics.clear();
		var colors=Math.random()*16777215;
		line.graphics.lineStyle(1, colors, 1);
		line.graphics.moveTo(bfly.x, bfly.y);
	}
	line.graphics.lineTo(bfly.x, bfly.y);
}
init();