리듬게임을 만들어보자 7. 로직과 디자인을 분리하자1

Posted by 적분 ∫2tdt=t²+c
2009.12.06 14:27 프로그래밍/스페샬
이쯤되면 어지간한 그래픽 출력은 다 끝났다. 이제 본격적으로 게임로직을 짜는 부분에 들어가자.... 가기전에 먼저 로직과 디자인을 분리해야 한다. 디자인은 프로그래머의 몫이 아니다. 디자인은 디자인하는 사람이 열심히 하고, 프로그램에서는 외부에서 디자인된 파일을 읽어와서 적절하게 화면에 그려주도록 하면 된다.
먼저 텍스쳐와 스프라이트 데이터들을 외부에서 읽어오도록 만들어보자.
텍스쳐를 읽어오기 위해서는 텍스쳐의 주소들을 모아놓은 파일이 필요하다. 그렇게 하기 위해서 문자열 배열을 관리하는 클래스 GStrings를 만들어보자.


정말 간단한 클래스이다. 파일에서 문자열배열을 읽어오고, 파일에 문자열배열을 쓰는 일을 한다.
파일에서 문자열 배열을 읽어오려면 파일에 문자열배열이 저장되는 방식을 지정해놓아햐 한다.
다음과 같이 정해놓도록 하자.

[파일 구조]
 DWORD num; //문자열 배열의 갯수
 struct{
  DWORD len; //문자열의 길이
  wchar_t str[len]; //실제 문자열 데이터
 } strings[num]; //이 구조체가 num개 반복된다.
c++코드를 빌려서 파일을 구조를 나타내보았다. (물론 실제 c++코드가 아니므로  코딩에 사용하면 에러메세지를 내뿜을 것이다.)

이제 이를 바탕으로 문자열배열을 읽어오는 함수를 만들어보자.

먼저 num을 읽어와서 문자열배열의 갯수를 얻은 다음, 문자열을 읽어들이는 작업을 num번 반복한다.

파일에 저장하는 건 읽어오는걸 반대로하면 된다.

참 쉽죠? 근데 Save 함수 뒤에 const가 붙어있다. 이는 Save함수가 클래스의 내용을 변경시키지 않는다고 보장해주는 것이다. 문자열배열을 파일에 저장하는 함수가 문자열내용을 변경시킬 일은 없다. 이럴경우 const를 붙여주면, 클래스의 내용을 변경시키는 코드는 에러로 간주된다. 따라서 잘못된 코드를 짜는 것을 막을 수 있다. 그러므로 클래스의 내용을 변경시키지 않는 함수에는 const를 꼭 붙이도록 하자.

그리고 읽어들인 배열의 값을 참조할 수 있게 operator[]함수도 만들자. operator[]는 기존의 배열 연산자를 함수형태로 바꾸어 표시한 것이다.
즉 a.operator [](10)이라는 코드는 a[10] 과 정확하게 같다.


operator[]함수를 두 벌 만들었다. 하나는 const, 다른 하나는 비 const 버전이다.

텍스쳐를 읽어오는 부분은 완성되었으니, 스프라이트데이터를 읽어오는 부분도 만들어보자.


스프라이트데이터 파일의 구조는 다음과 같이 정하겠다.
[파일 구조]
 DWORD num; //GSpriteDat 배열의 크기
 GSpriteDat data[num]; //실제 GSpriteDat 데이터

이제 이런 문자열배열 파일과 스프라이트데이터 파일을 만드는 프로그램도 짜야한다. 별로 복잡한 것이 없으므로 따로 설명하지 않는다. 첨부파일의 acc폴더안에 sprite.exe와 string.exe로 소스파일과 함께 첨부되어있으므로 참고하시라. (귀찮아서 대충대충 짠 코드라 별로 볼 것은 없다.)

이제 파일에서 텍스쳐와 스프라이트 데이터를 읽어와서 화면에 뿌려주게 코드를 짜보자.

생성자에서 텍스쳐와 스프라이트 데이터를 읽어와서
OnDraw함수에서 그려주고 있다.
참 쉽죠?

이 댓글을 비밀 댓글로