WIN32API FrameWork/원본

220503_WIN32API_3-3_조작에 따라 회전하는 총 만들기(삼각함수)

hyrule 2022. 5. 5. 23:10

<삼각함수긔 간단한 이론>

코사인과 사인함수 값을 조합시켜 활용하면, 총의 각도를 구할 수 있다.

 

 

< 기존 코드 변경 >

* Player.h

* Player.cpp

//Class Cplayer: public CCharacter
//Player.h


#pragma once
#include "Character.h"
class CPlayer :
    public CCharacter
{

public:
	CPlayer();
	//상속할 것이므로 가상함수로 소멸자 선언
	virtual ~CPlayer();

public:
	virtual bool Init();
	virtual void Update(float DeltaTime);
	virtual void Render(HDC hDC, float DeltaTime);

	//충돌 함수는 별도로 구현할 것이므로 만들지 않을 것임.
	//virtual void Collision();


private:
	Vector2 m_GunPos;
	float m_GunAngle;
	float m_GunLength;
	float m_GunRotateSpeed;

};
//Class Cplayer: public CCharacter
//Player.cpp


#include "Player.h"

CPlayer::CPlayer()
{
}

CPlayer::~CPlayer()
{
}

bool CPlayer::Init()
{
	m_GunPos = 0.f;
	m_GunAngle = 0.f;
	m_GunLength = 70.f;
	m_GunRotateSpeed = 90.f;

	return true;
}

void CPlayer::Update(float DeltaTime)
{
	//VK_RETURN: Enter키
	//VK_F1: F1키
	//VK_LBUTTON: 왼쪽 마우스 버튼
	//GetAsyncKeyState: 키의 상태를 체크할 수 있다.
	/*
	<반환값>
	0: 해당 키가 눌러진 상태가 아니다.
	0x8000: 해당 키를 지금 누르고 있는 상태이다.
	0x1: 해당 키를 이전 프레임에 눌렀다.
	
	하지만 키를 눌렀는지에 대한 시스템은 나중에 따로 개별적으로 만들 것이고
	지금 당장은 그냥 '눌렸는지'(0x8000)만 체크할 것이다.
	*/


	//좌/우 버튼은 총을 좌/우로 회전시킨다.
	if (GetAsyncKeyState('A') && 0x8000)
	{
		//m_Pos.x -= 300.f * DeltaTime;
		m_GunAngle -= m_GunRotateSpeed * DeltaTime;
	}
	if (GetAsyncKeyState('D') && 0x8000)
	{
		//m_Pos.x += 300.f * DeltaTime;
		m_GunAngle += m_GunRotateSpeed * DeltaTime;
	}

	//총구가 향하는 방향 구하기
	Vector2 Dir;
	Dir.x = cosf(DegreeToRadian(m_GunAngle));
	Dir.y = sinf(DegreeToRadian(m_GunAngle));

	m_GunPos.x = m_Pos.x + Dir.x * m_GunLength;
	m_GunPos.y = m_Pos.y + Dir.y * m_GunLength;

	
	//총구 방향으로 전진 또는 후진한다.
	if (GetAsyncKeyState('W') && 0x8000)
	{
		m_Pos += Dir * 300.f * DeltaTime;
		//m_Pos.y -= 300.f * DeltaTime;
	}
	if (GetAsyncKeyState('S') && 0x8000)
	{
		m_Pos += Dir * -300.f * DeltaTime;
		//m_Pos.y += 300.f * DeltaTime;
	}

	


}

void CPlayer::Render(HDC hDC, float DeltaTime)
{
	Vector2 RenderLT;

	//렌더링을 시작할 위한 좌측 상단 점 구하기
	//이유: 윈도우즈 좌표계는 맨 왼쪽 위가 0, 0이므로
	//도형을 그릴때 해당 점부터 시작해야 한다.
	RenderLT = m_Pos - m_Pivot * m_Size;


	Ellipse(hDC, (int)RenderLT.x, (int)RenderLT.y, 
		(int)(RenderLT.x + m_Size.x), (int)(RenderLT.y + m_Size.y));
	

	//총을 그린다.
	MoveToEx(hDC, (int)m_Pos.x, (int)m_Pos.y, nullptr);
	LineTo(hDC, (int)m_GunPos.x, (int)m_GunPos.y);

}

 

 

< 결과 >