DX라이브러리2014. 12. 26. 13:49

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으로 변화하게 된다.


Posted by 캡슐리어