1. 포신 만들기
플레이어의 상대 좌표를 기준으로 100 픽셀의 길이를 갖는 포신을 만든다.
Q와 E를 입력하면 반시계, 시계 방향으로 회전한다.
(1) 포신 설정, 그리기
#pragma once
#include "Object.h"
class Player : public Object
{
public:
Player();
virtual ~Player() override;
public:
virtual void Init() override;
virtual void Update() override;
virtual void Render(HDC hdc) override;
Pos GetFirePos();
public:
float _barrelAngle = 0.f;
float _barrelLength = 100.f;
};
void Player::Render(HDC hdc)
{
// ~~~~~~
// 포신 렌더링
Utils::DrawLine(hdc, _pos, GetFirePos());
}
Pos Player::GetFirePos()
{
Pos firePos = _pos;
firePos.x += _barrelLength * cos(_barrelAngle);
// y축은 아래로 갈수록 증가
firePos.y -= _barrelLength * sin(_barrelAngle);
return firePos;
}
포신의 끝 점의 좌표는 플레이어의 좌표를 (0, 0)으로 나타내었을 때, 포신의 길이가 L 이라면 (LCosθ, LSinθ)에 해당한다.
즉 x = LCosθ, y = LSinθ 이므로, 위의 코드와 같이 나타낼 수 있다.
단, 일반적으로 2차원 좌표계에서 y축의 진행방향(y값이 늘어나는 방향)은 위쪽이지만, C++에서는 아래쪽이므로 부호를 반대로 설정해야 한다.
(2) 포신 회전을 위한 코드
InputManager.h에서 KeyType 열거형 클래스를 아래와 같이 수정한다.
enum class KeyType
{
LeftMouse = VK_LBUTTON,
RightMouse = VK_RBUTTON,
//~~ 생략 ~~
Q = 'Q',
E = 'E',
};
이후 Player.cpp로 돌아와 Update 함수 내에 회전 코드를 추가한다.
// 포신 회전
if (GET_SINGLE(InputManager)->GetButton(KeyType::Q))
_barrelAngle += 10 * deltaTime;
if (GET_SINGLE(InputManager)->GetButton(KeyType::E))
_barrelAngle -= 10 * deltaTime;
2. 투사체(Missile)이 포신의 끝에서 발사되게 설정
(1) Missile.h
void SetAngle(float angle) { _angle = angle; }
protected:
float _angle = 0.f;
};
(2) Player.cpp :: Update()
// 공격
if (GET_SINGLE(InputManager)->GetButtonDown(KeyType::SpaceBar))
{
// 미사일 발사
Missile* missile = GET_SINGLE(ObjectManager)->CreateObject<Missile>();
missile->SetPos(GetFirePos());
missile->SetAngle(_barrelAngle);
GET_SINGLE(ObjectManager)->Add(missile);
}
GetFirePos는 플레이어에 위치에 대한 포신의 상대적 위치를 담고 있다.
(3) Missile.cpp
void Missile::Update()
{
float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();
//
_pos.x += deltaTime * _stat.speed * cos(_angle);
_pos.y -= deltaTime * _stat.speed * sin(_angle);
미사일 속도 코드를 수정한다.
'Windows API & 게임 수학' 카테고리의 다른 글
2-3. 벡터의 내적을 이용해 마우스를 따라다니는 몬스터 구현 (0) | 2023.10.30 |
---|---|
2-2. 벡터를 이용한 기능 개선 - 유도탄 (0) | 2023.10.26 |
1-11. 번외 - 충돌 판정(Collision) 구현하기 (0) | 2023.10.24 |
1-10. 번외 - 점수(Score) 구현하기 (0) | 2023.10.24 |
1-8. 리소스 제작 툴 만들기 (Resources, EditScene) (0) | 2023.10.17 |