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;
		}
	}
}
* 도서관에 책 반납/대출을 위해 당일치기로 서울에 갔다왔다. 피곤.
* 남산 정상엔 몰려드는 중국인 관광객들의 관광버스로 인해 남산순환버스가 움직이기 힘들 정도로 복닥복닥.
* 버거킹의 3,900원 짜리 HERO 세트의 새 메뉴인 슈퍼 탄두리는 맛이 좋아 맘에 들었다.
* 도서관에 가기 전엔 매번 자제해야지 하면서도 막상 가고 나면 가방이 터지도록 담아 오고 싶은 욕구에 빠지곤 한다.
* 담배 This의 포장 디자인이 심플, 깔끔하게 바뀌었다. This Plus, This Africa, This Wild 등의 디자인에 비해 오랫동안 고전적인 디자인을 유지해 왔었는데 최근 바뀐듯.
* 꽤 오래 방치해둔 마당은 역시 야생화되어가고 있다.
* 하루종일 금방이라도 비가 내릴 듯한 날씨였지만 집에 돌아오고 얼마 안되어서야 비가 내렸다. 운이 좋았군.