game dev/directX 3D

DirectX 3D 6일차 - 마우스 클래스(Mouse Class)

onue 2021. 4. 12. 17:22

www.youtube.com/watch?v=1ufYQA8dex0&list=PLqCJpWy5Fohd3S7ICFXwUomYW0Wv67pDD&index=6

Keyboard 클래스와 마찬가지로 Mouse 클래스 역시 마우스 이벤트를 처리하기 위한 Event 클래스를 가지고 있습니다.

Event Class

Type - 마우스 이벤트가 어떤 상황에서 발생했는지를 지정하기 위한 열거형 변수 타입.

LPress - 마우스 왼쪽 키가 눌렸을 때 발생하는 이벤트

LRelease - 마우스 왼쪽키가 눌렸다가 다시 띄워젔을때 발생하는 이벤트

RPress - 마우스 오른키가 눌렸을 때 발생하는 이벤트

RRelease - 마우스 오른키가 눌렸다가 다시 띄워젔을때 발생하는 이벤트

WheelUp - 마우스 휠이 위쪽으로 움직였을 때 발생하는 이벤트

WheelDown - 마우스 휠이 아래쪽으로 움직였을 때 발생하는 이벤트

Move - 마우스가 움직였을 때 발생하는 이벤트

Enter - 마우스가 윈도우 창 안에 들어왔을 때 발생하는 이벤트

Leave - 마우스가 윈도우 창 밖으로 나갔을 때 발생하는 이벤트

Invalid - 유효하지 않는 마우스 이벤트를 위해 만든 타입

 

Type type

 - 해당 이벤트가 어떤 이벤트인지를 지정하기 위한 변수.

 

bool leftIsPressed

 - 마우스 왼쪽키가 눌렸는지를 파악하기 위한 변수

 

bool rightIsPressed

 -  마우스 오른키가 눌렸는지를 파악하기 위한 변수

 

int x

 - 마우스의 위치 x좌표값을 가지고 있는 변수

 

int y

 - 마우스의 위치 y좌표값을 가지고 있는 변수

 

Event()
 - Event class 기본 생성자이고 아무 전달 인자 값이 없을 경우 기본적인 타입은 Invalid 타입을 설정하고

leftIsPressed, rightIsPressed를 false로 설정해주고 x좌표와 y좌표를 0으로 설정해줍니다.

 

 

Event(Type type, const Mouse& parent)

 - Event class 전달 인자 값이 있을 경우 Mouse class 객체를 전달해주는데 해당 Mouse class의 leftIsPressed와 rightIsPressed, 그리고 위치 값을 가져와서 할당해줍니다.

 

bool IsValid()

 - 마우스가 유효한 상태인지를 확인하기 위해서 사용하는 함수입니다. 단 여기서는 유효한 상태임을 확인하기 위해서

type 변수가 InValid가 아닌 상태 즉 Release나 Press 상태인지를 검사하는 것입니다.

 

Type GetType()

 - 이벤트가 어떤 타입인지를 반환해주는 함수

 

std::pair<int, int> GetPos()

 - 위치값을 전달해주는 함수인데 x값과 y값을 동시에 반환해주기 위해서 pair를 사용해서 전달해줍니다.

 

int GetPosX()

 - x값을 반환해줍니다.

 

int GetPosY()

 - y값을 반환해줍니다.

 

bool LeftIsPressed()

 - 마우스 왼쪽 키가 눌렸는지를 파악하기 위한 함수입니다.

 

bool RightIsPressed()

 - 마우스 오른키가 눌렸는지를 파악하기 위한 함수입니다.

 

 

Mouse Class

생성자

Mouse() = default

 - 컴파일러가 생성해주는 기본적인 생성자를 사용하겠다는 의미입니다. Mouse() {}와 동일

 

Mouse(const Mouse&) = delete

Mouse& operator=(const Mouse&) = delete

 - 컴파일러가 생성해주는 기본적인 생성자를 사용하지 않겠다는 의미입니다.

복사 생성자를 방지하기 위해서 사용하고 있습니다. 

Mouse m1;

Mouse m2(m1); // error발생

또는 m1 = m2 // error 발생

 

변수

static constexpr unsigned int bufferSize = 16u

 - 한번에 처리할 수 있는 event buffe의 사이즈를 지정해서 event가 밀리는 것을 방지할 수 있습니다.

 

int x

 - 마우스 위치의 x값을 담는 변수

 

int y

 - 마우스 위치의 y값을 담는 변수

 

bool leftIsPressed = false

 - 마우스 왼쪽 키가 눌렸는지에 대한 boolean 타입 변수

 

bool rightIsPressed = false

 - 마우스 오른키가 눌렸는지에 대한 boolean 타입 변수

 

bool isInWindow = false

 - 마우스가 윈도우 창 영역 안에 있는지에 대한 boolean 타입 변수

 

int wheelDeltaCarry

 - 마우스 휠을 움직이는 속도를 조절하는 변수인 것 같습니다

 

std::queue<Event> bufffer

 - Queue 자료구조는 FIFO(First In Firest Out)이므로 Event를 담아놓고 처리하기에 유용합니다. Event를 계속 Queue에 넣고 넣어진 순서대로 처리하게 됩니다.

 

함수

std::pair<int, int> GetPos() const noexcept

 - 마우스의 위치값 x와 y 모두를 반환해주는 함수

 

int GetPosX() const noexcept

 - 마우스 위치의 x값을 반환해주는 함수

 

int GetPosX() const noexcept

 - 마우스 위치의 y값을 반환해주는 함수


bool IsInWindow() const noexcept

 - 마우스가 윈도우창 영역 안에 있는지에 대한 변수인 isInWindow를 반환해주는 함수


bool LeftIsPressed() const noexcept

 - 마우스 왼쪽키가 눌렸는지 알 수 있는 변수인 leftIsPressed 변수를 반환해주는 함수

 

bool RightIsPressed() const noexcept

 - 마우스 오른쪽키가 눌렸는지 알 수 있는 변수인 rightIsPressed 변수를 반환해주는 함수

 

Mouse::Event Read() noexcept

 - 클래스 변수인 buffer라는 변수에서 pop을 해서 pop 한 Event를 반환해주는 함수

 

bool IsEmpty() const noexcept

 - buffer queue가 비었는지를 확인하는 함수

 

void Flush() noexcept

 - buffer queue를 모두 깨끗하게 정리하기 위한 함수

 

void OnMouseMove(int x, int y) noexcept

 - 마우스가 움직였을 때 이벤트를 처리해주는 함수. 함수 전달 인자값으로 온 x값과 y값으로 Mouse class의 변수인 x와 y를 할당해주고 buffer에다가 해당 Mouse class가 움직였다는 이벤트를 push, 단 밑에서 설명할 TrimBuffer를 통해서 해당 queue의 size가 bufferSize보다 작아질 때까지 Pop

 

void OnMouseLeave() noexcept

 - 마우스가 윈도우 창 영역을 벗어났을 때 이벤트를 처리해주는 함수. isInWindow를 false로 만들어주고 buffer에 마우스가 윈도우창 영역을 벗어났다는 이벤트를 push

 

void OnMouseEnter() noexcept

 - 마우스가 윈도우 창 영역 밖에서 안으로 들어왔을 때 이벤트를 처리해주는 함수. isInWindow를 true로 만들어주고 buffer에 마우스가 윈도우창 영역에 들어왔다는 이벤트를 push

 

void OnLeftPressed(int x, int y) noexcept

 - 마우스 왼쪽키가 눌렸을 때 이벤트 처리를 해주는 함수. leftIsPressed를 true로 만들어 주고 buffer에 마우스 왼쪽 키가 눌렸다는 이벤트를 push

 

void OnLeftReleased(int x, int y) noexcept

 - 마우스 왼쪽키가 띄워졌을 때 이벤트 처리를 해주는 함수. leftIsPressed를 false로 만들어 주고 buffer에 마우스 왼쪽 키가 띄워졌다는 이벤트를 push

 

void OnRightPressed(int x, int y) noexcept

 - 마우스 오른키가 눌렸을 때 이벤트 처리를 해주는 함수. rightIsPressed를 true로 만들어 주고 buffer에 마우스 오른 키가 눌렸다는 이벤트를 push

 

void OnRightReleased(int x, int y) noexcept

 - 마우스 오른 키가 띄워졌을 때 이벤트 처리를 해주는 함수. rightIsPressed를 false로 만들어 주고 buffer에 마우스 오른 키가 띄워졌다는 이벤트를 push

 

void OnWheelUp(int x, int y) noexcept

 - 마우스 휠이 위쪽으로 움직였을 때 이벤트 처리를 해주는 함수. buffer에 마우스 휠이 위로 움직였다는 이벤트를 생성 후 buffer에 push

 

void OnWheelDown(int x, int y) noexcept

 - 마우스 휠이 아래쪽으로 움직였을 때 이벤트 처리를 해주는 함수. buffer에 마우스 휠이 아래로 움직였다는 이벤트를 생성 후 buffer에 push

 

template<typename T>

static void TrimBuffer(std::queue<T>& buffer) noexcept

 - 아까 위에서 여러번 언급했듯이 TrimBuffer 함수는 typename을 통해서 인자 값을 전달된 여러 유형의 queue를

bufferSize보다 아래만큼 pop을 해서 size를 줄여주는 함수

 

void OnWheelDelta(int x, int y, int delta) noexcept

 - 마우스 휠의 움직임을 관리해주는 함수. delta값만큼 Mouse class의 변수인 wheelDeltaCarry의 값을 변화시키고 wheelDeltaCarry를  WHEEL_DELTA값을 기준으로 이벤트는 전달해주되 wheelDeltaCarry를 초기값으로 유지시키기 위한 함수