본문 바로가기
WinAPI

다시 공부 하는 Win API (6) - 슈팅 게임 만들기(4)

by Srff5123 2025. 11. 27.
728x90

저번 자유롭게 움직이며 마우스 방향으로 총알을 날리는 부분 까지 완성을 하였다.

이번에는 적군 또한 나를 향하여 총알을 발사하는것을 목표로 만들어 보고자 한다.

 

우선 적이 플레이어의 위치정보를 알아내야 하는 부분부터 코드를 만들어 본다. 

Enemy.h로 이동하여 Player의 주소를 통해 정보를 받아 내기 위한 준비를 해준다.

 

Enemy를 관리해주는 EnemyManager.h에도 추가해주고, 정의를 만들어주고

cpp 파일로 이동해 함수 정의에 Enemy에 player를 세팅해준다.

다음 ShootingScene.cpp로 이동해 Set을 해주었으니 Get을 통해 값을 받아온다. 

플레이어의 정보를 받아왔으니 이제 Enemy.h로 이동해서 총알을 발사하는 로직을 구현 준비한다.

총을 발사할 시간 간격변수와 함수 선언 및 정의를 진행하고

Update에서 fire함수추가 해서 실행

다음 Fire내부 로직에서 플레이어 위치 받고 플레이어의 위치로 총알 발사 구현

하지만 이렇게 하면 정규화되어있지 않기에 총알이 매우매우 빠르게 발사가 된다. 그렇기에

Bullet.h파일의 Fire함수에서 Direction을 받을 때 정규화처리를 진행한다.

또한 총알에 대한 구분, 적과 나의 총알을 구분하기 위해 Bullet.h에 아래의 string tag를 추가해준다.

 

다음 BulletManager에도 추가

그다음 Player와 Enemy.cpp의 Fire함수 매개변수에 총알을 구분해줄 문자를 넣어준다.

 

이제 실행을 해서 확인을 해보면 총알이 잘 안나가는 것을 알 수 있는데 Damage를 받는 처리부분에서 적군이 쏜 총알이 자기 자신을 충돌하기 때문이다.

그렇기에 해당 부분을 무시하도록 처리를 해주어야 정상적으로 작동이 될것이다.

Tag 즉 string값을 통해 적의 총알은 플레이어한테만 충돌이 일어나도록 만들어주고

반대로 플레이어의 총알을 적한테만 충돌하도록 만들어준다.

실행해서 확인해보면 이제 정상적으로 적이 총알을 플레이어의 위치로 쏘는 것을 확인 할 수 있다.

 

이제 기본 적인 동작은 되었고 좀 더 섬세한 기능을 추가해보자

우선 플레이어에서 마우스 방향으로 총을 쏠대 어느 방향으로 나가게 되는지에 대한 궤적을 미리 보여주는 Line을 그리는 기능을 만들겠다.

마우스 위치 Aming함수에서 마우스 pos받아주고  Render함수에서 선 그어주고

Update함수에서 Aming호출해서 업데이트하면 된다.

 

키보드를 통한 에임 설정도 해보겠다.

키 입력값을 받고, 앵글값 삼각함수 이용해서 수정

 

이제 player.cpp에서 Fire함수 부분에서 총알을 쏘는 방향을 수정해준다.

 

그리고 저번 글을 적고 실행 했을때 한가지 오류가 하나 있었는데

시작하고 마우스를 아래방향으로해도 총알이 아래로 제대로 나가지 않은 오류가 있었다.

좌표값에 문제 생긴것을 확인하게 되어 살펴보니 Main.cpp의 마우스포스의 좌표값을 받아주는 과정에서 실수가 있었다.

두 값 전부 LWORD로 설정해서 안되어 있던것

LOWORD는 x값, HIWORD가 y값으로 수정하니 정상적으로 잘 동작하게 됐다.

 

자 이제 다시 실행을 해서 마우스 포스 테스트를 한뒤 다시 aimpoint로 바꾸어 화살표 테스트를 해본다.

하지만 초기값을 90도로 맞춰두니 화살표(플레이어 캐릭터)의 aimpoint를 보여주는 선분이 정방향을 보면서 시작하지 않는 것을 알 수 있다. 

이것을 Radian값으로 바꾸어 주어야 정상적으로 작동이 된다.

 

Framework.h에 PI값 정의해주고

 

player.h에서 기존 90도를 PI/2의 값으로 정의한다.

실수의 계산은 곱하기를 하는게 더 효율적이다

 

이제 실행해보면 시작했을때 딱 화살표의 끝의 aimpoint의 선분이 딱 일직선이 된것과 총알도 해당 방향으로 잘 나간다는것을 알 수 있었다. 

 

이제 적의 행동을 조금 바꿔보겠다. 아까의 PI값을 만들었으니 조금 활용을 해보자

적의 공격이 플레이어의 방향으로 쏘는것이 아닌 적캐릭터의 중심에서 사방으로 총알을 동시에 발사하는 로직을 구현해보겠다.

우선 enemy.h로 이동하여 FIRE_SIZE 변수를 만들어 설정해주자, 적이 동시에 사방으로 쏠 총알의 개수

적의 캐릭터를 중심에서부터 사방으로 총을 발사하기 위해서는 

원의 모양을 FIRE_COUNT만큼 나누어 주어야한다.

그것을 계산하기 위해 radian값으로 바꾸어주고 FIRE-COUNT를 나누어주고

for문을 통해 해당 값을 반복적으로 보내주어 발사하면 완성이다.

 

이제 테스트를 해보면 정상적으로 잘 동작하는 것을 확인할 수 있다.

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

728x90