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);
}
< 결과 >