티스토리 뷰

Project

#004 : Unlight Copycat [DAY #03]

BaeMinCheon 2018. 2. 25. 00:02

Project Note #004


Unlight Copycat DAY #03

개요

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

환경

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

Main 시퀀스의 세부내용을 작성해봅시다. 유저이름, 레벨, 경험치 등의 수치를 출력해야함을 떠올릴 수 있습니다. 그러므로 유저정보를 담을 User 클래스를 만듭니다. 해당 클래스를 사용해 이름/레벨/젬/경험치/AP 정보를 저장합시다. 게임을 실행할 때마다 매번 똑같은 유저정보로 플레이하는 것은 재미없겠죠. 그러므로 파일 입출력을 통해 기존 유저정보를 불러오거나 현재 유저정보를 저장해 다음 실행 때 이어할 수 있도록 준비하는 게 좋겠습니다.


지금은 파일 입력만 구현하도록 하죠. 파일이름을 매개변수로 받는 생성자를 통해서 유저정보를 초기화하도록 하고, 이 과정에서 파일이 제대로 열리지않을 경우를 대비해 예외를 던지는 코드도 작성합니다. 파일 입출력에 사용하는 ifstream과 ofstream 객체는 cin cout 객체처럼 사용합니다. string 변수를 버퍼로 사용해 파일을 읽어오고, 필요한 부분만 추출해 사용합니다.


특히, 유저이름을 입력받는 과정에서는 string에서 TCHAR로 변환하기 위해 mbstowcs_s()를 사용했습니다. 프로젝트 생성시 SDL를 선택하지 않았다면 mbstowcs()로 대체 가능한 부분입니다. 기존 mbstowcs()에 비해 매개변수 2개가 증가하였는데, 그 중에서 첫번째 매개변수는 변환에 성공한 문자의 개수를 저장하는 변수입니다. 이 변수에 저장된 값으로 유저이름이 15자를 초과하는지 검사할 수 있습니다(미관상 15자 이내가 적절했습니다).


이렇게 해서 만든 User 클래스의 객체는 게임 하나에 하나만 존재해도 충분하기 때문에, 세분화는 하지않습니다. 따라서, GameWindow에 정적 멤버변수로 선언해놓는 것이 좋겠네요. 아 그리고 User 클래스에 이름/레벨/젬/경험치/AP 정보를 출력하는 함수들을 작성해 시퀀스쪽에서 작성해야할 코드를 줄여줍시다. 이 부분에서 출력문을 자연스럽게 위치시키기 위해 좀 고생했네요.


그럼 이제 시퀀스에서 GameWindow의 정적 멤버변수로 만든 User 객체를 활용해 유저정보들을 출력하는 코드를 작성합니다. Main 시퀀스뿐만 아니라 Quest 시퀀스에서도 동일한 출력을 해야하기 때문에, User 클래스에서 출력문을 정의하는 것이 코드 중복을 막는 방법이었습니다(추가적으로, 기존 Quit 버튼의 위치와 하단 사각형의 크기를 조금 손봤습니다).


Quest 시퀀스도 기존 게임의 스크린샷을 참고해 비슷하게 디자인합니다. 이로 인해 Quest에서 Battle로 넘어가는 버튼을 없애고, Back 버튼의 위치를 변경합니다.




Quest 시퀀스의 구현해야할 기능을 생각해봅시다. Quest 시퀀스도 여러 가지 기능을 가지고 있었는데요, 첫번째로 편집된 덱을 선택하는 기능을 넣어보도록 하겠습니다. 이를 위해서는 유저가 어떤 덱을 가지고 있는지 알아야겠죠. 방금 만들었던 User 클래스에 관련 정보를 추가하는 것이 좋겠습니다. Deck 구조체를 정의하고 string 객체 하나 int 변수 3개를 포함시킵니다. string객체는 덱의 이름을 저장하는 데에 사용할 것이고, int 변수는 카드 번호를 저장하는 데에 사용할 것입니다. 카드 이름을 저장하기보다는 카드 번호를 저장하고 해당 번호를 매핑시켜 카드 정보를 가져오는 쪽이 더 효율적이라고 생각되네요.


덱의 카드를 출력하는 일은 다음으로 시간상 다음으로 미루고(ㅠㅠ), 덱의 순서를 바꾸는 코드까지만 작성하겠습니다. 선택한 덱의 순서는 Quest 시퀀스에서만 보여질 것이기 때문에, User 클래스보다는 Quest 클래스에 해당 내용을 작성하는 것이 좋겠네요. 정적 멤버변수로 덱의 순서를 가리킬 int 변수를 만들어줍시다. 그리고 버튼 두 개를 추가하면서 방금 만든 int 변수를 조작하도록 람다표현식을 만들어줘야겠네요.


그럼 이제 Main 시퀀스와 Quest 시퀀스에서 유저정보를 하단에서 확인할 수 있게 되었고, Quest 시퀀스에서는 덱의 순서를 바꾸는 기능을 구현했습니다. 이 다음으로는 Quest 시퀀스와 Battle 시퀀스의 세부내용을 만드는 과정을 진행하겠습니다. 이상으로 DAY #03 노트를 마칩니다.



'Project' 카테고리의 다른 글

#006 : Unlight Copycat [DAY #05]  (0) 2018.02.26
#005 : Unlight Copycat [DAY #04]  (0) 2018.02.25
#003 : Unlight Copycat [DAY #02]  (0) 2018.02.23
#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
글 보관함