본문 바로가기
WinAPI

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

by Srff5123 2025. 11. 25.
728x90

벡터에 대한 간단한 공부를 먼저 시작하겠다

A(1,2) 와 B(2,1) 을 그래프를 통하여 그린 뒤

두 벡터를 더하면 C(3,3) 이 나오게 된다. 3,3도 그래프에 찍어준다음 A와 B에서 해당 C로 선을 그어주면

해당 A와 B점에서 그은 선분a는 B와 ,b는 A로 같은 벡터임을 알 수 있다.

여기서 벡터는 위치는 상관 없는 방향과 힘으로 되어있기 때문이다.

 

벡터끼리의 곱셈은 불가능하기에, 스칼라를 이용 한다

스칼라는 여기서 힘 즉 방향이 없는 크기 값이다.

A(1,2) * 2 라고하면 각 항에 곱해주어 2,4가 된다. 이를 또 그래프로 그려주면 방향은 그대로고 힘만 증가한 상태가 된다.

 

 

이제 해당 벡터의 개념을 간단히 알아본 상태에서 Vector.h에 연산자 오버로딩을 통한 덧셈을 구현해보겠다.

이를 활용하여 움직임을 구현했던 부분에 적용을 해보자

+= 으로 하여 좀 더 깔끔하게 할 것이기 떄문에 연산자 오버로딩 추가

 

 

단위 벡터(방향 벡터), 크기와 힘이 1인 벡터를 뜻한다.  

단위 벡터에 값을 곱해주면 해당 되는 힘의 값을 바로 얻을 수 있다. 

단위 벡터를 굉장히 유용하게 쓰일 수있는데 그 활용을 보여주겠다.

우선 Vector.h에 방향에 대한 스태틱 함수를 만들어주고 또한 연산자 오버로딩 함수도 만들어준다

 

그 다음 Player.cpp에 있는 ControlMove도 이제 해당 스태틱함수와 연산자오버로딩을 통한 값으로 변경해준다.

 

또한 Bullet.cpp에서 총알의 이동값과, h에서 스피드도 float으로 바꾸어 해당 UP벡터를 이용해 바꿔준다.

 

더하기와 곱하기는 구현하였고 그렇다면, 벡터의 뺼셈은 어떻게 구현이 되는가?

(가장 많이 사용함) 수식적으로는 아까처럼 각 항끼리 뺄셈을 진행해 주면 된다.

아까와 똑같이 A(1,2)와 B(2,1)이 있다고 하고 두 벡터 A B를 뺄셈을 해주자

그러면 C(-1,1)이 된다. 똑같이 그래프에 선분을 그어 표현해보면

B -> A로 가는 벡터와 C의 벡터와 같은것을 알 수 있다.

 

즉 벡터의 A - B는 B에서 A로가는 벡터가 된다.

이제 이것을  코드로 활용해보자

그렇다면 우선 아까 했던 것처럼 연산자 오버로딩 부터 준비를 해준다.

 

이를 이용하여 총알이 내가 이동하는 방향으로 나가도록 해본다.

Bullet.h에 up벡터를 가져오고

cpp Update에 해당 값을 대입 해준다. 

 

그 다음 방향 벡터를 받기 위해 Fire에 기본 매개변수를 추가해준다.

 

그리고 Bullet을 관리하는 BulletManager도 바꿔줌

이제 방향벡터에 값을 넣어주기 위해 Mouse의 방향키를 넣어주어야한다.

메인파일 전역변수에 있는 Mouse좌표를 vector2로 바꾸어준다.

또한 framework.h에 extern으로 선언한 값도 vector2로 바꿔준다.

 

자 이제 Player.cpp 파일로 이동해서 본격적으로 방향벡터 값을 넣어주자

이 과정에서 벡터의 뺄셈이 들어가는데 현재 내 위치에서 마우스의 방향으로 가는 벡터를 구해야 한다.

어떻게 하면 구할 수 있을까?

 

A - B는 B -> A로 가는 벡터이다.

즉 B(현재 위치)에서 A(마우스 위치)를 빼주면 현재 위치에서 마우스로 가는 벡터가 나오게 된다.

 

이렇게 하고 이제 실행을 해보면 마우스의 위치에 따라 총알의 속도가 달라지는 것을 알 수 있다.

이것은 마우스로 가는 벡터의 방향과 스칼라, 즉 힘의 값이 들어가기 때문이다.

이런것을 해결하기 위해 아까 위에서 말한 단위벡터를 이용해 1로 만들어 방향만을 가져오는 방법이 필요한것이다.

이러한 과정을 정규화(Normalization) 라고 한다. 

수식으로 하면 각 항을 벡터의 크기대로 나누어 주면 된다. 

 

자 그러면 다시 Vector.h파일로 이동하여

벡터의 크기를 구해줄 함수와 벡터를 정규화 해줄 함수를 만들자

수정이 완료 되었으면 이제 다시 Player.cpp 파일로 이동하여

direction값을 수정해준다.

이렇게 하고 수정을 한뒤 플레이를 해보면

 

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

마우스의 방향으로 잘 나가는것을 알 수 있다.

728x90