디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

적분시리즈: 7. 로직과 디자인을 분리하자1.

∫ 2t dt=t²+c갤로그로 이동합니다. 2009.12.06 14:33:25
조회 390 추천 1 댓글 2


이쯤되면 어지간한 그래픽 출력은 다 끝났다. 이제 본격적으로 게임로직을 짜는 부분에 들어가자.... 가기전에 먼저 로직과디자인을 분리해야 한다. 디자인은 프로그래머의 몫이 아니다. 디자인은 디자인하는 사람이 열심히 하고, 프로그램에서는 외부에서디자인된 파일을 읽어와서 적절하게 화면에 그려주도록 하면 된다.
먼저 텍스쳐와 스프라이트 데이터들을 외부에서 읽어오도록 만들어보자.
텍스쳐를 읽어오기 위해서는 텍스쳐의 주소들을 모아놓은 파일이 필요하다. 그렇게 하기 위해서 문자열 배열을 관리하는 클래스 GStrings를 만들어보자.
class GStrings
{
protected:
    vector<wstring> m_vstr;
public:
    const wstring& operator[](size_t i) const; //const 버전
    wstring& operator[](size_t i); //일반 버전
    size_t size() const;
    GRET Load(DataInMem* file);
    GRET Save(DataInMem* file) const;
};

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

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

이제 이를 바탕으로 문자열배열을 읽어오는 함수를 만들어보자.
GRET GStrings::Load(DataInMem* file)
{
    DWORD num;
    if(file->read(&num, 4)<4)return GRET_ERROR_FILE;
    m_vstr.resize(num);
    for(DWORD i=0;i<num;i++)
    {
        wchar_t temp[256]={0,};
        DWORD len;
        file->read(&len, 4);
        file->read(temp, len*2);
        m_vstr[i]=temp;
    }
    return GRET_OK;
}

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

파일에 저장하는 건 읽어오는걸 반대로하면 된다.
GRET GStrings::Save(DataInMem* file) const
{
    DWORD num=(DWORD)m_vstr.size();
    if(file->write(&num, 4)<4)return GRET_ERROR_FILE;
    for(DWORD i=0;i<num;i++)
    {
        DWORD len=(DWORD)m_vstr[i].size();
        file->write(&len, 4);
        file->write(m_vstr[i].c_str(), len*2);
    }
    return GRET_OK;
}

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

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

wstring& GStrings::operator [](size_t i)
{
    return m_vstr[i];
}

const wstring& GStrings::operator [](size_t i) const
{
    return m_vstr[i];
}
operator[]함수를 두 벌 만들었다. 하나는 const, 다른 하나는 비 const 버전이다.

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

GRET GSprites::LoadSprites(DataInMem* file)
{
    DWORD num;
    if(file->read(&num, 4)<4)return GRET_ERROR_FILE;
    m_vspr.resize(num);
    file->read(&m_vspr[0], sizeof(GSpriteDat)*num);
    return 0;
}
스프라이트데이터 파일의 구조는 다음과 같이 정하겠다.
[파일 구조]
 DWORD num; //GSpriteDat 배열의 크기
 GSpriteDat data[num]; //실제 GSpriteDat 데이터

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

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

MPlayGame::MPlayGame()
{
    GStrings strs;
    strs.Load(&DataInFileDirect(L"textures.str"));
    for(size_t i=0;i<strs.size();i++)
    {
        m_sprs.LoadTexture(&DataInFileDirect(strs[i].c_str()));
    }
    m_sprs.LoadSprites(&DataInFileDirect(L"sprites.dat"));
}
void MPlayGame::OnDraw()
{
    m_sprs.DrawSprite(0, 0, 0);
    m_sprs.DrawSprite(1, 256, 0);
    m_sprs.DrawSprite(2, 0, 256);
}
생성자에서 텍스쳐와 스프라이트 데이터를 읽어와서
OnDraw함수에서 그려주고 있다.
참 쉽죠?

추천 비추천

1

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 가족과 완벽하게 손절해야 할 것 같은 스타는? 운영자 24/06/24 - -
162137 역시 아이디어 ㅇㅇ [2] 메탈스피릿갤로그로 이동합니다. 09.12.13 94 0
162136 파일질라는 계정 당 용량 할당 못하나..? [1] 파일졸라(122.128) 09.12.13 50 0
162135 방학동안 학원을 다닐까 생각중인데... [8] URA!갤로그로 이동합니다. 09.12.13 157 0
162134 구글검색에닌 뗘다붙여서 사이트만든다는 병진이 잇네 [5] 개천재(118.34) 09.12.13 138 0
162133 티스토리 초대해줄 훃님있나요 [5] MC박뮤탈갤로그로 이동합니다. 09.12.13 94 0
162132 mfc에서 modeless dialog 새창 띄우기 질문입니다. [5] 늅늅은운다(124.62) 09.12.13 163 0
162131 그 블로그 외에도 증거는 있어 [6] 개천재(118.34) 09.12.13 116 0
162129 딱 하나만 더 질문요; cout.width(10) [1] LPchester갤로그로 이동합니다. 09.12.13 141 0
162128 개천재님 블로그 이 내용 틀렸네요 [11] 동전이(118.34) 09.12.13 103 0
162127 허걱죄송해요 stream 으로했는데 [4] 로크리갤로그로 이동합니다. 09.12.13 71 0
162126 유리한님 여쭐게요 [6] 로크리갤로그로 이동합니다. 09.12.13 97 0
162125 C++에서 string 출력 칸 맞춰서 예쁘게 하는 방법없나여? [6] LP(58.237) 09.12.13 164 0
162124 책에는요 iosteam 이라고나왔거든요?ㅁ [6] 로크리갤로그로 이동합니다. 09.12.13 108 0
162123 118.34.212.165 님은 봅니다. [2] 유리한갤로그로 이동합니다. 09.12.13 76 0
162122 처음해보는건데요 계속 에러가뜨네요 ㅜㅜ [5] 로크리갤로그로 이동합니다. 09.12.13 72 0
162121 야이놈아 내블로그 누구허락받고 왓어 [7] 개천재(118.34) 09.12.13 96 0
162117 안녕하세요 저 내일 회사 첫출근 함 ^ ^ [6] 코와붕가(221.140) 09.12.13 125 0
162115 Star UML 써보신분? [2] ㅇㅇ(122.128) 09.12.13 1790 0
162113 횽들 안녕 반가워 [5] 메탈스피릿갤로그로 이동합니다. 09.12.12 54 0
162111 이런것도 있군요 [1] 퍅셔미갤로그로 이동합니다. 09.12.12 36 0
162110 어떡해횽 보고 탄력받았다!! [4] 거지(222.236) 09.12.12 94 0
162108 다음달이면 내나이 28이 되는데 ... [2] Pupustory갤로그로 이동합니다. 09.12.12 118 0
162107 후로그램어에게 있어서 후로그램잉언어는 도구일뿐 [1] 세브(121.131) 09.12.12 76 0
162106 사실을 나 프겔러 백업하고있어. [2] Vita500갤로그로 이동합니다. 09.12.12 93 0
162105 근데 쿼드코어 동시 지원 프로그램은 어떻게 짜는 걸까? [2] 으잌(125.177) 09.12.12 120 0
162103 어떡해는 봅니다. 공부하는방법 [4] Vita500갤로그로 이동합니다. 09.12.12 102 0
162102 64비트 만드는 방법 Vita500갤로그로 이동합니다. 09.12.12 74 0
162101 어떡해 일기 #7 :: c언어 변수와 연산자, 반복문 습득 [5] 어떡해갤로그로 이동합니다. 09.12.12 877 0
162100 셤기간이라 심심해서 들어왔는데. [3] 혼아갤로그로 이동합니다. 09.12.12 54 0
162099 64 비트에서 c나 c++ 하는 형들 있어?? [6] 카이신갤로그로 이동합니다. 09.12.12 175 0
162098 우아 동 트겠네열 [1] algo갤로그로 이동합니다. 09.12.12 23 0
162097 이런거 좋아하는 횽은 없나. [1] 혼아갤로그로 이동합니다. 09.12.12 64 0
162096 그렇다면 나는 출산드라 빙의 하기 전의 말름형 [1] 카이신갤로그로 이동합니다. 09.12.12 44 0
162093 JSP 좀 도와주세요.. [5] muns갤로그로 이동합니다. 09.12.12 79 0
162092 형들 급 상담 한번만 해주라 [4] 거지(61.33) 09.12.12 73 0
162091 한번쯤은 들어봤을껄 [2] 카이신갤로그로 이동합니다. 09.12.12 51 0
162089 맥콜횽 다시 한번 봄미다 [4] algo갤로그로 이동합니다. 09.12.12 36 0
162088 테이블이 옆으로 만들어지긴한데요.. 사이에 여백을 [1] html 태그...(211.218) 09.12.12 56 0
162087 그린데이는 감동 그 그체야 [2] CP(118.219) 09.12.12 59 0
162086 html 테이블태그 제발 제발 도아ㅗ주세요 [6] html 태그...(211.218) 09.12.12 108 0
162083 완벽주의의 결과 [2] 이모군(110.8) 09.12.12 104 0
162082 에이 x발놈들 욕이 나오네 [2] ㅇㅇ(119.207) 09.12.12 83 0
162080 WIN32 API가 제일 쉬웠어요. [6] 천재플머(61.77) 09.12.12 162 0
162078 자바나 비쥬얼베이직으로 프로그램 만들어주실분?. 급해여.!! [17] 조던(211.59) 09.12.12 107 0
162077 횽들 질문이 있어 프레(168.188) 09.12.12 26 0
162075 글라이더 안에 또 글라이더 구현하는법아시는분 있나요 [7] 맥콜(124.61) 09.12.12 63 0
162074 다렉트쇼 관련해서 질문있어 횽들'ㅅ' Karl(121.64) 09.12.12 20 0
162073 html5에서 html하고 js만 가지고 게시판 만들수 있다고?? [7] 카이신갤로그로 이동합니다. 09.12.12 99 0
162072 드디어 알고 프로젝트를 끝냈어 [2] URA!갤로그로 이동합니다. 09.12.12 61 0
162069 맥콜횽 봄미다 [7] algo갤로그로 이동합니다. 09.12.12 74 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2