디시인사이드 갤러리

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

갤러리 본문 영역

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

∫ 2t dt=t²+c갤로그로 이동합니다. 2009.12.06 14:33:25
조회 397 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 공개연애가 득보다 실인 것 같은 스타는? 운영자 25/10/06 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47807 65
2895283 '속보' 신지 예비남편이랑 파혼하네요ㄷㄷ.. 프갤러(58.123) 01:26 0 0
2895280 'ㅎㅂ) 벗방 시작한 강 인 경 프갤러(58.123) 01:19 3 0
2895279 '19) 여캠 합방 수위 레전드.gif ㅇㅇ(175.208) 01:18 4 0
2895278 '김종국 신부 인스타 떴네요! 프갤러(58.123) 01:16 5 0
2895277 '19) 여캠 합방 수위 레전드.gif ㅇㅇ(175.208) 01:14 5 0
2895276 '속보' 신지 예비남편이랑 파혼하네요ㄷㄷ.. 프갤러(58.123) 01:11 7 0
2895274 'ㅎㅂ) 벗방 시작한 강 인 경 프갤러(58.123) 01:05 5 0
2895273 '김종국 신부 인스타 떴네요! 프갤러(58.123) 01:01 8 0
2895266 ㅆㅇㅆ님 갤북5프로 200만원짜리 사는거보다 프갤러(223.38) 10.10 26 0
2895264 당근에 소주한잔하자해서 만나면 무슨얘기함 ㅇㅅㅇ?? [1] ㅇㅇ(223.38) 10.10 22 0
2895254 "'검찰 마약수사 직무유기' 배후는 누구였나, 특검으로 규명해야" 발명도둑잡기(39.7) 10.10 12 0
2895251 오픈챝이나 당근에서 사람만나는거 비상식적인 방법임?? [1] ㅇㅇ(223.38) 10.10 32 0
2895245 혁거세 많이 파네 chironpractor갤로그로 이동합니다. 10.10 45 0
2895242 진보당 정책대토론회 발명도둑잡기(118.235) 10.10 14 0
2895239 나님 주무시기전 소통합니당⭐+ 질문 받음 [6] ♥덩냥이♥갤로그로 이동합니다. 10.10 54 0
2895237 [단독]‘양평 고속도로 특혜 변경’ 의혹 국토부 서기관, 뇌물 받고 8억 [1] 발명도둑잡기(39.7) 10.10 33 0
2895235 끙야하면 바루 자야징 [1] ♥덩냥이♥갤로그로 이동합니다. 10.10 35 0
2895234 추석에 OP 반값에 간 썰 ㅇㅇ(118.235) 10.10 22 0
2895231 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.10 23 0
2895224 양당제 만드는 선거제도를 안고치면 미국처럼 내전난다 [1] 발명도둑잡기(118.235) 10.10 22 0
2895223 핸들 인형 삿음 [2] 야옹아저씨갤로그로 이동합니다. 10.10 40 0
2895222 아오시발 한국 오자마자 모기 보네 류류(110.70) 10.10 20 0
2895221 찢두순 압도적 효능감 미춋당⭐ ♥덩냥이♥갤로그로 이동합니다. 10.10 25 0
2895220 내 글 왜 짜름? 프갤러(222.121) 10.10 22 0
2895218 햄버거에 눅눅한 양파 = 음식물쓰레기 ♥덩냥이♥갤로그로 이동합니다. 10.10 29 0
2895216 찢두순 vs 좌청래 내전반발 찢두순 극대노? ♥덩냥이♥갤로그로 이동합니다. 10.10 19 0
2895213 극좌무능 찢두순 관세협상 대참사 때문에 벌써 국민세금 3.4조 증발 ♥덩냥이♥갤로그로 이동합니다. 10.10 26 0
2895210 북괴정은의 탈모전개 [2] ♥덩냥이♥갤로그로 이동합니다. 10.10 35 0
2895209 극좌단체 민노총 선거범죄 [2] ♥덩냥이♥갤로그로 이동합니다. 10.10 30 0
2895207 흠.. 나님 칼럼쓰고 싶은데 체력이 애매하넹 [1] ♥덩냥이♥갤로그로 이동합니다. 10.10 37 0
2895205 냥덩이 ㅂㅅ 새끼 또 가짜뉴스 발명도둑잡기(211.246) 10.10 22 0
2895204 프갤이랑 뉴프로랑 글리젠 비슷하군요 헬마스터갤로그로 이동합니다. 10.10 27 0
2895203 ■요즘 신입 대세포폴이 뭐에요? [1] ㅇㅇ갤로그로 이동합니다. 10.10 53 0
2895202 칼집에서 검 뽑는거 루도그담당(58.239) 10.10 34 0
2895201 대재명 찬양자들 이재명 까기 바쁘군 ㅋㅋ [1] 나르시갤로그로 이동합니다. 10.10 32 1
2895200 같은말을 해도 목적에 따라 달라짐 ♥덩냥이♥갤로그로 이동합니다. 10.10 35 0
2895198 이재명 때문에 친중공산국가로 찍힌듯;; 한국여권가치 39위 수직하락 [1] ♥덩냥이♥갤로그로 이동합니다. 10.10 61 0
2895196 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.10 36 0
2895195 스프링 jpa 고수분들 질문드립니다 [1] 프갤러(219.255) 10.10 44 0
2895194 네카라쿠배 신입 합격자 평균 스펙이 어느정도임? [2] 프갤러(118.235) 10.10 59 0
2895193 C언어가 근본인 이유 [2] ㅇㅇ갤로그로 이동합니다. 10.10 76 0
2895192 지진 나기전에 출국 했음 ㅅㄱ [2] 류류(61.218) 10.10 50 0
2895191 이재명이 대통령된 후로 공산주의 같은 정책을 못 펼치는구나 ㅎㅎ [1] 나르시갤로그로 이동합니다. 10.10 47 0
2895190 현 정부 경제 정책을 시스템 아키텍처 관점에서 보니 드는 생각 [2] 나르시갤로그로 이동합니다. 10.10 75 1
2895189 주가, 환율 착시 효과 나르시갤로그로 이동합니다. 10.10 49 0
2895188 일본 지진때문에 정상화 당하고 있네 [3] 루도그담당(58.239) 10.10 94 0
2895187 앱히키는 씨발놈임 프갤러(118.235) 10.10 33 0
2895185 자료구조를 직접 구현할 일은 별로 없긴 하지만 개념은 중요함 [4] 프갤러(223.39) 10.10 115 1
2895184 스프링 같은 씹좆좆쓰지말고 [2] 루도그담당(58.239) 10.10 73 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2