3.6 sin함수를 이용한 매끄러운 이동
sin파의 특정 부분부터 특정 부분까지 이동시키는 것도 가능하다.
붉은 부분 (x가 0~PI/2의 부분)에서의 y는 0에서 시작하여 PI/2에 가까워질수록 변화량이 작아진다. x가 PI/2가 되면 y값은 1이 된다. sin파의 경우 x의 값이 0일 때 y값의 변화가 가장 크다. 이 지점부터 점점 느려지면서 멈추는 이미지가 된다. 그에 반해서 다음 그래프의 경우는 천천히 시작해서 천천히 멈추는 sin파의 역시 존재한다.
x가 2PI-PI/2 ~ 2PI+PI/2
이와 같은 두 구간을 이용하는 것으로 다음과 같은 움직임을 구현 가능하다.
- 갑자기 움직이기 시작해서 천천히 멈춘다.
- 첨천히 움직이기 시작해서 천천히 멈춘다.
단, 이런식의 사용은 y가 -1에서 1 사이의 값을 가지기 때문에 sin파에 1을 더한 후 2로 나누어 0에서 1의 값을 갖도록 하는 경우가 많다.
이 그래프가 (sin파+1)/2 를 통해서
이렇게 변한다.
다음 예제는 Z키를 입력하면 2종류의 sin파를 사용하여 움직이는 프로그램이다.
#include <math.h> #include "DxLib.h" #define PI 3.1415926f int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); int Handle; int Count = 0; Handle = LoadGraph( "image/character_01.png" ); while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ DrawRotaGraph( 420, 400-sin(PI/2/120*Count)*300, 1.0, 0.0, Handle, TRUE ); DrawRotaGraph( 220, 400-(sin(-PI/2+PI/120*Count)+1)/2*300, 1.0, 0.0, Handle, TRUE ); if( Count < 120 ){ Count++; } if( CheckHitKey( KEY_INPUT_Z ) == 1 ){ Count = 0; } } DxLib_End(); return 0; } |
실행결과
왼쪽 : -PI/2~PI/2의 범위를 사용한 이동
오른쪽 : 0~PI/2의 범위를 사용한 이동
왼쪽의 y의 계산식은 "400-sin(PI/2/120*Count)*300"이다. 위 예제에서 Count는 120까지 상승하고 PI는 120으로 나누었기 때문에 변화하는 값은 0에서 PI/2까지가 되겠다. 여기에 300을 곱한 후 400에서 빼주기 때문에 y의 값은 400에서 100까지 변화한다.
오른쪽 y의 계산식은 "400-(sin(-PI/2+PI/120*Count)+1)/2*300"이다. 우선 sin함수에서 내부에서 계산 값은 -PI/2~PI/2가 된다. 이에 sin함수가 반환하는 값은 -1~1이 된다. 이를 0~1로 변화시키기 위해 1을 더하고 다시 2로 나누었다. 이후 다시 300을 곱하게 되면 y의 값은 왼쪽 과 마찬가지로 400에서 100으로 변화하게 된다.
'DX라이브러리' 카테고리의 다른 글
3.11 세이브데이터 만드는법 (1) | 2014.12.30 |
---|---|
3.7 특정 각도로 탄을 날려보자 (0) | 2014.12.26 |
3.5 sin 함수를 이용한 물체 이동 / 확대축소 (0) | 2014.12.24 |
3.4 간단한 선택화면 (역방향 루프) (0) | 2014.12.24 |
3.3 간단한 선택화면 (0) | 2014.12.24 |