티스토리 뷰

Project

#006 : Unlight Copycat [DAY #05]

BaeMinCheon 2018. 2. 26. 20:11

Project Note #006


Unlight Copycat DAY #05

개요

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

환경

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

Sequence.h와 Sequence.cpp의 분량이 많아져, 유지보수하기가 힘들어지네요. 각 시퀀스마다 헤더파일과 구현파일을 나누도록 합시다. 특히, Sequence 클래스의 경우 멤버함수가 모두 순수가상함수이므로 구현파일이 없어도 됩니다. 따라서 Sequence.cpp는 삭제합니다.


맵목록을 클릭했을 때, 좌측의 빈공간에 맵정보가 뜨도록 만들어봅시다. 우선 맵목록을 클릭했을 때 몇 번째 목록을 클릭했는지 알기 위해 MapList에 int 변수 index를 하나 추가합니다. 그리고 이 변수 값을 반환하는 멤버함수 getIndex()도 작성합니다. Quest 시퀀스 내에서 현재 몇 번째 맵목록을 선택했는지를 저장하기 위해 정적 멤버변수 mapListIndex를 추가합니다.


어제 작성했던 코드를 수정해야겠네요. MapList에 정적 멤버변수로 선언했던 counter를 없애고 생성자에서 counter의 위치에 mapVector.size()를 대신 바꿔씁니다. 이렇게 해도 동일한 결과를 얻을 수 있을 것입니다. 그리고 맵목록 중에서 맨밑이 아닌 목록이 삭제될 경우, 그 아래에 위치한 맵들의 index값을 변경해야할 테니 이를 위한 멤버함수 decreaseIndex()를 정의합니다. mapVector에서 어떤 맵목록이 삭제되면 그 아래로 위치한 맵목록들에 대해 호출하여 한 칸씩 당겨오는 과정에서 사용합니다.


Quest의 leftClick()에서 mapVector내 각 원소의 isClick()을 호출해 클릭을 검사합니다. 어떤 맵목록이 클릭되었다면 해당 맵목록의 index를 mapListIndex에 대입하고, 어떤 맵목록도 클릭되지않았다면 mapListIndex에 -1을 대입합니다. 그리고 Quest의 draw()에서는 mapListIndex의 값을 if문의 조건으로 사용해, 맵목록을 출력할지 말지를 결정합니다.


맵정보에는 맵을 시작하는 버튼, 맵을 삭제하는 버튼, 각 칸을 이루는 버튼 등이 있겠네요. 맵을 시작하거나 삭제하는 버튼을 메뉴버튼이라 하면, 메뉴버튼의 경우 모든 맵목록이 동일한 기능과 모양을 가지므로 Quest 시퀀스의 init()에서 다른 버튼들처럼 미리 추가해두는 것도 괜찮을 것 같습니다. 다만, 이 버튼들은 보이지않는데 클릭할 수 있으면 안 되므로 화면 밖의 위치에 놓습니다.


화면 밖에서 초기화한 버튼들을 화면 안으로 가져오기 위해서는 xy좌표를 바꾸는 함수를 준비해야겠습니다. 각 시퀀스의 버튼들은 std::shared_ptr<Button>의 std::vector에서 조작하기 때문에 Button 클래스를 조작할 필요가 있습니다. Button 클래스에 가상함수 moveTo()와 멤버변수 X와 Y를 추가해줍니다. 동시에 RectButton의 leftX와 leftY 그리고 CircButton의 centerX와 centerY를 지워줍니다(Button을 상속받으면서 내려온 X와 Y로 대체할 수 있기 때문입니다).


leftX leftY centerX centerY 들을 사용하는 코드들을 고쳐주면 버튼을 옮길 준비는 마쳤네요. Quest의 leftClick()에서 맵목록이 클릭될 때에는 메뉴버튼들을 보이는 위치로 옮기고, 그렇지않을 경우에는 화면 밖으로 옮기는 코드를 작성합니다. 여기에 맵이름까지 출력해봅시다. MapList는 Button에서부터 내려온 TCHAR* name을 사용하는데, Button에는 getName()이 없습니다. 하지만 일반적인 버튼은 이름을 전달할 일이 없으므로 MapList에만 getName()을 정의해줍니다.


만들다 보니 여러 가지 미흡한 부분이 보이네요. 맵목록을 누를 때에만 맵정보가 띄워지는 구조로 시작했지만, 막상 실행하며 디버깅해보니 맵목록를 눌렀을 때에도 맵정보의 출력이 유지되어야한다는 것을 알게 되었습니다. 그렇지않으면 맵을 진행할 수 없을 테니까요. 지금은 if문(if(!buttonVector[3]->isClick(x, y) && !buttonVector[4]->isClick(x, y)))으로 급한 불을 끄고 추후 맵목록과 맵정보의 연결을 보강하는 과정을 거치겠습니다.


이왕 버튼으로 메뉴를 구현하는 김에 맵정보의 배경 역할을 할 버튼을 추가하겠습니다. 이 버튼도 평소에는 화면 밖에 위치시키고 필요할 때 가져오도록 합시다. 당분간은 코드 정리도 병행하느라 진행속도가 늦어질 것 같네요. 다시 돌아보는 의미에서 지금까지 구현한 기능을 영상으로 찍어보았습니다. 이 다음으로는 Quest 시퀀스를 이어 작성하는 과정을 진행하겠습니다. 이상으로 DAY #05 노트를 마칩니다.



'Project' 카테고리의 다른 글

#008 : Unlight Copycat [DAY #09]  (0) 2018.03.02
#007 : Unlight Copycat [DAY #08]  (0) 2018.03.01
#005 : Unlight Copycat [DAY #04]  (0) 2018.02.25
#004 : Unlight Copycat [DAY #03]  (0) 2018.02.25
#003 : Unlight Copycat [DAY #02]  (0) 2018.02.23
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함