Flash+actionScript 3.0: 좌표 회전을 이용한 각이 있는 바운드 테스트.

'액션스크립트 3.0 애니메이션' 중 10. 좌표 회전과 각이 있는 바운드 예제 따라하기 + 수정하기.

방법은 일단 공과 가장 가까운 바닥을 선정하고 바닥과 공을 통째로 좌표 회전 시켜 평지에서의 바운드 값을 얻은 뒤 다시 바닥과 공을 원래대로 좌표 회전시키는 형태.

line들을 무비클립으로 바꾸고 공의 수를 5개로 늘리고 맨 밑의 바닥을 좌우로 기울게 수정.

스테이지상에 ball1~ball5, line1~line5 총 10개의 무비클립이 올려져 있다.

14/7/22 화

아래는 핵심이 되는 바닥의 각도를 구해 바운드를 계산하는 checkLine() 함수.
function checkLine(line:Sprite, ball){
	//라인의 바운드 박스 가져오기
	var bounds:Rectangle = line.getBounds(this);
	if(ball.x > bounds.left && ball.x < bounds.right){
		//각도와 사인, 코사인 미리 정의하여 타이핑 줄이기
		var angle:Number = line.rotation * Math.PI / 180;
		var cos:Number = Math.cos(angle);
		var sin:Number = Math.sin(angle);
		
		//공의 위치와 관계된 라인을 선택하기
		var x1:Number = ball.x - line.x;
		var y1:Number = ball.y - line.y;
		//좌표, 속도회전
		var y2:Number = cos * y1 - sin * x1;
		var vy1:Number = cos * ball.vy - sin * ball.vx;
		
		//회전된 값으로 바운드 설정하기
		if(y2 > -ball.height / 2 && y2 < vy1){
			//좌표, 속도회전
			var x2:Number = cos * x1 + sin * y1;
			var vx1:Number = cos * ball.vx + sin * ball.vy;
			
			y2 = -ball.height / 2;
			vy1 *= bounce;
			
			//모든 것을 되돌리는 회전
			x1 = cos * x2 - sin * y2;
			y1 = cos * y2 + sin * x2;
			ball.vx = cos * vx1 - sin * vy1;
			ball.vy = cos * vy1 + sin * vx1;
			ball.x = line.x + x1;
			ball.y = line.y + y1;
		}
	}
}