DX라이브러리2014. 12. 26. 14:56

3.7 특정 각도로 탄을 날려보자


슈팅게임에서의 탄도는 특정각도를 통하여 궤도가 설정되고 이를 구현하기 위해서는 삼각함수의 지식이 필수적으로 필요하다. 간단하게 살펴보자면 다음과 같다.



직각삼각형의 밑변과 사변의 각도가 30도일 때는 각 변의 길이 비율이 1:2:√3 이된다. 하지만 게임제작에 있어서는 이런걸 기억하고 있어보았자 딱히 쓸모가 없다. 탄의 발사 각도는 정확히 30도가 아니다. 1도가 될수도 있고 65도가 될수도 있다.



이와 같이 각도가 θ일때 x와 y가 어떻게 되는가 정도는 계산이 가능해야 한다. 



학생시절 배운 것 처럼 알파뱃의 모양을 생각하여 표현했다.


sinθ= y/r

conθ=x/r


이것은 다음과 같은 부분에서 사용하게된다.


그림1. 탄을 보낼 방향과 좌표


위 그림처럼 좌하를 기준 좌표로 하고 우상방향으로 이동하는 탄이 있다고 가정해보자. 이 탄은 각도θ로 움직이며 r정도 움직였을 때의 좌표는 어디인가? 라는 질문의 답을 얻을 때 사용하게 된다. sinθ=y/r이므로 y=sinθ/r 이며 마찬가지로 x=cosθ/r 이 된다. 탄은 1프레임에 r의 거리만큼 움직이며 이 거리가 바로 탄의 속도가 된다. 


따라서 θ와 r을 고정하게 되면 x,y의 값은 그저 기존값에 늘어난 양 만큼 가산해주면 좌표가 갱신된다.


x += cosθ × r;

y += sinθ × r;


다음 예제에서 이를 확인해보자 θ를 변수 angle, r을 변수 speed로 선언한다. z키를 입력하면 좌표를 중앙으로 복귀시키고 각도와 속도를 랜덤으로 재설정한다. 생성된 변수값들은 화면의 좌상에 표시된다.


#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[3];

        LoadDivGraph( "image/bullet_01.png", 3, 3, 1, 14, 16, Handle );


        float x=320,y=240,angle=0,speed=1;


        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){


                x += cos( angle ) * speed; //x좌표를 갱신

                y += sin( angle ) * speed; //y좌표를 갱신


                if( CheckHitKey( KEY_INPUT_Z ) == 1 ){ //z키를 누르면

                        x = 320;        // x좌표를 초기화

                        y = 240;        // y좌표를 초기화

                        angle = GetRand(10000)/10000.f * (PI*2);        //0~PI*2의 난수 생성

                        speed = 0.5f + GetRand(10000)/10000.f * 2;      //0.5~2.5의 난수 생성

                }


                DrawRotaGraph( x, y, 1.0, angle+PI/2, Handle[0], TRUE );

                DrawFormatString( 0,0,GetColor(255,255,255), "angle=%.2f, speed=%.2f\n", angle, speed );


        }


        DxLib_End();

        return 0;

}


실행결과



참고로 탄 이미지의 최초 각도는 +PI/2로 되어있다. 기본이미지의 방향은 상단 방향인데 프로그램상 0도의 경우 화면의 오른쪽이 된다. 즉, 최초의 각도가 -PI/2로 되어있기 때문에 이를 보정해주기 위해 +PI/2를 추가한다. 만약 이미지의 방향이 최초부터 오른쪽 방향으로 되어있다면 +PI/2는 불필요 하다.


x += cosθ × r를 소스코드로 변환하면 x += cos( angle ) * speed;된다. y좌표도 동일하다. 이와같은 계산을 거치게 되면 각도 angle과 속도 speed로 탄을 움직일 수 있게 된다.

Posted by 캡슐리어