티스토리 뷰
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
- CUDA
- WindowAPI
- vscode
- windows
- A.I.
- cuDNN
- tensorflow
- shader
- PopeTV
- csharp
- Game
- pclaf
- unreal
- Docker
- DirectX
- dll
- NOX
- visual-studio
- JIT
- Slack
- Hashtable
- visualstudio
- lib
- CAFFE
- C/C++
- unity
- ATOM
- git
- Python
- Anaconda
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |