강의, 책/[DirectX, C++] 게임 매니악스 알고리즘 시리즈

[슈팅 알고리즘] Chapter 2. 탄환 (n-way탄)

hye3193 2024. 4. 19. 16:38

2.9 n-way탄

n-way탄이란 부채꼴 모양으로 발사되는 탄환을 말한다

이를 발사하기 위해서는 방향탄을 응용하여, 중심선을 향해 날아가는 탄환을 기준으로 θ만큼 틀어가며 발사하면 된다

void RotateVelocity(
    float theta, // 회전각도
    float vx0, float vy0, // 원래 속도
    float& vx, float& vy // 회전 후의 속도
) {
    // theta를 라디안으로 변환하여 cos과 sin값 구하기
    // -> 삼각함수의 인자로 라디안을 전달해야 하기 때문
    float rad = M_PI / 180 * theta;
    float c = cos(rad), s = sin(rad);
    
    // 속도 벡터(vx0, vy0)을 회전시킨 (vx, vy) 구하기
    vx = vx0 * c - vy0 * s;
    vy = vx0 * s + vy0 * c;
}

위와 같은 방식으로 각 탄환의 속도 벡터를 구할 수 있다

중심이 되는 탄환의 속도를 정한 뒤, 그 속도 벡터를 중심으로 좌우로 회전시키면 된다

 

void InitNWayBullets(
    float vx0, float vy0, // 중심이 되는 탄환의 속도
    float theta, // 탄환과 탄환 사이의 각도
    int n, // 탄환의 수
    float vx[], float vy[] // n-way탄의 속도
) {
    // 탄환과 탄환 사이의 각도를 라디안으로 변환하기
    float rad_step = M_PI / 180 * theta;
    
    // 가장자리의 탄환과 중심부분의 탄환의 각도를 계산하기
    float rad = n % 2 ? -n / 2 * rad_step : (-n / 2 + 0.5) * rad_step;
    
    // n개의 탄환의 속도를 계산하기
    for (int i = 0; i < n; i++, rad += rad_step) {
        // 속도 벡터 (vx0, vy0)을 rad만큼 회전시키기
        float c = cos(rad), s = sin(rad);
        vx[i] = vx0 * c - vy0 * s;
        vy[i] = vx0 * s + vy0 * c;
    }
}

위 코드를 이용하여 n개의 탄환의 속도 벡터를 초기화하는 함수이다

회전 하는 코드는 회전 변환 행렬에 속도 벡터를 곱한 것이라고 생각하면 된다

위와 같은 방식이다