2.13 유도 레이저
유도 레이저는 유도탄을 응용하여 만들 수 있으며, 실제로 가장 선두의 움직임은 유도탄의 움직임과 같다.
단, 유도 레이저에는 꼬리가 존재하며 꼬리들은 각자 자신의 바로 앞부분의 좌표를 향해 앞부분의 회전각도로 이동하게 된다.
// 레이저의 각부분을 나타내는 구조체
typedef struct LASER_STRUCT {
float X, Y; // 좌표
float VX, VY; // 속도
float OldX, OldY; // 이전 좌표
float Angle; // 회전 각도
float OldAngle; // 이전 회전 각도
struct LASER_STRUCT* Prec; // 하나 앞 부분을 가리키는 포인터
// (선두부분일 경우는 NULL)
} LASER_TYPE;
void MoveHoming(LASER_TYPE* laser);
LASER_TYPE* NewLaserType();
// 레이저를 움직이는 함수
void MoveHomingLaser(
LASER_TYPE* laser // 레이저의 선두 혹은 그 이외의 몸체나 꼬리 부분
) {
// 선두 부분의 경우:
// 유도탄의 움직임과 같음
// 유도하는 구체적인 처리는 MoveHoming함수에서 수행하기로 가정함
if (laser->Prec==NULL) {
MoveHoming(laser);
}
// 선두 이외의 부분일 경우:
// 하나 앞의 부분을 좇아감
// 이전 좌표와 이전 회전각도를 복사함
else {
laser->X=laser->Prec->OldX;
laser->Y=laser->Prec->OldY;
laser->Angle=laser->Prec->OldAngle;
}
}
// 레이저의 발사
void ShootHomingLaser(
float x, float y, // 발사지점의 좌표
int length // 레이저의 길이
) {
LASER_TYPE* laser; // 레이저를 나타내는 구조체의 포인터
LASER_TYPE* prec=NULL; // 하나 앞의 부분을 가리키는 포인터
// 레이저의 각 부분을 만들기:
// 레이저의 구조체를 생성하여 좌표를 초기화하기
// 구조체를 생성하는 구체적인 처리는 NewLaserType함수에서 수행한다고 가정함
for (int i=0; i<length; i++, prec=laser) {
laser=NewLaserType();
laser->X=laser->OldX=x;
laser->Y=laser->OldY=y;
laser->Angle=laser->OldAngle=0;
// 몸체나 꼬리 부분은 하나 앞부분을 참조하도록 함
// 선두를 참조했을 때는 NULL이 반환됨
laser->Prec=prec;
}
}
'강의, 책 > [DirectX, C++] 게임 매니악스 알고리즘 시리즈' 카테고리의 다른 글
[슈팅 알고리즘] Chapter 2. 탄환 (유도탄) (0) | 2024.04.19 |
---|---|
[슈팅 알고리즘] Chapter 2. 탄환 (분열탄) (1) | 2024.04.19 |
[슈팅 알고리즘] Chapter 2. 탄환 (원형탄) (0) | 2024.04.19 |
[슈팅 알고리즘] Chapter 2. 탄환 (n-way탄) (0) | 2024.04.19 |
[슈팅 알고리즘] Chapter 2. 탄환 (탄환의 위치) (0) | 2024.04.19 |