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);

미사일 속도 코드를 수정한다.