최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

   포물선 운동과 공


step09 : 움직임과 위치를 랜덤하게 설정하기


step09에서는 랜덤하게 vx와 vy를 지정하고 공의 바운드 되는 바닥(bottom)또한 랜덤하게 설정한다.


랜덤에 관한 계산은 함수로 만들어서 사용하도록 하며, 여기에서 중요한 것은


공의 바운드 되는 바닥이 마이너스(모니터상 y축이 위로)될 수록 공의 원근감을 표현하기 위해 공의 사이즈가 작아진다는 것이다.


이것 또한 앞의 내용과 마찬가지로 비례식을 사용하도록 하겠다.


먼저 랜덤함수는 http://serpiko.tistory.com/314 에 자세하게 설명 되어져 있고 자바스크립트나 as3.0이나 제공하는 스펙은 비슷하다.


함수로 표현하면 


function randomize($min:Number, $max:Number):Number

{

return Math.random() * ($max - $min) + $min;

}


이렇게 표현할 수 있는데 엄밀히 따지자면 $max의 값은 포함하지 않는다.


예를 들어 randomize(2, 8) 을 호출했을 경우 2 ~ 7.999999999999 가 반환된다는 뜻이다.


앞에서 계속 사용했던 비례식도 함수로 만들면 아래와 같다.


function proportional($A:Number, $a:Number, $B:Number):Number

{

//proportional_1(16, 9, 1920);

var b:Number = $a * $B / $A;

return b;

}


proportional(16, 9, 1920) 을 호출하면 16 : 9의 1920 해상도의 나머지인 1080을 반환 할 것이다.



소스)


step09.fla



import flash.events.Event;
import flash.display.Sprite;
import flash.filters.BlurFilter;
import flash.filters.BitmapFilterQuality;

var g:Number = 1;
var vx:Number = int(randomize(-10, 20));
var vy = int(randomize(5, 13));
var rot:Number = vx;

var bottom:Number = randomize( stage.stageHeight - (ball.height/2), (stage.stageHeight/2) ); //바운드되는 범위


ball.width  = proportional( stage.stageHeight - (ball.height/2), bottom, ball.width);
ball.height = proportional( stage.stageHeight - (ball.height/2), bottom, ball.height);

var _eclipse_sizeW:Number;

var _eclipse:Sprite = new Sprite();
_eclipse.graphics.beginFill(0x000000, 0.7);
_eclipse.graphics.drawEllipse(-ball.width/2, -20/2, ball.width, 20);
_eclipse.graphics.endFill();

_eclipse.x = ball.x;
_eclipse.y = bottom + (ball.height/2) + 10;

_eclipse_sizeW = ball.width * 70 / 100; //그림자는 볼의 70%사이즈
_eclipse.width = _eclipse_sizeW;

_eclipse_sizeW = percent(ball.width, 70);
_eclipse.width = _eclipse_sizeW;

var blur:BlurFilter = new BlurFilter(10, 5, BitmapFilterQuality.HIGH);
_eclipse.filters = [blur];

addChild(_eclipse);

var num:int = this.numChildren;
this.setChildIndex(ball, num-1);
//addChild(ball);

this.addEventListener(Event.ENTER_FRAME, function(e:Event):void{
					  	  vy += g;
						  ball.y += vy;
						  ball.x += vx;
						  ball.rotation += rot;
						  
						  _eclipse.x = ball.x;
						  _eclipse.alpha = proportional(bottom, ball.y, 1);
					      _eclipse.width = proportional(bottom, ball.y, _eclipse_sizeW);
			
						  if( ball.x > stage.stageWidth - (ball.width/2) ) {
							ball.x = stage.stageWidth - (ball.width/2);
							vx = -vx;
							rot = -rot;
						  }
						  if( ball.x < (ball.width/2) ) {
							ball.x = ball.width/2;
							vx = -vx;
							rot = -rot;
						  }

						  if( ball.y > bottom ) {
							ball.y = bottom;
							vy = -vy;
						  }
						  if( ball.y < (ball.height/2) ) {
							ball.y = ball.height/2;
							vy = -vy;
						  }
					  });

function percent($target:Number, $per:Number):Number
{
	return $target * $per / 100;
}

function proportional($A:Number, $a:Number, $B:Number):Number
{
	//proportional_1(16, 9, 1920);
	var b:Number = $a * $B / $A;
	return b;
}

function randomize($min:Number, $max:Number):Number
{
	return Math.random() * ($max - $min) + $min;
}

 


7 : vx 는 -10 ~ 20의 범위를 가진다.


8 : vy는 처음에는 무조건 아래로 떨어져야 하므로 양수인 5 ~ 13을 지정해 준다.


11 : 공이 바운드 될 바닥인 bottom은 


       공이 바운드 될 최하 지점인 stage.stageHeight - (ball.height/2) 와,  스테이지 높이의 절반인 stage.stageHeight/2 에서


       랜덤하게 지정되 도록 한다.


14~15 : 비례함수 proportional 을 사용하여 공이 최하점 stage.stageHeight - (ball.height/2)  일때는 공의 원본 사이즈를


            그렇지 않고 다른 최하점 bottom을 가지면 bottom의 y에 따라 공의 사이즈를 변화 시킨다.


            stage.stageHeight - (ball.height/2) : bottom = 공의 width 100% : 공 w


            공.width =  bottom *  공의 width 100%  /  stage.stageHeight - (ball.height/2) 로 표현할 수 있고


            proportional 함수를 만들었으므로 proportional 에 매개변수로 


            proportional( stage.stageHeight - (ball.height/2), bottom, ball.width) 를 넘겨 결과값을 반환 받는다.




결과)






















댓글