티스토리 뷰

Project

#003 : Unlight Copycat [DAY #02]

BaeMinCheon 2018. 2. 23. 17:12

Project Note #003


Unlight Copycat DAY #02

개요

  • Window API의 일종인 pclaf를 활용해 게임을 만드는 과정을 정리합니다.
  • 참고
    ※ https://github.com/BaeMinCheon/unlight-copycat (Github, "v0.2.0" 커밋)

환경

  • Visual Studio 2015 Professional
  • Windows 10 Home
  • pclaf (C/C++)

버튼을 만들기 전에, rectangle()과 circle()을 이용해 메인화면을 Unlight와 비슷하게 구성해봅니다. Unlight의 기능들을 모두 구현하기에는 제약사항이 많으니, Quest와 그 내부 기능들만 구현할 생각입니다. 따라서 Quest 버튼이 위치할 곳은 비워둡니다.




pclaf에서의 도형 그리기

  • circle() : 원점과 반지름을 매개변수로 받아 원을 출력
  • rectangle() : 왼쪽 꼭지점과 너비, 높이를 매개변수로 받아 사각형을 출력
  • polygon() : POINT 배열과 그 배열의 크기(원소개수)를 입력받아 다각형을 출력


버튼 클래스를 작성하면서 곰곰히 생각해봅니다. 버튼의 모양이 여러 가지라면, 클래스를 세분화할 필요가 있을 것 같습니다. 사각형 버튼과 원형 버튼의 경우만 따져봐도, 해당 버튼을 클릭했는지 검사하는 방법이 다르기 때문입니다. 따라서, Button 클래스를 Sequence 클래스처럼 부모 클래스로만 사용하고 자식 클래스를 두어 세분화하는 방식으로 갑니다. Button 클래스를 상속받는 CircButton RectButton 클래스를 작성합니다.


Button 클래스에는 순수 가상함수를 선언해주고, RectButton과 CircButton에서 각각 구현합시다. 두 버튼 모두 자신의 넓이 내부에서 클릭되었는지를 검사하면 됩니다. 사각형의 경우 좌상단 꼭지점과 우하단 꼭지점 사이의 위치인지 검사하고, 원형의 경우 중심에서부터 반지름만큼의 거리 내의 위치인지 검사합니다.


아참 그리고 버튼에도 색상과 문구 그리고 행동을 지정할 필요가 있습니다. 이를 위해 Button 클래스에 함수객체, 색상변수, TCHAR변수를 protected로 작성합니다. 세가지 변수 모두 생성자에서 초기값을 설정해주도록 하고, 추후 set...()으로 값을 변경할 수 있게 합니다. 특히, 각 버튼마다 동작을 저장해 활용하기 위해 함수객체를 사용했는데, 이는 lambda expression을 적용했습니다. 시퀀스에서 클릭된 버튼마다의 행동을 정의하는 수고를 줄이기 위함입니다. 추가적으로, 이 세가지 멤버변수를 매개변수로 받는 생성자를 별도로 작성하면 편리하겠군요.


저장했던 행동(함수)을 사용하기 위해 doWork()도 Button 클래스에 작성합니다. 그리고 init()을 추가해 생성자 호출시 아무 것도 하지않고 문구가 없는 흰색 버튼이 만들어지도록 합시다. RectButton과 CircButton의 생성자에 init()을 추가해줍니다. 그리고 각 버튼의 draw() 함수를 고쳐, 색상과 문구가 반영되도록 합니다. 그럼 이제 화면에 버튼을 추가해 시퀀스를 변경하는 코드를 작성합시다.


Main의 init()에서 버튼 두 개를 생성합니다. 하나는 Quest 시퀀스로 진입하는 기능을 가질 버튼이고, 나머지 하나는 게임 종료 기능을 가질 버튼입니다(컴파일 에러를 막기 위해 명시적 형변환으로 (TCHAR*)를 사용했습니다). Quest의 init()에서도 버튼 두 개를 생성합니다. 하나는 Main으로 돌아갈 기능을 가질 버튼이고, 나머지 하나는 Battle로 진입하는 기능을 가질 버튼입니다. Battle의 init()에는 버튼 하나를 생성합니다. Quest로 돌아갈 기능을 가질 버튼입니다.


람다 표현식에서 전역변수는 캡쳐를 하지않아도 사용할 수 있습니다. 따라서, 시퀀스를 이동함에 있어 --GameWindow::sequenceIndex; 또는 ++GameWindow::sequenceIndex;만을 사용해도 충분합니다. 그리고 게임 종료 버튼의 내용은 GetActiveWindow()를 사용합니다. 그럼 이제 각 시퀀스의 draw()와 leftClick()을 버튼을 이용해 작성해줍니다. 각 버튼마다 기능을 내장하게 되어 별도의 if문이나 switch문은 필요없게 되었습니다. 아까 언급했던 것이 이걸 위함이었죠.


이제 실행해보면 각 버튼들이 잘 동작함을 확인할 수 있습니다. 그리고 코드 정리 차원에서 Sequence 클래스의 click 함수들을 모두 순수 가상함수로 만들어줍시다. 앞으로 쓸 일이 없을 것 같네요. 그리고 지금까지 작성한 프로그램의 클래스다이어그램을 보면 아래와 같습니다. 이 다음으로는 시퀀스의 세부내용을 만드는 과정을 진행하겠습니다. 이상으로 DAY #02 노트를 마칩니다.



'Project' 카테고리의 다른 글

#006 : Unlight Copycat [DAY #05]  (0) 2018.02.26
#005 : Unlight Copycat [DAY #04]  (0) 2018.02.25
#004 : Unlight Copycat [DAY #03]  (0) 2018.02.25
#002 : Unlight Copycat [DAY #01]  (0) 2018.02.22
#001 : Mole Catch  (0) 2018.01.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함