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개의 탄환의 속도 벡터를 초기화하는 함수이다
회전 하는 코드는 회전 변환 행렬에 속도 벡터를 곱한 것이라고 생각하면 된다
위와 같은 방식이다
'강의, 책 > [DirectX, C++] 게임 매니악스 알고리즘 시리즈' 카테고리의 다른 글
[슈팅 알고리즘] Chapter 2. 탄환 (분열탄) (1) | 2024.04.19 |
---|---|
[슈팅 알고리즘] Chapter 2. 탄환 (원형탄) (0) | 2024.04.19 |
[슈팅 알고리즘] Chapter 2. 탄환 (탄환의 위치) (0) | 2024.04.19 |
[슈팅 알고리즘] Chapter 2. 탄환 (방향탄) (0) | 2024.04.19 |
[슈팅 알고리즘] Chapter 2. 탄환 (조준탄) (0) | 2024.04.17 |